Imported Upstream version 2.3.3
authorDimitrios Eftaxiopoulos <eftaxi12@otenet.gr>
Sat, 18 Jul 2015 14:33:41 +0000 (17:33 +0300)
committerDimitrios Eftaxiopoulos <eftaxi12@otenet.gr>
Sat, 18 Jul 2015 14:33:41 +0000 (17:33 +0300)
169 files changed:
CMakeLists.txt
ChangeLog.txt
FindMathGL2.cmake
cmake-qt4.txt
cmake-qt5.txt
examples/CMakeLists.txt
examples/fltk_example.cpp
examples/full_test.cpp
examples/glut_example.cpp
examples/qgl_example.cpp [new file with mode: 0644]
examples/qgl_example.h [new file with mode: 0644]
examples/qt_example.cpp
examples/samples.cpp
examples/wnd_samples.cpp
fonts/CMakeLists.txt [new file with mode: 0644]
fonts/adventor.vfm [new file with mode: 0644]
fonts/adventor_b.vfm [new file with mode: 0644]
fonts/adventor_bi.vfm [new file with mode: 0644]
fonts/adventor_i.vfm [new file with mode: 0644]
fonts/bonum.vfm [new file with mode: 0644]
fonts/bonum_b.vfm [new file with mode: 0644]
fonts/bonum_bi.vfm [new file with mode: 0644]
fonts/bonum_i.vfm [new file with mode: 0644]
fonts/chorus.vfm [new file with mode: 0644]
fonts/cursor.vfm [new file with mode: 0644]
fonts/cursor_b.vfm [new file with mode: 0644]
fonts/cursor_bi.vfm [new file with mode: 0644]
fonts/cursor_i.vfm [new file with mode: 0644]
fonts/heros.vfm [new file with mode: 0644]
fonts/heros_b.vfm [new file with mode: 0644]
fonts/heros_bi.vfm [new file with mode: 0644]
fonts/heros_i.vfm [new file with mode: 0644]
fonts/heroscn.vfm [new file with mode: 0644]
fonts/heroscn_b.vfm [new file with mode: 0644]
fonts/heroscn_bi.vfm [new file with mode: 0644]
fonts/heroscn_i.vfm [new file with mode: 0644]
fonts/pagella.vfm [new file with mode: 0644]
fonts/pagella_b.vfm [new file with mode: 0644]
fonts/pagella_bi.vfm [new file with mode: 0644]
fonts/pagella_i.vfm [new file with mode: 0644]
fonts/schola.vfm [new file with mode: 0644]
fonts/schola_b.vfm [new file with mode: 0644]
fonts/schola_bi.vfm [new file with mode: 0644]
fonts/schola_i.vfm [new file with mode: 0644]
fonts/termes.vfm [new file with mode: 0644]
fonts/termes_b.vfm [new file with mode: 0644]
fonts/termes_bi.vfm [new file with mode: 0644]
fonts/termes_i.vfm [new file with mode: 0644]
include/config.h.in
include/mgl2/abstract.h
include/mgl2/addon.h
include/mgl2/base.h
include/mgl2/base_cf.h
include/mgl2/canvas.h
include/mgl2/canvas_cf.h
include/mgl2/cont.h
include/mgl2/data.h
include/mgl2/data_cf.h
include/mgl2/datac.h
include/mgl2/datac_cf.h
include/mgl2/define.h
include/mgl2/fit.h
include/mgl2/font.h
include/mgl2/mgl.h
include/mgl2/mgl_pas.pas
include/mgl2/opengl.h
include/mgl2/other.h
include/mgl2/parser.h
include/mgl2/plot.h
include/mgl2/prim.h
include/mgl2/qmathgl.h
include/mgl2/surf.h
include/mgl2/type.h
include/mgl2/vect.h
include/mgl2/volume.h
json/main.js
json/mathgl.Backend.js
json/mathgl.Graph.js
json/mathgl.View.js
json/mathgl.WebkitBackend.js
mgltex/CMakeLists.txt
mgltex/mgltex.sty
mgltex/sample.tex
src/CMakeLists.txt
src/addon.cpp
src/axis.cpp
src/base.cpp
src/base_cf.cpp
src/canvas.cpp
src/canvas_cf.cpp
src/complex.cpp
src/complex_ex.cpp
src/complex_io.cpp
src/cont.cpp
src/cont.hpp
src/crust.cpp
src/data.cpp
src/data_ex.cpp
src/data_gr.cpp
src/data_io.cpp
src/data_png.cpp
src/def_font.cc [new file with mode: 0644]
src/def_font.cpp [deleted file]
src/eval.cpp
src/evalc.cpp
src/evalp.cpp
src/exec.cpp
src/export_2d.cpp
src/export_3d.cpp
src/fft.cpp
src/fit.cpp
src/font.cpp
src/opengl.cpp
src/parser.cpp
src/pde.cpp
src/pixel.cpp
src/plot.cpp
src/prim.cpp
src/surf.cpp
src/tex_table.cc [new file with mode: 0644]
src/tex_table.cpp [deleted file]
src/vect.cpp
src/volume.cpp
texinfo/CMakeLists.txt
texinfo/concept_en.texi
texinfo/concept_ru.texi
texinfo/core_en.texi
texinfo/core_ru.texi
texinfo/data_en.texi
texinfo/data_ru.texi
texinfo/doc_en.texi
texinfo/doc_ru.texi
texinfo/ex_mgl_en.texi
texinfo/ex_mgl_ru.texi
texinfo/example_en.texi
texinfo/example_ru.texi
texinfo/mathgl.js
texinfo/parse_en.texi
texinfo/parse_ru.texi
texinfo/symbols_en.texi
texinfo/symbols_ru.texi
texinfo/version.texi [deleted file]
texinfo/version.texi.in [new file with mode: 0644]
texinfo/web_en.texi
texinfo/web_ru.texi
todo.txt
udav/CMakeLists.txt
udav/calc_dlg.cpp
udav/dat_pnl.cpp
udav/help_pnl.cpp
udav/mem_pnl.cpp
udav/mem_pnl.h
udav/mgl.xml [deleted file]
udav/mgl.xml.in [new file with mode: 0644]
udav/open_dlg.cpp
udav/plot_pnl.cpp
udav/style_dlg.cpp
udav/subplot_dlg.cpp
udav/text_pnl.cpp
udav/textedit.h
udav/udav_wnd.cpp
utils/CMakeLists.txt
utils/make_bin.cpp [new file with mode: 0644]
utils/make_pas.cpp
utils/mglconv.cpp
utils/mglview.cpp
widgets/fltk.cpp
widgets/glut.cpp
widgets/qt.cpp

index b369da1f51651652c0aae167e3c78c17eff84849..2aae3347299e56337f7769cdc679643bf2f60880 100644 (file)
@@ -11,8 +11,8 @@ if(NOT CMAKE_BUILD_TYPE)
 endif(NOT CMAKE_BUILD_TYPE)
 
 set(CMAKE_VERBOSE_MAKEFILE ON)
-#set(MathGL_VERSION_MAJOR 2)
-#set(MathGL_VERSION_MINOR 2.2)
+set(MathGL_VERSION_MAJOR 2)
+set(MathGL_VERSION_MINOR 3.3)
 set(MathGL_SOVERSION 7.4.0)
 
 
@@ -60,6 +60,7 @@ ENDMACRO(MGL_DEPENDENT_OPTION)
 include(CMakeDependentOption)
 
 set(MGL_LIB_INSTALL_DIR "lib" CACHE STRING "Set library install directory")
+string(TIMESTAMP MGL_NIGHT "%d.%m.%y")
 
 option(enable-double "Enable double precision in MathGL library" ON)
 option(enable-mpi "Enable mpi")
@@ -133,9 +134,8 @@ if(NOT WIN32)
        set(MGL_MAN_PATH "${CMAKE_INSTALL_PREFIX}/share/man")
        set(MGL_INFO_PATH "${CMAKE_INSTALL_PREFIX}/share/info")
        set(MGL_FONT_PATH "${MGL_DATA_PATH}/fonts")
-       install(DIRECTORY fonts/ DESTINATION ${MGL_FONT_PATH}
-                       PATTERN ".svn" EXCLUDE
-                       PATTERN "*.vfm")
+else(NOT WIN32)
+       set(MGL_FONT_PATH "${CMAKE_INSTALL_PREFIX}/fonts")
 endif(NOT WIN32)
 
 include(CheckFunctionExists)
@@ -164,7 +164,11 @@ if(HAVE_MEMRCHR)
        ADD_DEFINITIONS(-DHAVE_MEMRCHR)
 endif(HAVE_MEMRCHR)
 
+include(CheckTypeSize)
+check_type_size("long" SIZEOF_LONG)
+
 include(CheckCXXSourceCompiles)
+unset(MGL_HAVE_C99_COMPLEX)
 CHECK_CXX_SOURCE_COMPILES(
 "#include <complex>
 #include <complex.h>
@@ -175,12 +179,16 @@ std::complex<double> b(*a);return 0;}" MGL_HAVE_C99_COMPLEX)
 if(NOT MGL_HAVE_C99_COMPLEX)
        set(MGL_HAVE_C99_COMPLEX 0)
 endif(NOT MGL_HAVE_C99_COMPLEX)
+
+unset(MGL_HAVE_NAN_INF)
 CHECK_CXX_SOURCE_COMPILES(
 "#include <math.h>
 int main(){double a=NAN, b=INFINITY;return 0;}" MGL_HAVE_NAN_INF)
 if(NOT MGL_HAVE_NAN_INF)
        set(MGL_HAVE_NAN_INF 0)
 endif(NOT MGL_HAVE_NAN_INF)
+
+unset(MGL_HAVE_ATTRIBUTE)
 CHECK_CXX_SOURCE_COMPILES(
 "int __attribute__((pure)) test1() {return 0;}
 int __attribute__((const)) test2(int x) {return x*x;}
@@ -188,6 +196,8 @@ int main(int argc, char* argv[]) {return 0;}" MGL_HAVE_ATTRIBUTE)
 if(NOT MGL_HAVE_ATTRIBUTE)
        set(MGL_HAVE_ATTRIBUTE 0)
 endif(NOT MGL_HAVE_ATTRIBUTE)
+
+unset(MGL_HAVE_TYPEOF)
 CHECK_CXX_SOURCE_COMPILES(
 "#define mgl_isnum(a)  ({typeof (a) _a = (a); _a==_a;})
 int main(){bool a=mgl_isnum(1);return 0;}" MGL_HAVE_TYPEOF)
@@ -195,7 +205,7 @@ if(NOT MGL_HAVE_TYPEOF)
        set(MGL_HAVE_TYPEOF 0)
 endif(NOT MGL_HAVE_TYPEOF)
 
-#unset(MGL_HAVE_C99_COMPLEX)
+unset(MGL_HAVE_RVAL)
 CHECK_CXX_SOURCE_COMPILES(
 "struct test { test() {} test(test&& a){} };
 int main() { test t;   return 0; }" MGL_HAVE_RVAL)
@@ -505,6 +515,7 @@ if(NOT enable-lgpl)
        endif(enable-python OR enable-lua OR enable-octave)
        if(NOT MSVC AND NOT BORLAND)
                add_subdirectory( utils )
+               add_subdirectory( fonts )
        endif(NOT MSVC AND NOT BORLAND)
 #      add_subdirectory( mgllab )
 endif(NOT enable-lgpl)
@@ -521,3 +532,9 @@ endif(NOT MSVC AND NOT BORLAND)
 if(enable-mgltex)
        add_subdirectory( mgltex )
 endif(enable-mgltex)
+
+if(WIN32)
+       install(FILES ${CMAKE_SOURCE_DIR}/FindMathGL2.cmake DESTINATION ${CMAKE_INSTALL_PREFIX} RENAME mathgl2-config.cmake)
+else(WIN32)
+       install(FILES ${CMAKE_SOURCE_DIR}/FindMathGL2.cmake DESTINATION ${MGL_LIB_INSTALL_DIR}/cmake/mathgl2/ RENAME mathgl2-config.cmake)
+endif(WIN32)
index 716ad27e11fb2f5b0864cd0e1801c4df170ef05f..3add6371b8971b13e36ecf61b7bd0148cd657317 100644 (file)
@@ -1,9 +1,44 @@
+2.3.3 Released 01 June 2015
+
+* Add SurfCA() and Surf3CA() plots
+* Add wavelet transforms
+* Add AttachLight() for attaching light settings to inplots
+* Add manual rotation angle for axis ticks (by "value" option)
+* Add mglDataS class which is similar to std::vector<double> one.
+* Add missing mglDataC functions
+
+* Add style '%' for color scheme along 2 coordinates (as in Map())
+* If tick template start with '&' then long integer is passed instead of double.
+* Add style 'V' for drawing text centered vertically.
+* Add style "dN" in Smooth() for averaging over (2*N+1)-th points.
+* Add TeX symbols "\quote", "--" and Cyrillic ones.
+
+* Add complex numbers in MGL -- any expression started with '!' will have complex value(s)
+* Add 'rkstep' command for Runge-Kutta step in MGL script
+* Add functions 'min()', 'max()' to MGL parser and formula evaluation.
+* MGL command 'join' now can join arbitrary number of data arrays.
+* Command 'stop' is not required to be placed before 'func'
+* Add warning about writing to temporary arrays in MGL scripts
+* Names 'rnd','nan','inf' are reserved in MGL scripts now.
+
+* Add annotation for plot styles and options into header files.
+* Greatly improve the speed of formula parsing for MGL scripts
+* Update JS interface
+* Add binary font files for speeding up initialization and font loading
+* Exclude "pure" attribute for function due to compatibility reasons
+* Add mgl_set_size_scl() for additional scaling width and height of the image
+* Add options -S, -q for mglconv
+* Rearrange toolbuttons in UDAV.
+* Bugfix for Flow() and Pipe() functions
+* Other minor improvements, bugfixes and compatibility changes
+
 2.3.2 Released 2 February 2015
 
 * Update mgltex (thanks to Diego Sejas Viscarra)
 * Add reading files with complex numbers by 'read' command.
 * Parallelize reading textual data files.
 * Add 'i','j','k' variables for data filling.
+* Add 2-color style for candle and ohlc plot.
 * Add saving images in QMathGL even if corresponding format support is disabled.
 * Add cmake option MGL_DEF_FONT to change default font name or use built-in one (if MGL_DEF_FONT is empty).
 * Compatibility changes and bugfixes.
index 43b864054c5f6294174424591e3266ae0a4f96cd..ec5ba2dfa5287476054b3c6384a40401a0ada1f1 100644 (file)
 #
 # The minimum required version and needed components can be specified using
 # the standard find_package()-syntax, here are some examples:
-#  find_package(MathGL 2.1 Qt REQUIRED) - 2.1 + Qt interface, required
-#  find_package(MathGL 2.1 REQUIRED)    - 2.1 (no interfaces), required
-#  find_package(MathGL 2.0 Qt WX)       - 2.0 + Qt and WX interfaces, optional
-#  find_package(MathGL 2.1)             - 2.1 (no interfaces), optional
+#  find_package(MathGL2 REQUIRED)                              - v.2.* (no interfaces), required
+#  find_package(MathGL2 2.1 REQUIRED Qt)               - v.2.1 + Qt interface, required
+#  find_package(MathGL2 2.1 REQUIRED)                  - v.2.1 (no interfaces), required
+#  find_package(MathGL2 2.0 COMPONENTS Qt WX)  - v.2.0 + Qt and WX interfaces, optional
+#  find_package(MathGL2 2.1)                                   - v.2.1 (no interfaces), optional
+#
+# Note, some cmake builds require to write "COMPONENTS" always, like
+#  find_package(MathGL2 REQUIRED COMPONENTS Qt)        - v.2.* + Qt interface, required
 #
 # Typical usage could be something like this:
 #   find_package(MathGL 2.1 GLUT REQUIRED)
@@ -69,11 +73,39 @@ IF(MATHGL2_INCLUDE_DIR)
                        SET(MATHGL2_VERSION_STRING 2.${MATHGL2_VERSION_STRING})
 #                      MESSAGE(STATUS "Find MathGL version -- ${MATHGL2_VERSION_STRING}")
                ELSE()
-                       MESSAGE(FATAL_ERROR "${_VERSION_ERR}: ${_CONFIG_FILE_PATH} parse error")
+                       SET(_ERR_MESSAGE "${_VERSION_ERR}: ${_CONFIG_FILE_PATH} parse error")
                ENDIF()
        ELSE()
-               MESSAGE(FATAL_ERROR "${_VERSION_ERR}: ${_CONFIG_FILE_PATH} not found")
+               SET(_ERR_MESSAGE "${_VERSION_ERR}: ${_CONFIG_FILE_PATH} not found")
        ENDIF()
+       IF(_ERR_MESSAGE)
+               UNSET(_ERR_MESSAGE)
+               SET(_CONFIG_FILE_PATH "${MATHGL2_INCLUDE_DIR}/mgl2/config.h")
+               SET(_VERSION_ERR "Cannot determine MathGL v.2.* version")
+               IF(EXISTS "${_CONFIG_FILE_PATH}")
+                       FILE(STRINGS "${_CONFIG_FILE_PATH}"
+                               MATHGL2_VERSION_STRING REGEX "^#define MGL_VER2.*$")
+                       IF(MATHGL2_VERSION_STRING)
+                               STRING(REGEX
+                                       REPLACE "#define MGL_VER2" ""
+                                       MATHGL2_VERSION_STRING ${MATHGL2_VERSION_STRING})
+                               STRING(REGEX
+                                       REPLACE "//.*" ""
+                                       MATHGL2_VERSION_STRING ${MATHGL2_VERSION_STRING})
+                               STRING(STRIP ${MATHGL2_VERSION_STRING} MATHGL2_VERSION_STRING)
+                               SET(MATHGL2_VERSION_STRING 2.${MATHGL2_VERSION_STRING})
+       #                       MESSAGE(STATUS "Find MathGL version -- ${MATHGL2_VERSION_STRING}")
+                       ELSE()
+                               SET(_ERR_MESSAGE "${_VERSION_ERR}: ${_CONFIG_FILE_PATH} parse error")
+                       ENDIF()
+               ELSE()
+                       SET(_ERR_MESSAGE "${_VERSION_ERR}: ${_CONFIG_FILE_PATH} not found")
+               ENDIF()
+       ENDIF(_ERR_MESSAGE)
+
+       if(_ERR_MESSAGE)
+               MESSAGE(FATAL_ERROR ${_ERR_MESSAGE})
+       endif(_ERR_MESSAGE)
 ENDIF()
 
 INCLUDE(FindPackageHandleStandardArgs)
@@ -84,10 +116,10 @@ FIND_PACKAGE_HANDLE_STANDARD_ARGS(MathGL2
 FOREACH(_Component ${MathGL2_FIND_COMPONENTS})
        STRING(TOLOWER ${_Component} _component)
        STRING(TOUPPER ${_Component} _COMPONENT)
-       
+
        SET(MathGL2_${_Component}_FIND_REQUIRED ${MathGL2_FIND_REQUIRED})
        SET(MathGL2_${_Component}_FIND_QUIETLY true)
-       
+       # TODO find qt.h for qt4 and qt5 !!!
        FIND_PATH(MATHGL2_${_COMPONENT}_INCLUDE_DIR
                                NAMES mgl2/${_component}.h
                                PATHS ${MATHGL2_INCLUDE_DIR} NO_DEFAULT_PATH)
@@ -98,7 +130,7 @@ FOREACH(_Component ${MathGL2_FIND_COMPONENTS})
        FIND_PACKAGE_HANDLE_STANDARD_ARGS(MathGL2_${_Component} DEFAULT_MSG
                                                                                MATHGL2_${_COMPONENT}_LIBRARY
                                                                                MATHGL2_${_COMPONENT}_INCLUDE_DIR)
-       
+
        IF(MATHGL2_${_COMPONENT}_FOUND)
                SET(MATHGL2_LIBRARIES
                        ${MATHGL2_LIBRARIES} ${MATHGL2_${_COMPONENT}_LIBRARY})
index 462e1f8e1102ff8a039921e27778640051652604..a5d389eb796b1a7eaff3943d37e51848f483196d 100644 (file)
@@ -1,8 +1,8 @@
 set(MGL_HAVE_QT4 1)
 if(enable-json-sample)
-FIND_PACKAGE(Qt4 4.8 REQUIRED QtCore QtGui QtNetwork QtWebKit)
+FIND_PACKAGE(Qt4 4.8 REQUIRED QtCore QtGui QtNetwork QtWebKit QtOpenGL)
 else(enable-json-sample)
-FIND_PACKAGE(Qt4 4.8 REQUIRED QtCore QtGui)
+FIND_PACKAGE(Qt4 4.8 REQUIRED QtCore QtGui QtOpenGL)
 endif(enable-json-sample)
 if(NOT QT4_FOUND)
        message(SEND_ERROR "Couldn't find Qt4 library.")
index 49caf217e771219269bc750d47a4d934bd240085..c4b5bbf2824ee58b71f3acee345c15d13d1da01b 100644 (file)
@@ -3,6 +3,10 @@ find_package(Qt5Core REQUIRED)
 find_package(Qt5Widgets REQUIRED)
 find_package(Qt5Gui REQUIRED)
 find_package(Qt5PrintSupport REQUIRED)
+find_package(Qt5OpenGL REQUIRED)
+if(NOT Qt5OpenGL_FOUND)
+       message(SEND_ERROR "Couldn't find Qt5 OpenGL library.")
+endif(NOT Qt5OpenGL_FOUND)
 if(NOT Qt5Core_FOUND)
        message(SEND_ERROR "Couldn't find Qt5 Core library.")
 endif(NOT Qt5Core_FOUND)
index 74ac689812b0fe57f9147cf793bac7e74b8cc1f7..517162dc12eacbc7c122f6944e9004142ce82bf3 100644 (file)
@@ -27,10 +27,21 @@ if(enable-qt)
        if(enable-qt5)
                include(../cmake-qt5.txt)
                target_link_libraries(mgl_qt_example mgl-qt5)
+               qt5_wrap_cpp(qgl_moc_src qgl_example.h )
        else(enable-qt5)
                include(../cmake-qt4.txt)
                target_link_libraries(mgl_qt_example mgl-qt4)
+               qt4_wrap_cpp(qgl_moc_src qgl_example.h )
        endif(enable-qt5)
+       add_executable(mgl_qgl_example wnd_samples.cpp qgl_example.cpp ${qgl_moc_src} ${MGL_MOC_EX_FILES})
+       if(enable-qt5)
+               target_link_libraries(mgl_qgl_example mgl)
+               qt5_use_modules(mgl_qgl_example Core Widgets Gui OpenGL)
+       else(enable-qt5)
+               target_link_libraries(mgl_qgl_example mgl)
+               target_link_libraries(mgl_qgl_example ${QT_LIBRARIES})
+       endif(enable-qt5)
+
 endif(enable-qt)
 
 if(MGL_HAVE_LTDL)
index 646373a5fdfb58f3b1da35859bb624a2ded827fc..e4a8013f9d904fbc035abbf69c53d2386d654b94 100644 (file)
@@ -41,7 +41,7 @@ void *calc(void *)
        for(int i=0;i<10;i++)           // do calculation\r
        {\r
                long_calculations();    // which can be very long\r
-               pnt = mglPoint(2*mgl_rnd()-1,2*mgl_rnd()-1);\r
+               pnt.Set(2*mgl_rnd()-1,2*mgl_rnd()-1);\r
                if(gr)\r
                {\r
                        gr->Clf();                      // make new drawing\r
@@ -70,7 +70,7 @@ int main(int argc,char **argv)
        for(int i=0;i<10;i++)   // do calculation\r
        {\r
                long_calculations();// which can be very long\r
-               pnt = mglPoint(2*mgl_rnd()-1,2*mgl_rnd()-1);\r
+               pnt.Set(2*mgl_rnd()-1,2*mgl_rnd()-1);\r
                gr.Clf();                       // make new drawing\r
                gr.Line(mglPoint(),pnt,"Ar2");\r
                char str[10] = "i=0";   str[3] = '0'+i;\r
index 4f2a46532b3c6e3feb4ac5dfb2a2251d9dd9c580..d34f80a416244f398880b3ed2e870c2d842c8df6 100644 (file)
@@ -25,6 +25,7 @@
 #endif\r
 \r
 #include "mgl2/mgl.h"\r
+#include "mgl2/font.h"\r
 #include "mgl2/eval.h"\r
 //-----------------------------------------------------------------------------\r
 void mgl_create_cpp_font(HMGL gr, const wchar_t *how);\r
@@ -64,6 +65,12 @@ void mgls_prepare3v(mglData *ex, mglData *ey, mglData *ez);
 void save(mglGraph *gr,const char *name,const char *suf);\r
 void test(mglGraph *gr)\r
 {\r
+       gr->Line(mglPoint(-1,-1),mglPoint(1,1));\r
+       gr->Axis();\r
+       gr->WriteEPS("1.eps");\r
+       gr->WriteTEX("1.tex");\r
+       gr->WriteSVG("1.svg");\r
+       return;\r
        mglParse par;\r
        par.Execute(gr,"load '/home/balakin/mathgl-code/mathgl-2x/build/examples/libmgl_module.so':baxis\n");\r
 //     par.Execute(gr,"subplot 1 1 0:#rotate 40 60\nperspective 1.22:box:axis\n");\r
@@ -103,6 +110,7 @@ static struct option longopts[] =
        { "font",       no_argument,    &dotest,        2 },\r
        { "time",       no_argument,    &dotest,        3 },\r
        { "fexport",no_argument,        &dotest,        4 },\r
+       { "textbl",     no_argument,    &dotest,        5 },\r
        { "thread",     required_argument,      NULL,   't' },\r
        { "verbose",no_argument,        &verbose,       1 },\r
        { "width",      required_argument,      NULL,   'w' },\r
@@ -370,6 +378,15 @@ void smgl_fexport(mglGraph *gr)    // test file export
        gr->ImportMGLD("fexport.mgld");\r
 }\r
 //-----------------------------------------------------------------------------\r
+extern mglTeXsymb mgl_tex_symb[];\r
+extern long mgl_tex_num;\r
+int MGL_LOCAL_PURE mgl_tex_symb_cmp(const void *a, const void *b)\r
+{\r
+       const mglTeXsymb *aa = (const mglTeXsymb *)a;\r
+       const mglTeXsymb *bb = (const mglTeXsymb *)b;\r
+       return wcscmp(aa->tex, bb->tex);\r
+}\r
+//-----------------------------------------------------------------------------\r
 int main(int argc,char **argv)\r
 {\r
        mgl_suppress_warn(true);\r
@@ -431,8 +448,6 @@ int main(int argc,char **argv)
 \r
        {       mgl_create_cpp_font(gr->Self(), L"!-~,¡-ÿ,̀-̏,Α-ω,ϑ,ϕ,ϖ,ϰ,ϱ,ϵ,А-я,ℏ,ℑ,ℓ,ℜ,←-↙,∀-∯,≠-≯,⟂");\r
                delete gr;      return 0;       }\r
-       else if(dotest==4)\r
-       {       smgl_fexport(gr);       delete gr;      return 0;       }\r
        else if(dotest==3)\r
        {\r
                int qual[7]={0,1,2,4,5,6,8};\r
@@ -468,6 +483,20 @@ int main(int argc,char **argv)
                }\r
                fprintf(fp,"\n@end multitable\n");      fclose(fp);\r
        }\r
+       else if(dotest==4)\r
+       {       smgl_fexport(gr);       delete gr;      return 0;       }\r
+       else if(dotest==5)\r
+       {\r
+               size_t i=0;     while(mgl_tex_symb[i].tex[0])   i++;\r
+               if(mgl_tex_num!=i)      printf("real=%lu, set=%ld\n",i,mgl_tex_num);\r
+               for(size_t i=0;mgl_tex_symb[i].tex[0];i++)\r
+               {\r
+                               mglTeXsymb tst, *rts;   tst.tex = mgl_tex_symb[i].tex;\r
+                               rts = (mglTeXsymb *) bsearch(&tst, mgl_tex_symb, mgl_tex_num, sizeof(mglTeXsymb), mgl_tex_symb_cmp);\r
+                               if(!rts)        printf("Bad '%ls' at %lu\n",mgl_tex_symb[i].tex,i);\r
+               }\r
+               delete gr;      return 0;\r
+       }\r
 \r
        if(type==15 || type==16)        big=3;  // save mini version for json\r
 \r
@@ -485,7 +514,7 @@ int main(int argc,char **argv)
                                setlocale(LC_CTYPE, "");\r
                                char *buf = new char[strlen(s->mgl)+strlen(mmgl_dat_prepare)+1];\r
                                strcpy(buf,s->mgl);             strcat(buf,mmgl_dat_prepare);\r
-                               printf("\n-------\n%s\n-------\n",verbose?buf:s->mgl);\r
+                               if(type!=7)     printf("\n-------\n%s\n-------\n",verbose?buf:s->mgl);\r
                                par.Execute(gr,buf);    delete []buf;\r
                                const char *mess = gr->Message();\r
                                if(*mess)       printf("Warnings: %s\n-------\n",mess);\r
@@ -512,7 +541,7 @@ int main(int argc,char **argv)
                                setlocale(LC_CTYPE, "");\r
                                char *buf = new char[strlen(s->mgl)+strlen(mmgl_dat_prepare)+1];\r
                                strcpy(buf,s->mgl);             strcat(buf,mmgl_dat_prepare);\r
-                               printf("\n-------\n%s\n-------\n",verbose?buf:s->mgl);\r
+                               if(type!=7)     printf("\n-------\n%s\n-------\n",verbose?buf:s->mgl);\r
                                par.Execute(gr,buf);    delete []buf;\r
                                const char *mess = gr->Message();\r
                                if(*mess)       printf("Warnings: %s\n-------\n",mess);\r
index 077c480b0c4b06e4adb73ce59f4745858ab77890..1ae89b67bf1fbb6614a814ce15e254c224191bca 100644 (file)
@@ -41,7 +41,7 @@ void *calc(void *)
        for(int i=0;i<10;i++)   // do calculation\r
        {\r
                sleep(1);           // which can be very long\r
-               pnt = mglPoint(2*mgl_rnd()-1,2*mgl_rnd()-1);\r
+               pnt.Set(2*mgl_rnd()-1,2*mgl_rnd()-1);\r
 printf("i=%d, gr=%p\n",i,gr);  fflush(stdout);\r
                if(gr)\r
                {\r
diff --git a/examples/qgl_example.cpp b/examples/qgl_example.cpp
new file mode 100644 (file)
index 0000000..c606a3a
--- /dev/null
@@ -0,0 +1,61 @@
+/***************************************************************************
+ * qt_example.cpp is part of Math Graphic Library
+ * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+#include "qgl_example.h"
+#include <QApplication>
+//-----------------------------------------------------------------------------
+int main(int argc, char *argv[])
+{
+       QApplication a(argc, argv);
+       MainWindow w;
+       w.show();
+       return a.exec();
+}
+//-----------------------------------------------------------------------------
+MainWindow::MainWindow(QWidget *parent) : QGLWidget(parent)    {       gr=0;   }
+//-----------------------------------------------------------------------------
+MainWindow::~MainWindow()      {       if(gr)  delete gr;      }
+//-----------------------------------------------------------------------------
+void MainWindow::initializeGL()
+{
+       if(gr)  delete gr;
+       gr = new mglGraph(1);
+}
+//-----------------------------------------------------------------------------
+void MainWindow::paintGL()
+{
+       gr->Clf();
+       gr->Rotate(40,5);
+       gr->Light(true);
+       gr->AddLight(0,mglPoint(0,0,10),mglPoint(0,0,-1));
+       gr->Axis();
+       gr->Box();
+       gr->FPlot("sin(pi*x)","i2");
+       gr->FPlot("cos(pi*x)","|");
+       gr->FSurf("cos(2*pi*(x^2+y^2))");
+       gr->Finish();
+       swapBuffers();
+}
+//-----------------------------------------------------------------------------
+void MainWindow::resizeGL(int w, int h)
+{
+       QGLWidget::resizeGL(w, h);
+       glViewport (0, 0, w, h);
+}
+//-----------------------------------------------------------------------------
diff --git a/examples/qgl_example.h b/examples/qgl_example.h
new file mode 100644 (file)
index 0000000..1d3ca0f
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+//#include <QMainWindow>
+#include <QGLWidget>
+#include <QtOpenGL>
+#include <mgl2/mgl.h>
+
+class MainWindow : public QGLWidget
+{
+       Q_OBJECT
+protected:
+       mglGraph *gr;
+       void resizeGL(int nWidth, int nHeight); // Метод вызываемый после каждого изменения размера окна
+       void paintGL(); // Метод для вывода изображения на экран
+void initializeGL(); // Метод для инициализирования opengl
+public:
+       MainWindow(QWidget *parent = 0);
+       ~MainWindow();
+};
+
+#endif // MAINWINDOW_H
index 58a7f9c9fabd91bb204e1a6dd4cab1d437f48e4e..5fd80e9efea011032f5dc4df05f3e4c48f408049 100644 (file)
@@ -41,7 +41,7 @@ void *calc(void *)
        for(int i=0;i<10;i++)   // do calculation\r
        {\r
                long_calculations();       // which can be very long\r
-               pnt = mglPoint(2*mgl_rnd()-1,2*mgl_rnd()-1);\r
+               pnt.Set(2*mgl_rnd()-1,2*mgl_rnd()-1);\r
                if(gr)\r
                {\r
                        gr->Clf();                      // make new drawing\r
@@ -75,7 +75,7 @@ void Foo::Calc()
        for(int i=0;i<30;i++)           // do calculation\r
        {\r
                long_calculations();    // which can be very long\r
-               pnt = mglPoint(2*mgl_rnd()-1,2*mgl_rnd()-1);\r
+               pnt.Set(2*mgl_rnd()-1,2*mgl_rnd()-1);\r
                Gr->Update();                   // update window\r
        }\r
 }\r
index c3a939b8c9886a9bcc10523d3a563b6db1b9ef8f..f023900b2695fb41dfb94b8927ea5f34450dd7f3 100644 (file)
@@ -557,18 +557,19 @@ void smgl_alpha(mglGraph *gr)     // alpha and lighting
        gr->Box();      gr->Light(false);       gr->Surf(a);
 }
 //-----------------------------------------------------------------------------
-const char *mmgl_schemes="call 'sch' 0 'kw'\ncall 'sch' 1 'wk'\ncall 'sch' 2 'kHCcw'\ncall 'sch' 3 'kBbcw'\n"
+const char *mmgl_schemes="new x 100 100 'x':new y 100 100 'y'\n"
+"call 'sch' 0 'kw'\ncall 'sch' 1 '%gbrw'\ncall 'sch' 2 'kHCcw'\ncall 'sch' 3 'kBbcw'\n"
 "call 'sch' 4 'kRryw'\ncall 'sch' 5 'kGgew'\ncall 'sch' 6 'BbwrR'\ncall 'sch' 7 'BbwgG'\n"
 "call 'sch' 8 'GgwmM'\ncall 'sch' 9 'UuwqR'\ncall 'sch' 10 'QqwcC'\ncall 'sch' 11 'CcwyY'\n"
 "call 'sch' 12 'bcwyr'\ncall 'sch' 13 'bwr'\ncall 'sch' 14 'wUrqy'\ncall 'sch' 15 'UbcyqR'\n"
 "call 'sch' 16 'BbcyrR'\ncall 'sch' 17 'bgr'\ncall 'sch' 18 'BbcyrR|'\ncall 'sch' 19 'b{g,0.3}r'\n"
-"stop\nfunc 'sch' 2\nsubplot 2 10 $1 '<>_^' 0.2 0:fsurf 'x' $2\n"
+"stop\nfunc 'sch' 2\nsubplot 2 10 $1 '<>_^' 0.2 0:surfa x y $2\n"
 "text 0.07+0.5*mod($1,2) 0.92-0.1*int($1/2) $2 'A'\nreturn";
 void smgl_schemes(mglGraph *gr)        // Color table
 {
-       mglData a(256,2);       a.Fill(-1,1);
+       mglData a(256,2), b(256,2);     a.Fill(-1,1);   b.Fill(-1,1,'y');
        gr->SubPlot(2,10,0,NULL,0.2);   gr->Dens(a,"kw");               gr->Puts(0.07, 0.92, "kw", "A");
-       gr->SubPlot(2,10,1,NULL,0.2);   gr->Dens(a,"wk");               gr->Puts(0.57, 0.92, "wk", "A");
+       gr->SubPlot(2,10,1,NULL,0.2);   gr->SurfA(a,b,"%gbrw"); gr->Puts(0.57, 0.92, "%gbrw", "A");
        gr->SubPlot(2,10,2,NULL,0.2);   gr->Dens(a,"kHCcw");    gr->Puts(0.07, 0.82, "kHCcw", "A");
        gr->SubPlot(2,10,3,NULL,0.2);   gr->Dens(a,"kBbcw");    gr->Puts(0.57, 0.82, "kBbcw", "A");
        gr->SubPlot(2,10,4,NULL,0.2);   gr->Dens(a,"kRryw");    gr->Puts(0.07, 0.72, "kRryw", "A");
@@ -928,8 +929,11 @@ void smgl_tens(mglGraph *gr)
 const char *mmgl_region="call 'prepare1d'\ncopy y1 y(:,1):copy y2 y(:,2)\n"
 "subplot 2 2 0 '':title 'Region plot (default)':box:region y1 y2:plot y1 'k2':plot y2 'k2'\n"
 "subplot 2 2 1 '':title '2 colors':box:region y1 y2 'yr':plot y1 'k2':plot y2 'k2'\n"
-"subplot 2 2 2 '':title '\"!\" style':box:region y1 y2 '!':plot y1 'k2':plot y2 'k2'\n"
-"subplot 2 2 3 '':title '\"i\" style':box:region y1 y2 'ir':plot y1 'k2':plot y2 'k2'";
+"subplot 2 2 2 '':title '\"i\" style':box:region y1 y2 'ir':plot y1 'k2':plot y2 'k2'\n"
+"subplot 2 2 3 '^_':title '3d variant':rotate 40 60:box\n"
+"new x1 100 'sin(pi*x)':new y1 100 'cos(pi*x)':new z 100 'x'\n"
+"new x2 100 'sin(pi*x+pi/3)':new y2 100 'cos(pi*x+pi/3)'\n"
+"plot x1 y1 z 'r2':plot x2 y2 z 'b2'\nregion x1 y1 z x2 y2 z 'cmy!'";
 void smgl_region(mglGraph *gr)
 {
        mglData y;      mgls_prepare1d(&y);
@@ -938,8 +942,13 @@ void smgl_region(mglGraph *gr)
        gr->Box();      gr->Region(y1,y2);      gr->Plot(y1,"k2");      gr->Plot(y2,"k2");
        if(big==3)      return;
        gr->SubPlot(2,2,1,"");  gr->Title("2 colors");  gr->Box();      gr->Region(y1,y2,"yr"); gr->Plot(y1,"k2");      gr->Plot(y2,"k2");
-       gr->SubPlot(2,2,2,"");  gr->Title("'!' style"); gr->Box();      gr->Region(y1,y2,"!");  gr->Plot(y1,"k2");      gr->Plot(y2,"k2");
-       gr->SubPlot(2,2,3,"");  gr->Title("'i' style"); gr->Box();      gr->Region(y1,y2,"ir"); gr->Plot(y1,"k2");      gr->Plot(y2,"k2");
+       gr->SubPlot(2,2,2,"");  gr->Title("'i' style"); gr->Box();      gr->Region(y1,y2,"ir"); gr->Plot(y1,"k2");      gr->Plot(y2,"k2");
+       gr->SubPlot(2,2,3,"^_");        gr->Title("3d variant");        gr->Rotate(40,60);      gr->Box();
+       gr->Fill(y1,"cos(pi*x)");       gr->Fill(y2,"cos(pi*x+pi/3)");
+       mglData x1(y1.nx), x2(y1.nx), z(y1.nx);
+       gr->Fill(x1,"sin(pi*x)");       gr->Fill(x2,"sin(pi*x+pi/3)");  gr->Fill(z,"x");
+       gr->Plot(x1,y1,z,"r2");         gr->Plot(x2,y2,z,"b2");
+       gr->Region(x1,y1,z,x2,y2,z,"cmy!");
 }
 //-----------------------------------------------------------------------------
 const char *mmgl_stem="call 'prepare1d'\norigin 0 0 0:subplot 2 2 0 '':title 'Stem plot (default)':box:stem y\n"
@@ -1585,35 +1594,30 @@ void smgl_several_light(mglGraph *gr)   // several light sources
        gr->Box();      gr->Surf(a,"h");
 }
 //-----------------------------------------------------------------------------
-const char *mmgl_light="light on:quality 6\ncall 'prepare2d'\n"
+const char *mmgl_light="light on:attachlight on\ncall 'prepare2d'\n"
 "subplot 2 2 0:title 'Default':rotate 50 60:box:surf a\nline -1 -0.7 1.7 -1 -0.7 0.7 'BA'\n\n"
-"light 0 1 0 1 -2 -1 -1\nsubplot 2 2 1:title 'Local':rotate 50 60:box:surf a\n"
-"line 1 0 1 -1 -1 0 'BAO'\n\n"
-"diffuse 0\nsubplot 2 2 2:title 'no diffuse':rotate 50 60:box:surf a\n"
-"line 1 0 1 -1 -1 0 'BAO'\n\n"
-"diffuse 0.5:light 0 1 0 1 -2 -1 -1 'w' 0\n"
-"subplot 2 2 3:title 'diffusive only':rotate 50 60:box:surf a\n"
-"line 1 0 1 -1 -1 0 'BAO'";
+"subplot 2 2 1:title 'Local':rotate 50 60\nlight 0 1 0 1 -2 -1 -1\nline 1 0 1 -1 -1 0 'BAO':box:surf a\n\n"
+"subplot 2 2 2:title 'no diffuse':rotate 50 60\ndiffuse 0\nline 1 0 1 -1 -1 0 'BAO':box:surf a\n\n"
+"subplot 2 2 3:title 'diffusive only':rotate 50 60\ndiffuse 0.5:light 0 1 0 1 -2 -1 -1 'w' 0\n"
+"line 1 0 1 -1 -1 0 'BAO':box:surf a";
 void smgl_light(mglGraph *gr)  // local light sources
 {
        mglData a;      mgls_prepare2d(&a);
+       gr->Light(true);        gr->AttachLight(true);
        if(big==3)
-       {       gr->Light(true);        gr->Rotate(50,60);      gr->Box();      gr->Surf(a);    return; }
-       int qual = gr->GetQuality();
-       gr->Light(true);        gr->SetQuality(6);
-       gr->SubPlot(2,2,0);     gr->Title("Default");   gr->Rotate(50,60);      gr->Box();      gr->Surf(a);
-       gr->Line(mglPoint(-1,-0.7,1.7),mglPoint(-1,-0.7,0.7),"BA");
+       {       gr->Rotate(50,60);      gr->Box();      gr->Surf(a);    return; }
+       gr->SubPlot(2,2,0);     gr->Title("Default");   gr->Rotate(50,60);
+       gr->Line(mglPoint(-1,-0.7,1.7),mglPoint(-1,-0.7,0.7),"BA");     gr->Box();      gr->Surf(a);
+       gr->SubPlot(2,2,1);     gr->Title("Local");     gr->Rotate(50,60);
        gr->AddLight(0,mglPoint(1,0,1),mglPoint(-2,-1,-1));
-       gr->SubPlot(2,2,1);     gr->Title("Local");     gr->Rotate(50,60);      gr->Box();      gr->Surf(a);
-       gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO");
+       gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO");      gr->Box();      gr->Surf(a);
+       gr->SubPlot(2,2,2);     gr->Title("no diffuse");        gr->Rotate(50,60);
        gr->SetDiffuse(0);
-       gr->SubPlot(2,2,2);     gr->Title("no diffuse");        gr->Rotate(50,60);      gr->Box();      gr->Surf(a);
-       gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO");
+       gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO");      gr->Box();      gr->Surf(a);
+       gr->SubPlot(2,2,3);     gr->Title("diffusive only");    gr->Rotate(50,60);
        gr->SetDiffuse(0.5);
        gr->AddLight(0,mglPoint(1,0,1),mglPoint(-2,-1,-1),'w',0);
-       gr->SubPlot(2,2,3);     gr->Title("diffusive only");    gr->Rotate(50,60);      gr->Box();      gr->Surf(a);
-       gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO");
-       gr->SetQuality(qual);
+       gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO");      gr->Box();      gr->Surf(a);
 }
 //-----------------------------------------------------------------------------
 const char *mmgl_surf3="call 'prepare3d'\nlight on:alpha on\n"
@@ -1651,6 +1655,15 @@ void smgl_surf3c(mglGraph *gr)
        gr->Box();      gr->Surf3C(c,d);
 }
 //-----------------------------------------------------------------------------
+const char *mmgl_surf3ca="call 'prepare3d'\ntitle 'Surf3CA plot':rotate 50 60:light on:alpha on:box:surf3ca c d c";
+void smgl_surf3ca(mglGraph *gr)
+{
+       mglData c,d;    mgls_prepare3d(&c,&d);
+       if(big!=3)      gr->Title("Surf3CA plot");
+       gr->Rotate(50,60);      gr->Light(true);        gr->Alpha(true);
+       gr->Box();      gr->Surf3CA(c,d,c);
+}
+//-----------------------------------------------------------------------------
 const char *mmgl_cut="call 'prepare2d'\ncall 'prepare3d'\nsubplot 2 2 0:title 'Cut on (default)':rotate 50 60:light on:box:surf a; zrange -1 0.5\n"
 "subplot 2 2 1:title 'Cut off':rotate 50 60:box:surf a; zrange -1 0.5; cut off\n"
 "subplot 2 2 2:title 'Cut in box':rotate 50 60:box:alpha on\ncut 0 -1 -1 1 0 1.1:surf3 c\ncut 0 0 0 0 0 0\t# restore back\n"
@@ -1728,8 +1741,8 @@ void smgl_parser(mglGraph *gr)    // example of MGL parsing
        double a[100];   // let a_i = sin(4*pi*x), x=0...1
        for(int i=0;i<100;i++)a[i]=sin(4*M_PI*i/99);
        mglParse *parser = new mglParse;
-       mglData *d = parser->AddVar("dat");
-       d->Set(a,100); // set data to variable
+       mglData *d = dynamic_cast<mglData*>(parser->AddVar("dat"));
+       if(d)   d->Set(a,100); // set data to variable
        parser->Execute(gr, "plot dat; xrange 0 1\nbox\naxis");
        // you may break script at any line do something
        // and continue after that
@@ -1777,6 +1790,14 @@ void smgl_surfc(mglGraph *gr)
        gr->Light(true);        gr->Box();      gr->SurfC(a,b);
 }
 //-----------------------------------------------------------------------------
+const char *mmgl_surfca="call 'prepare2d'\ntitle 'SurfCA plot':rotate 50 60:light on:alpha on:box:surfca a b a";
+void smgl_surfca(mglGraph *gr)
+{
+       mglData a,b;    mgls_prepare2d(&a,&b);
+       if(big!=3)      gr->Title("SurfCA plot");       gr->Rotate(50,60);
+       gr->Alpha(true);        gr->Light(true);        gr->Box();      gr->SurfCA(a,b,a);
+}
+//-----------------------------------------------------------------------------
 const char *mmgl_surfa="call 'prepare2d'\ntitle 'SurfA plot':rotate 50 60:light on:alpha on:box:surfa a b";
 void smgl_surfa(mglGraph *gr)
 {
@@ -1820,21 +1841,21 @@ void smgl_boxs(mglGraph *gr)
        gr->Rotate(50,60);      gr->Box();      gr->Tile(a);
 }
 //-----------------------------------------------------------------------------
-const char *mmgl_fit="new rnd 100 '0.4*rnd+0.1+sin(2*pi*x)'\nnew in 100 '0.3+sin(2*pi*x)'\n"
-"list ini 1 1 3:fit res rnd 'a+b*sin(c*x)' 'abc' ini\n"
-"title 'Fitting sample':yrange -2 2:box:axis:plot rnd 'k. '\n"
+const char *mmgl_fit="new dat 100 '0.4*rnd+0.1+sin(2*pi*x)'\nnew in 100 '0.3+sin(2*pi*x)'\n"
+"list ini 1 1 3:fit res dat 'a+b*sin(c*x)' 'abc' ini\n"
+"title 'Fitting sample':yrange -2 2:box:axis:plot dat 'k. '\n"
 "plot res 'r':plot in 'b'\ntext -0.9 -1.3 'fitted:' 'r:L'\n"
 "putsfit 0 -1.8 'y = ' 'r':text 0 2.2 'initial: y = 0.3+sin(2\\pi x)' 'b'";
 void smgl_fit(mglGraph *gr)    // nonlinear fitting
 {
-       mglData rnd(100), in(100), res;
-       gr->Fill(rnd,"0.4*rnd+0.1+sin(2*pi*x)");
+       mglData dat(100), in(100), res;
+       gr->Fill(dat,"0.4*rnd+0.1+sin(2*pi*x)");
        gr->Fill(in,"0.3+sin(2*pi*x)");
        double ini[3] = {1,1,3};
        mglData Ini(3,ini);
-       res = gr->Fit(rnd, "a+b*sin(c*x)", "abc", Ini);
+       res = gr->Fit(dat, "a+b*sin(c*x)", "abc", Ini);
        if(big!=3)      gr->Title("Fitting sample");
-       gr->SetRange('y',-2,2); gr->Box();      gr->Plot(rnd, "k. ");
+       gr->SetRange('y',-2,2); gr->Box();      gr->Plot(dat, "k. ");
        gr->Axis();             gr->Plot(res, "r");     gr->Plot(in, "b");
        gr->Puts(mglPoint(-0.9, -1.3), "fitted:", "r:L");
        gr->PutsFit(mglPoint(0, -1.8), "y = ", "r");
@@ -2685,8 +2706,10 @@ mglSample samp[] = {
        {"surf3", smgl_surf3, mmgl_surf3},
        {"surf3a", smgl_surf3a, mmgl_surf3a},
        {"surf3c", smgl_surf3c, mmgl_surf3c},
+       {"surf3ca", smgl_surf3ca, mmgl_surf3ca},
        {"surfa", smgl_surfa, mmgl_surfa},
        {"surfc", smgl_surfc, mmgl_surfc},
+       {"surfca", smgl_surfca, mmgl_surfca},
        {"table", smgl_table, mmgl_table},
        {"tape", smgl_tape, mmgl_tape},
        {"tens", smgl_tens, mmgl_tens},
index a2a69d18c858b4b49552f3b0fae97c7ed6e4761f..8506f40409916765437f4f864a807a2ef3d67aa7 100644 (file)
@@ -406,19 +406,19 @@ int sample_d(mglGraph *gr)
 \r
        gr->NewFrame();\r
        gr->Box();      gr->Axis("xy");\r
-       gr->Puts(mglPoint(0,1.2,1),"Vector field (color ~ \\sqrt{a^2})","rC",8);\r
+       gr->Puts(mglPoint(0,1.2,1),"Vector field (color ~ \\sqrt{a^2})",":rC",8);\r
        gr->Vect(a,b,"","value 50");\r
        gr->EndFrame();\r
 \r
        gr->NewFrame();\r
        gr->Box();      gr->Axis("xy");\r
-       gr->Puts(mglPoint(0,1.2,1),"Vector field (length ~ \\sqrt{a^2})","rC",8);\r
+       gr->Puts(mglPoint(0,1.2,1),"Vector field (length ~ \\sqrt{a^2})",":rC",8);\r
        gr->Vect(a,b);\r
        gr->EndFrame();\r
 \r
        gr->NewFrame();\r
        gr->Box();      gr->Axis("xy");\r
-       gr->Puts(mglPoint(0,1.2,1),"Flow chart (blue - source)","rC",8);\r
+       gr->Puts(mglPoint(0,1.2,1),"Flow chart (blue - source)",":rC",8);\r
        gr->Flow(a,b);\r
        gr->EndFrame();\r
 \r
diff --git a/fonts/CMakeLists.txt b/fonts/CMakeLists.txt
new file mode 100644 (file)
index 0000000..b3428f8
--- /dev/null
@@ -0,0 +1,20 @@
+configure_file(${MathGL_SOURCE_DIR}/texinfo/version.texi.in ${MathGL_BINARY_DIR}/texinfo/version.texi)
+
+set(MGL_FONTS STIX adventor  bonum  cursor  heroscn  heros  pagella  schola  termes)
+set(MGL_FONTS_BIN )
+set(MGL_FONTS_SRC )
+
+foreach(SAMPLE ${MGL_FONTS})
+       set(MGL_FONTS_BIN ${MGL_FONTS_BIN} ${MathGL_BINARY_DIR}/fonts/${SAMPLE}.vfmb)
+       add_custom_command(OUTPUT ${MathGL_BINARY_DIR}/fonts/${SAMPLE}.vfmb
+               COMMAND make_bin -p ${MathGL_SOURCE_DIR}/fonts/ -o ${MathGL_BINARY_DIR}/fonts/${SAMPLE}.vfmb ${SAMPLE}
+               DEPENDS ${SAMPLE}.vfm
+               WORKING_DIRECTORY ${MGL_OUT} )
+endforeach(SAMPLE)
+
+add_custom_target(fonts ALL DEPENDS ${MGL_FONTS_BIN})
+
+install(DIRECTORY ${MathGL_BINARY_DIR}/fonts/ DESTINATION ${MGL_FONT_PATH}
+                       PATTERN "*[mM]ake*" EXCLUDE
+                       PATTERN ".svn" EXCLUDE
+                       PATTERN "*.vfmb")
diff --git a/fonts/adventor.vfm b/fonts/adventor.vfm
new file mode 100644 (file)
index 0000000..22b9ea7
Binary files /dev/null and b/fonts/adventor.vfm differ
diff --git a/fonts/adventor_b.vfm b/fonts/adventor_b.vfm
new file mode 100644 (file)
index 0000000..c2eac39
Binary files /dev/null and b/fonts/adventor_b.vfm differ
diff --git a/fonts/adventor_bi.vfm b/fonts/adventor_bi.vfm
new file mode 100644 (file)
index 0000000..30ffd68
Binary files /dev/null and b/fonts/adventor_bi.vfm differ
diff --git a/fonts/adventor_i.vfm b/fonts/adventor_i.vfm
new file mode 100644 (file)
index 0000000..b885858
Binary files /dev/null and b/fonts/adventor_i.vfm differ
diff --git a/fonts/bonum.vfm b/fonts/bonum.vfm
new file mode 100644 (file)
index 0000000..c6aa626
Binary files /dev/null and b/fonts/bonum.vfm differ
diff --git a/fonts/bonum_b.vfm b/fonts/bonum_b.vfm
new file mode 100644 (file)
index 0000000..bc58c44
Binary files /dev/null and b/fonts/bonum_b.vfm differ
diff --git a/fonts/bonum_bi.vfm b/fonts/bonum_bi.vfm
new file mode 100644 (file)
index 0000000..e4197a0
Binary files /dev/null and b/fonts/bonum_bi.vfm differ
diff --git a/fonts/bonum_i.vfm b/fonts/bonum_i.vfm
new file mode 100644 (file)
index 0000000..12aecf0
Binary files /dev/null and b/fonts/bonum_i.vfm differ
diff --git a/fonts/chorus.vfm b/fonts/chorus.vfm
new file mode 100644 (file)
index 0000000..ee1b049
Binary files /dev/null and b/fonts/chorus.vfm differ
diff --git a/fonts/cursor.vfm b/fonts/cursor.vfm
new file mode 100644 (file)
index 0000000..e11ac80
Binary files /dev/null and b/fonts/cursor.vfm differ
diff --git a/fonts/cursor_b.vfm b/fonts/cursor_b.vfm
new file mode 100644 (file)
index 0000000..ab7145a
Binary files /dev/null and b/fonts/cursor_b.vfm differ
diff --git a/fonts/cursor_bi.vfm b/fonts/cursor_bi.vfm
new file mode 100644 (file)
index 0000000..763bc0a
Binary files /dev/null and b/fonts/cursor_bi.vfm differ
diff --git a/fonts/cursor_i.vfm b/fonts/cursor_i.vfm
new file mode 100644 (file)
index 0000000..ef4aff1
Binary files /dev/null and b/fonts/cursor_i.vfm differ
diff --git a/fonts/heros.vfm b/fonts/heros.vfm
new file mode 100644 (file)
index 0000000..5f40a94
Binary files /dev/null and b/fonts/heros.vfm differ
diff --git a/fonts/heros_b.vfm b/fonts/heros_b.vfm
new file mode 100644 (file)
index 0000000..0fab5dd
Binary files /dev/null and b/fonts/heros_b.vfm differ
diff --git a/fonts/heros_bi.vfm b/fonts/heros_bi.vfm
new file mode 100644 (file)
index 0000000..92e5d31
Binary files /dev/null and b/fonts/heros_bi.vfm differ
diff --git a/fonts/heros_i.vfm b/fonts/heros_i.vfm
new file mode 100644 (file)
index 0000000..94e487b
Binary files /dev/null and b/fonts/heros_i.vfm differ
diff --git a/fonts/heroscn.vfm b/fonts/heroscn.vfm
new file mode 100644 (file)
index 0000000..342334f
Binary files /dev/null and b/fonts/heroscn.vfm differ
diff --git a/fonts/heroscn_b.vfm b/fonts/heroscn_b.vfm
new file mode 100644 (file)
index 0000000..06e7aa3
Binary files /dev/null and b/fonts/heroscn_b.vfm differ
diff --git a/fonts/heroscn_bi.vfm b/fonts/heroscn_bi.vfm
new file mode 100644 (file)
index 0000000..bcc180b
Binary files /dev/null and b/fonts/heroscn_bi.vfm differ
diff --git a/fonts/heroscn_i.vfm b/fonts/heroscn_i.vfm
new file mode 100644 (file)
index 0000000..c20bdfd
Binary files /dev/null and b/fonts/heroscn_i.vfm differ
diff --git a/fonts/pagella.vfm b/fonts/pagella.vfm
new file mode 100644 (file)
index 0000000..87a0061
Binary files /dev/null and b/fonts/pagella.vfm differ
diff --git a/fonts/pagella_b.vfm b/fonts/pagella_b.vfm
new file mode 100644 (file)
index 0000000..8da8bd1
Binary files /dev/null and b/fonts/pagella_b.vfm differ
diff --git a/fonts/pagella_bi.vfm b/fonts/pagella_bi.vfm
new file mode 100644 (file)
index 0000000..4f47168
Binary files /dev/null and b/fonts/pagella_bi.vfm differ
diff --git a/fonts/pagella_i.vfm b/fonts/pagella_i.vfm
new file mode 100644 (file)
index 0000000..bd0dc24
Binary files /dev/null and b/fonts/pagella_i.vfm differ
diff --git a/fonts/schola.vfm b/fonts/schola.vfm
new file mode 100644 (file)
index 0000000..ee36d40
Binary files /dev/null and b/fonts/schola.vfm differ
diff --git a/fonts/schola_b.vfm b/fonts/schola_b.vfm
new file mode 100644 (file)
index 0000000..84d58f7
Binary files /dev/null and b/fonts/schola_b.vfm differ
diff --git a/fonts/schola_bi.vfm b/fonts/schola_bi.vfm
new file mode 100644 (file)
index 0000000..5b009ce
Binary files /dev/null and b/fonts/schola_bi.vfm differ
diff --git a/fonts/schola_i.vfm b/fonts/schola_i.vfm
new file mode 100644 (file)
index 0000000..87710b8
Binary files /dev/null and b/fonts/schola_i.vfm differ
diff --git a/fonts/termes.vfm b/fonts/termes.vfm
new file mode 100644 (file)
index 0000000..2e0404d
Binary files /dev/null and b/fonts/termes.vfm differ
diff --git a/fonts/termes_b.vfm b/fonts/termes_b.vfm
new file mode 100644 (file)
index 0000000..5039e9b
Binary files /dev/null and b/fonts/termes_b.vfm differ
diff --git a/fonts/termes_bi.vfm b/fonts/termes_bi.vfm
new file mode 100644 (file)
index 0000000..67110c6
Binary files /dev/null and b/fonts/termes_bi.vfm differ
diff --git a/fonts/termes_i.vfm b/fonts/termes_i.vfm
new file mode 100644 (file)
index 0000000..ec85e7e
Binary files /dev/null and b/fonts/termes_i.vfm differ
index 51d37307e75f61a5cb33a918929e7a11db46d789..483e6b6508959a50bcfed440665e304c79033a78 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef _MGL_CONFIG_H_
 #define _MGL_CONFIG_H_
 
+#define MGL_VER2       ${MathGL_VERSION_MINOR} // minor version of MathGL 2.* (like 1.3 for v.2.1.3)
+
 #define MGL_USE_DOUBLE ${MGL_USE_DOUBLE}
 
 #ifdef WIN32   // a man ask to use built-in font under Windows
@@ -23,6 +25,7 @@
 #define MGL_HAVE_C99_COMPLEX   ${MGL_HAVE_C99_COMPLEX}
 #endif
 
+#define MGL_SIZEOF_LONG        ${SIZEOF_LONG}
 #define MGL_HAVE_LTDL  ${MGL_HAVE_LTDL}
 #define MGL_HAVE_RVAL  ${MGL_HAVE_RVAL}
 #define MGL_HAVE_ZLIB  ${MGL_HAVE_ZLIB}
index 86041a66a52ab9c1478833c1ff1447d0678266a7..d6eb49480f64c3e26134739857b23b3a72dad341 100644 (file)
@@ -45,6 +45,13 @@ typedef const mglDataA* HCDT;
 #ifdef __cplusplus
 extern "C" {
 #endif
+/// Set seed for random numbers
+void MGL_EXPORT mgl_srnd(long seed);
+void MGL_EXPORT mgl_srnd_(int *seed);
+/// Get random number
+double MGL_EXPORT mgl_rnd();
+double MGL_EXPORT mgl_rnd_();
+
 /// Set name for data variable (can be used in mgl_formula_calc() or in MGL scripts)
 void MGL_EXPORT mgl_data_set_name(mglDataA *dat, const char *name);
 void MGL_EXPORT mgl_data_set_name_(uintptr_t *dat, const char *name,int);
index 5896c362ccba6e803c03c97cd4f96cb504303d4b..801054c22b2c22f72a771204f25c9070d026871b 100644 (file)
@@ -40,9 +40,9 @@ void MGL_EXPORT mgl_fft_freq(double *freq,long nn);
 /// Remove double spaces from the string
 void MGL_EXPORT mgl_strcls(char *str);
 /// Get position of substring or return -1 if not found
-long MGL_EXPORT_PURE mgl_strpos(const char *str,char *fnd);
+long MGL_EXPORT mgl_strpos(const char *str,char *fnd);
 /// Get position of symbol or return -1 if not found
-long MGL_EXPORT_PURE mgl_chrpos(const char *str,char fnd);
+long MGL_EXPORT mgl_chrpos(const char *str,char fnd);
 
 /// Get uncommented string from file (NOTE: it is not thread safe!!!)
 MGL_EXPORT char *mgl_fgetstr(FILE *fp);
index 40244fcfa0e5bcb8f1e68980aca61e6beb5ebfa8..9526e7fb9c96e808d38be2eeea9821f19ae7e0c6 100644 (file)
@@ -120,9 +120,6 @@ struct MGL_EXPORT mglMatrix
        bool norot;     // flag to disable pnts rotation\r
        mglMatrix()     {       memset(this,0,sizeof(mglMatrix));       clear();        }\r
        mglMatrix(const mglMatrix &aa) : x(aa.x),y(aa.y),z(aa.z),pf(aa.pf),norot(aa.norot)      {       memcpy(b,aa.b,9*sizeof(mreal)); }\r
-#if MGL_HAVE_RVAL\r
-       mglMatrix(mglMatrix &&aa) : x(aa.x),y(aa.y),z(aa.z),pf(aa.pf),norot(aa.norot)   {       memcpy(b,aa.b,9*sizeof(mreal)); }\r
-#endif\r
        void Rotate(mreal tetz,mreal tetx,mreal tety);\r
        void RotateN(mreal Tet,mreal x,mreal y,mreal z);\r
        inline void clear()     {       x=y=z=pf=0;     memset(b,0,9*sizeof(mreal));    b[0]=b[4]=b[8]=1;       norot=false;    }\r
@@ -156,14 +153,43 @@ struct MGL_EXPORT mglPrim // NOTE: use float for reducing memory size
        };\r
        mglPrim(int t=0):n1(0),n2(0),n3(0),n4(0),type(t),angl(0),id(0),z(0),w(0),m(0)   {}\r
        mglPrim(const mglPrim &aa) : n1(aa.n1),n2(aa.n2),n3(aa.n3),n4(aa.n4),type(aa.type),angl(aa.angl),id(aa.id),z(aa.z),w(aa.w),m(aa.m)      {}\r
-#if MGL_HAVE_RVAL\r
-       mglPrim(mglPrim &&aa) : n1(aa.n1),n2(aa.n2),n3(aa.n3),n4(aa.n4),type(aa.type),angl(aa.angl),id(aa.id),z(aa.z),w(aa.w),m(aa.m)   {}\r
-#endif\r
        const mglPrim &operator=(const mglPrim &aa)     {       memcpy(this, &aa, sizeof(mglPrim));     return aa;      }\r
 };\r
 bool operator<(const mglPrim &a,const mglPrim &b);\r
 bool operator>(const mglPrim &a,const mglPrim &b);\r
 //-----------------------------------------------------------------------------\r
+/// Structure for light source\r
+struct MGL_EXPORT mglLight\r
+{\r
+       mglLight():n(false),a(0),b(0)   {}\r
+       mglLight(const mglLight &aa) : n(aa.n),d(aa.d),r(aa.r),q(aa.q),p(aa.p),a(aa.a),b(aa.b),c(aa.c)  {}\r
+\r
+       bool n;                 ///< Availability of light sources\r
+       mglPoint d;             ///< Direction of light sources\r
+       mglPoint r;             ///< Position of light sources (NAN for infinity)\r
+       mglPoint q;             ///< Actual position of light sources (filled by LightScale() function)\r
+       mglPoint p;             ///< Actual direction of light sources (filled by LightScale() function)\r
+       mreal a;                ///< Aperture of light sources\r
+       mreal b;                ///< Brightness of light sources\r
+       mglColor c;             ///< Color of light sources\r
+};\r
+//-----------------------------------------------------------------------------\r
+/// Structure for inplot\r
+struct MGL_EXPORT mglBlock\r
+{\r
+       int id;         ///< object id\r
+       long n1,n2,n3,n4;       ///< coordinates of corners {n1=x1,n2=x2,n3=y1,n4=y2}\r
+\r
+       mglLight light[10];     ///< Light sources\r
+       mreal AmbBr;            ///< Default ambient light brightness\r
+       mreal DifBr;            ///< Default diffusive light brightness\r
+       mglMatrix B;            ///< Transformation matrix\r
+\r
+       mglBlock():id(0),n1(0),n2(0),n3(0),n4(0),AmbBr(0.5),DifBr(0.5)  {}\r
+       mglBlock(const mglBlock &aa)    {       memcpy(this, &aa, sizeof(mglBlock));    }\r
+       const mglBlock &operator=(const mglBlock &aa)   {       memcpy(this, &aa, sizeof(mglBlock));    return aa;      }\r
+};\r
+//-----------------------------------------------------------------------------\r
 /// Structure for group of primitives\r
 struct MGL_EXPORT mglGroup\r
 {\r
@@ -196,27 +222,31 @@ struct MGL_EXPORT mglText
 /// Structure for internal point representation\r
 struct MGL_EXPORT mglPnt       // NOTE: use float for reducing memory size\r
 {\r
-       float xx,yy,zz; // original coordinates\r
-       float x,y,z;    // coordinates\r
-       float c,t,ta;   // index in color scheme\r
-       float u,v,w;    // normales\r
-       float r,g,b,a;  // RGBA color\r
+       union { float dat[16];  struct {\r
+               float x,y,z;    // coordinates\r
+               float u,v,w;    // normales\r
+               float r,g,b,a;  // RGBA color\r
+               float xx,yy,zz; // original coordinates\r
+               float c,t,ta;   // index in color scheme\r
+       }; };\r
        short sub;              // subplot id and rotation information (later will be in subplot)\r
-       mglPnt(float X=0, float Y=0, float Z=0, float U=0, float V=0, float W=0, float R=0, float G=0, float B=0, float A=0):xx(X),yy(Y),zz(Z),x(X),y(Y),z(Z),c(0),t(0),ta(0),u(U),v(V),w(W),r(R),g(G),b(B),a(A),sub(0) {}\r
-       mglPnt(const mglPnt &aa) : xx(aa.xx),yy(aa.yy),zz(aa.zz), x(aa.x),y(aa.y),z(aa.z), c(aa.c),t(aa.t),ta(aa.ta), u(aa.u),v(aa.v),w(aa.w), r(aa.r),g(aa.g),b(aa.b),a(aa.a), sub(aa.sub)     {}\r
-#if MGL_HAVE_RVAL\r
-       mglPnt(mglPnt &&aa) : xx(aa.xx),yy(aa.yy),zz(aa.zz), x(aa.x),y(aa.y),z(aa.z), c(aa.c),t(aa.t),ta(aa.ta), u(aa.u),v(aa.v),w(aa.w), r(aa.r),g(aa.g),b(aa.b),a(aa.a), sub(aa.sub)  {}\r
-#endif\r
-       inline const mglPnt&operator=(const mglPnt &aa) {       memcpy(this,&aa,sizeof(mglPnt));        return aa;      }\r
+       mglPnt(float X, float Y=0, float Z=0, float U=0, float V=0, float W=0, float R=0, float G=0, float B=0, float A=0):x(X),y(Y),z(Z),u(U),v(V),w(W),r(R),g(G),b(B),a(A),xx(X),yy(Y),zz(Z),c(0),t(0),ta(0),sub(0)   {}\r
+       mglPnt():x(0),y(0),z(0),u(0),v(0),w(0),r(0),g(0),b(0),a(0),xx(0),yy(0),zz(0),c(0),t(0),ta(0),sub(0)     {}\r
+       mglPnt(const mglPnt &aa) : sub(aa.sub)  {       memcpy(dat,aa.dat,16*sizeof(float));    }\r
+       inline const mglPnt&operator=(const mglPnt &aa) { sub=aa.sub;   memcpy(dat,aa.dat,16*sizeof(float));    return aa;      }\r
 };\r
 inline mglPnt operator+(const mglPnt &a, const mglPnt &b)\r
-{      return mglPnt(a.x+b.x,a.y+b.y,a.z+b.z, a.u+b.u,a.v+b.v,a.w+b.w, a.r+b.r,a.g+b.g,a.b+b.b,a.a+b.a);       }\r
+{      mglPnt p;       for(long i=0;i<10;i++)  p.dat[i] = a.dat[i]+b.dat[i];   p.sub=a.sub;    return p;       }\r
+//{    return mglPnt(a.x+b.x,a.y+b.y,a.z+b.z, a.u+b.u,a.v+b.v,a.w+b.w, a.r+b.r,a.g+b.g,a.b+b.b,a.a+b.a);       }\r
 inline mglPnt operator-(const mglPnt &a, const mglPnt &b)\r
-{      return mglPnt(a.x-b.x,a.y-b.y,a.z-b.z, a.u-b.u,a.v-b.v,a.w-b.w, a.r-b.r,a.g-b.g,a.b-b.b,a.a-b.a);       }\r
+{      mglPnt p;       for(long i=0;i<10;i++)  p.dat[i] = a.dat[i]-b.dat[i];   p.sub=a.sub;    return p;       }\r
+//{    return mglPnt(a.x-b.x,a.y-b.y,a.z-b.z, a.u-b.u,a.v-b.v,a.w-b.w, a.r-b.r,a.g-b.g,a.b-b.b,a.a-b.a);       }\r
 inline mglPnt operator*(const mglPnt &a, float b)\r
-{      return mglPnt(a.x*b,a.y*b,a.z*b, a.u*b,a.v*b,a.w*b, a.r*b,a.g*b,a.b*b,a.a*b);   }\r
+{      mglPnt p;       for(long i=0;i<10;i++)  p.dat[i] = a.dat[i]*b;  p.sub=a.sub;    return p;       }\r
+//{    return mglPnt(a.x*b,a.y*b,a.z*b, a.u*b,a.v*b,a.w*b, a.r*b,a.g*b,a.b*b,a.a*b);   }\r
 inline mglPnt operator*(float b, const mglPnt &a)\r
-{      return mglPnt(a.x*b,a.y*b,a.z*b, a.u*b,a.v*b,a.w*b, a.r*b,a.g*b,a.b*b,a.a*b);   }\r
+{      mglPnt p;       for(long i=0;i<10;i++)  p.dat[i] = a.dat[i]*b;  p.sub=a.sub;    return p;       }\r
+//{    return mglPnt(a.x*b,a.y*b,a.z*b, a.u*b,a.v*b,a.w*b, a.r*b,a.g*b,a.b*b,a.a*b);   }\r
 //-----------------------------------------------------------------------------\r
 /// Structure for glyph representation\r
 struct MGL_EXPORT mglGlyph\r
@@ -362,7 +392,7 @@ public:
        inline void SetCut(bool val)    {       set(val, MGL_ENABLE_CUT);       }\r
        /// Set additional cutting box\r
        inline void SetCutBox(mreal x1, mreal y1, mreal z1, mreal x2, mreal y2, mreal z2)\r
-       {       CutMin=mglPoint(x1,y1,z1);      CutMax=mglPoint(x2,y2,z2);      }\r
+       {       CutMin.Set(x1,y1,z1);   CutMax.Set(x2,y2,z2);   }\r
        inline void SetCutBox(mglPoint v1, mglPoint v2) {       CutMin=v1;      CutMax=v2;      }\r
        /// Reset mask to solid state\r
        inline void ResetMask() {       mask = MGL_SOLID_MASK;  MaskAn = DefMaskAn;     }\r
@@ -372,6 +402,9 @@ public:
        /// Set the using of light on/off.\r
        virtual bool Light(bool enable)\r
        {       bool t=get(MGL_ENABLE_LIGHT);   set(enable,MGL_ENABLE_LIGHT);   return t;       }\r
+       /// Set to attach light sources to inplot.\r
+       virtual bool AttachLight(bool enable)\r
+       {       bool t=get(MGL_LOCAL_LIGHT);    set(enable,MGL_LOCAL_LIGHT);    return t;       }\r
        /// Set ambient light brightness\r
        virtual void SetAmbient(mreal bright=0.5);\r
        /// Set diffusive light brightness\r
@@ -546,7 +579,7 @@ public:
        void SetEventFunc(void (*func)(void *), void *par)      {       event_cb=func;  event_par=par;  }\r
 \r
 protected:\r
-       bool Stop;                      ///< Flag that execution should be terminated.\r
+       volatile bool Stop;     ///< Flag that execution should be terminated.\r
        void (*event_cb)(void *);       ///< Function to be called for event processing\r
        void *event_par;        ///< Parameter for event processing function\r
 \r
@@ -561,7 +594,7 @@ protected:
        long *PrmInd;           ///< Indexes of sorted primitives\r
        mglStack<mglPnt> Pnt;   ///< Internal points\r
        mglStack<mglPrim> Prm;  ///< Primitives (lines, triangles and so on) -- need for export\r
-       mglStack<mglPrim> Sub;  ///< InPlot regions {n1=x1,n2=x2,n3=y1,n4=y2,id}\r
+       std::vector<mglBlock> Sub;      ///< InPlot regions\r
        std::vector<mglText> Ptx;       ///< Text labels for mglPrim\r
        std::vector<mglText> Leg;       ///< Text labels for legend\r
        std::vector<mglGlyph> Glf;      ///< Glyphs data\r
@@ -579,8 +612,8 @@ protected:
        mreal pPos;                     ///< Current position in pen mask\r
        mreal PenWidth;         ///< Pen width for further line plotting (must be >0 !!!)\r
 //     long numT;                      ///< Number of textures\r
-       mreal AmbBr;            ///< Default ambient light brightness\r
-       mreal DifBr;            ///< Default diffusive light brightness\r
+       mreal AmbBr;            ///< Default ambient light brightness   // TODO move to mglBlock\r
+       mreal DifBr;            ///< Default diffusive light brightness // TODO move to mglBlock\r
 \r
        mreal persp;            ///< Original value for perspective\r
        mglMatrix Bp;           ///< Transformation matrix for View() and Zoom()\r
index e8d37b73986d02dc6652be1bd237222a9ca80519..786afa48280bed78a6e38681dc82f7467a455a9a 100644 (file)
@@ -32,20 +32,20 @@ int MGL_EXPORT mgl_check_version_(const char *ver, int);
 void MGL_EXPORT mgl_suppress_warn(int on);\r
 void MGL_EXPORT mgl_suppress_warn_(int *on);\r
 /// Get last warning code\r
-int MGL_EXPORT_PURE mgl_get_warn(HMGL gr);\r
-int MGL_EXPORT_PURE mgl_get_warn_(uintptr_t *gr);\r
+int MGL_EXPORT mgl_get_warn(HMGL gr);\r
+int MGL_EXPORT mgl_get_warn_(uintptr_t *gr);\r
 /// Set warning code ant fill message\r
 void MGL_EXPORT mgl_set_warn(HMGL gr, int code, const char *text);\r
 void MGL_EXPORT mgl_set_warn_(uintptr_t *gr, int *code, const char *text,int);\r
 /// Get text of warning message(s)\r
-MGL_EXPORT_PURE const char *mgl_get_mess(HMGL gr);\r
+MGL_EXPORT const char *mgl_get_mess(HMGL gr);\r
 int MGL_EXPORT mgl_get_mess_(uintptr_t *gr, char *out, int len);\r
 \r
 /// Set name of plot for saving filename\r
 void MGL_EXPORT mgl_set_plotid(HMGL gr, const char *id);\r
 void MGL_EXPORT mgl_set_plotid_(uintptr_t *gr, const char *id,int);\r
 /// Get name of plot for saving filename\r
-MGL_EXPORT_PURE const char *mgl_get_plotid(HMGL gr);\r
+MGL_EXPORT const char *mgl_get_plotid(HMGL gr);\r
 int MGL_EXPORT mgl_get_plotid_(uintptr_t *gr, char *out, int len);\r
 \r
 /// Ask to stop drawing\r
@@ -58,9 +58,14 @@ int MGL_EXPORT mgl_need_stop_(uintptr_t *gr);
 void MGL_EXPORT mgl_set_event_func(HMGL gr, void (*func)(void *), void *par);\r
 \r
 /// Get plot quality\r
-int MGL_EXPORT_PURE mgl_get_quality(HMGL gr);\r
-int MGL_EXPORT_PURE mgl_get_quality_(uintptr_t *gr);\r
+int MGL_EXPORT mgl_get_quality(HMGL gr);\r
+int MGL_EXPORT mgl_get_quality_(uintptr_t *gr);\r
 /// Set plot quality\r
+/** qual=0 -- no face drawing (fastest),\r
+ *  qual=1 -- no color interpolation (fast),\r
+ *  qual=2 -- high quality (normal),\r
+ *  qual|4 -- direct bitmap drawing (low memory usage);\r
+ *  qual|8 for dots drawing instead of primitives (extremely fast). */\r
 void MGL_EXPORT mgl_set_quality(HMGL gr, int qual);\r
 void MGL_EXPORT mgl_set_quality_(uintptr_t *gr, int *qual);\r
 /// Set drawing region for Quality&4\r
@@ -68,10 +73,10 @@ void MGL_EXPORT mgl_set_draw_reg(HMGL gr, long nx, long ny, long m);
 void MGL_EXPORT mgl_set_draw_reg_(uintptr_t *gr, int *nx, int *ny, int *m);\r
 \r
 /// Check if support of frames is enabled (i.e. MGL_VECT_FRAME is set and Quality&MGL_DRAW_LMEM==0)\r
-int MGL_EXPORT_PURE mgl_is_frames(HMGL gr);\r
+int MGL_EXPORT mgl_is_frames(HMGL gr);\r
 /// Get bit-value flag of HMGL state (for advanced users only)\r
-int MGL_EXPORT_PURE mgl_get_flag(HMGL gr, uint32_t flag);\r
-int MGL_EXPORT_PURE mgl_get_flag_(uintptr_t *gr, unsigned long *flag);\r
+int MGL_EXPORT mgl_get_flag(HMGL gr, uint32_t flag);\r
+int MGL_EXPORT mgl_get_flag_(uintptr_t *gr, unsigned long *flag);\r
 /// Set bit-value flag of HMGL state (for advanced users only)\r
 void MGL_EXPORT mgl_set_flag(HMGL gr, int val, uint32_t flag);\r
 void MGL_EXPORT mgl_set_flag_(uintptr_t *gr, int *val, unsigned long *flag);\r
@@ -115,7 +120,7 @@ void MGL_EXPORT mgl_set_mask_angle_(uintptr_t *gr, int *angle);
 /// Set default value of alpha-channel\r
 void MGL_EXPORT mgl_set_alpha_default(HMGL gr, double alpha);\r
 void MGL_EXPORT mgl_set_alpha_default_(uintptr_t *gr, mreal *alpha);\r
-/// Set relative width of rectangles in Bars, Barh, BoxPlot\r
+/// Set relative width of rectangles in Bars, Barh, BoxPlot, Candle, OHLC (default is 0.7)\r
 void MGL_EXPORT mgl_set_bar_width(HMGL gr, double width);\r
 void MGL_EXPORT mgl_set_bar_width_(uintptr_t *gr, mreal *width);\r
 /// Set number of mesh lines (use 0 to draw all of them)\r
@@ -170,13 +175,16 @@ void MGL_EXPORT mgl_zoom_axis_(uintptr_t *gr, mreal *x1, mreal *y1, mreal *z1, m
 /// Set axis origin\r
 void MGL_EXPORT mgl_set_origin(HMGL gr, double x0, double y0, double z0);\r
 void MGL_EXPORT mgl_set_origin_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0);\r
-/// Set the transformation formulas for coordinate\r
+/// Set the transformation formulas for coordinate. Use "" or NULL for built-in ones\r
 void MGL_EXPORT mgl_set_func(HMGL gr, const char *EqX,const char *EqY,const char *EqZ,const char *EqA);\r
 void MGL_EXPORT mgl_set_func_(uintptr_t *gr, const char *EqX, const char *EqY, const char *EqZ, const char *EqA, int, int, int, int);\r
 /// Set one of predefined transformation rule\r
 void MGL_EXPORT mgl_set_coor(HMGL gr, int how);\r
 void MGL_EXPORT mgl_set_coor_(uintptr_t *gr, int *how);\r
 /// Set to draw Ternary axis (triangle like axis, grid and so on)\r
+/** val=1 for Ternary axis (a+b+c=1, z=z),\r
+ *  val=2 for Quaternary axis (a+b+c+d=1),\r
+ *  val|4 for projections. */\r
 void MGL_EXPORT mgl_set_ternary(HMGL gr, int kind);\r
 void MGL_EXPORT mgl_set_ternary_(uintptr_t *gr, int *kind);\r
 \r
index 20d306038111208f8076cf8b8678a897dd3889da..efcee953f1370c500ed5819a9d07ff462115ec93 100644 (file)
@@ -61,26 +61,8 @@ struct MGL_EXPORT mglAxis
        mreal angl;             ///< Manual for ticks rotation (if not NAN)\r
 };\r
 //-----------------------------------------------------------------------------\r
-/// Structure for light source\r
-struct MGL_EXPORT mglLight\r
-{\r
-       mglLight():n(false),a(0),b(0)   {}\r
-       mglLight(const mglLight &aa) : n(aa.n),d(aa.d),r(aa.r),q(aa.q),p(aa.p),a(aa.a),b(aa.b),c(aa.c)  {}\r
-#if MGL_HAVE_RVAL\r
-       mglLight(mglLight &&aa) : n(aa.n),d(aa.d),r(aa.r),q(aa.q),p(aa.p),a(aa.a),b(aa.b),c(aa.c)       {}\r
-#endif\r
-       bool n;                 ///< Availability of light sources\r
-       mglPoint d;             ///< Direction of light sources\r
-       mglPoint r;             ///< Position of light sources (NAN for infinity)\r
-       mglPoint q;             ///< Actual position of light sources (filled by LightScale() function)\r
-       mglPoint p;             ///< Actual direction of light sources (filled by LightScale() function)\r
-       mreal a;                ///< Aperture of light sources\r
-       mreal b;                ///< Brightness of light sources\r
-       mglColor c;             ///< Color of light sources\r
-};\r
-//-----------------------------------------------------------------------------\r
 class mglCanvas;\r
-/// Structure for light source\r
+/// Structure for drawing region\r
 struct MGL_EXPORT mglDrawReg\r
 {\r
        mglDrawReg() {}\r
@@ -106,14 +88,15 @@ struct MGL_EXPORT mglDrawReg
 struct MGL_EXPORT mglDrawDat\r
 {\r
        mglDrawDat() {}\r
-       mglDrawDat(const mglDrawDat &aa) : Pnt(aa.Pnt),Prm(aa.Prm),Ptx(aa.Ptx),Glf(aa.Glf),Txt(aa.Txt)  {}\r
+       mglDrawDat(const mglDrawDat &aa) : Pnt(aa.Pnt),Prm(aa.Prm),Sub(aa.Sub),Ptx(aa.Ptx),Glf(aa.Glf),Txt(aa.Txt)      {}\r
 #if MGL_HAVE_RVAL\r
-       mglDrawDat(mglDrawDat &&aa) : Pnt(aa.Pnt),Prm(aa.Prm),Ptx(aa.Ptx),Glf(aa.Glf),Txt(aa.Txt)       {}\r
+       mglDrawDat(mglDrawDat &&aa) : Pnt(aa.Pnt),Prm(aa.Prm),Sub(aa.Sub),Ptx(aa.Ptx),Glf(aa.Glf),Txt(aa.Txt)   {}\r
 #endif\r
        inline const mglDrawDat&operator=(const mglDrawDat &aa)\r
-       {       Pnt=aa.Pnt;     Prm=aa.Prm;     Ptx=aa.Ptx;     Glf=aa.Glf;     Txt=aa.Txt;     return aa;      }\r
+       {       Pnt=aa.Pnt;     Prm=aa.Prm;     Ptx=aa.Ptx;     Glf=aa.Glf;     Txt=aa.Txt;     Sub=aa.Sub;     return aa;      }\r
        mglStack<mglPnt>  Pnt;  ///< Internal points\r
        mglStack<mglPrim> Prm;  ///< Primitives (lines, triangles and so on) -- need for export\r
+       std::vector<mglBlock> Sub;      ///< InPlot regions\r
        std::vector<mglText> Ptx;       ///< Text labels for mglPrim\r
        std::vector<mglGlyph> Glf;      ///< Glyphs data\r
        mglStack<mglTexture> Txt;       ///< Pointer to textures\r
@@ -215,7 +198,8 @@ using mglBase::Light;
        /// Set object/subplot id\r
        inline void SetObjId(long id)   {       ObjId = id;     }\r
        /// Get object id\r
-       inline int GetObjId(long xs,long ys) const      {       return OI[xs+Width*ys]; }\r
+       inline int GetObjId(long xs,long ys) const      \r
+       {       register long i=xs+Width*ys;    return (i>=0 && i<Width*Height)?OI[i]:-1;       }\r
        /// Get subplot id\r
        int GetSplId(long xs,long ys) const MGL_FUNC_PURE;\r
        /// Check if there is active point or primitive (n=-1)\r
@@ -374,7 +358,7 @@ protected:
        int Depth;                      ///< Depth of the image\r
        mreal inW, inH;         ///< Width and height of last InPlot\r
        mreal inX, inY;         ///< Coordinates of last InPlot\r
-       mglLight light[10];     ///< Light sources\r
+       mglLight light[10];     ///< Light sources      // TODO move to mglBlock\r
        mreal FogDist;          ///< Inverse fog distance (fog ~ exp(-FogDist*Z))\r
        mreal FogDz;            ///< Relative shift of fog\r
 \r
@@ -397,6 +381,7 @@ protected:
        /// Scale coordinates and cut off some points\r
        bool ScalePoint(const mglMatrix *M, mglPoint &p, mglPoint &n, bool use_nan=true) const;\r
        void LightScale(const mglMatrix *M);    ///< Additionally scale positions of light sources\r
+       void LightScale(const mglMatrix *M, mglLight &l);       ///< Additionally scale positions of light\r
        /// Push drawing data (for frames only). NOTE: can be VERY large\r
        long PushDrwDat();\r
        /// Retur color for primitive depending lighting\r
index f37a5bd363bcdb213f236d4524bd09bc35852fd2..4bbd1c86799e908d65664d4542ce5f26c46b4829 100644 (file)
@@ -34,6 +34,9 @@ void MGL_EXPORT mgl_delete_graph_(uintptr_t *gr);
 /// Set size of frame in pixels. Normally this function is called internally.\r
 void MGL_EXPORT mgl_set_size(HMGL gr, int width, int height);\r
 void MGL_EXPORT mgl_set_size_(uintptr_t *gr, int *width, int *height);\r
+/// Scaling for all further set size calls.\r
+void MGL_EXPORT mgl_set_size_scl(double scl);\r
+void MGL_EXPORT mgl_set_size_scl_(double *scl);\r
 /// Set default parameters for plotting\r
 void MGL_EXPORT mgl_set_def_param(HMGL gr);\r
 void MGL_EXPORT mgl_set_def_param_(uintptr_t *gr);\r
@@ -80,7 +83,7 @@ void MGL_EXPORT mgl_set_ticks_valw(HMGL gr, char dir, HCDT val, const wchar_t *l
 void MGL_EXPORT mgl_add_tick(HMGL gr, char dir, double val, const char *lbl);\r
 void MGL_EXPORT mgl_add_tick_(uintptr_t *gr, const char *dir, mreal *val, const char *lbl,int,int);\r
 void MGL_EXPORT mgl_add_tickw(HMGL gr, char dir, double val, const wchar_t *lbl);\r
-/// Tune ticks\r
+/// Tune ticks (tune|1 for common multiplier, tune|2 for common component)\r
 void MGL_EXPORT mgl_tune_ticks(HMGL gr, int tune, double fact_pos);\r
 void MGL_EXPORT mgl_tune_ticks_(uintptr_t *gr, int *tune, mreal *fact_pos);\r
 /// Set templates for ticks\r
@@ -98,29 +101,97 @@ void MGL_EXPORT mgl_set_tick_shift_(uintptr_t *gr, mreal *sx, mreal *sy, mreal *
 void MGL_EXPORT mgl_box(HMGL gr);\r
 void MGL_EXPORT mgl_box_(uintptr_t *gr);\r
 /// Draws bounding box outside the plotting volume with color c\r
+/** Style ‘@’ produce filled back faces. */\r
 void MGL_EXPORT mgl_box_str(HMGL gr, const char *col, int ticks);\r
 void MGL_EXPORT mgl_box_str_(uintptr_t *gr, const char *col, int *ticks, int);\r
 /// Draw axises with ticks in direction(s) dir.\r
+/** Parameter \a dir may contain:\r
+ *     ‘xyzt’for drawing axis in corresponding direction;\r
+ *     ‘XYZT’ for drawing axis in corresponding direction but with inverted positions of labels;\r
+ *     ‘~’, ‘_’ for disabling tick labels;\r
+ *     ‘U’ for disabling rotation of tick labels;\r
+ *     ‘^’ for inverting default axis origin;\r
+ *     ‘!’ for disabling ticks tuning;\r
+ *     ‘AKDTVISO’ for drawing arrow at the end of axis;\r
+ *     ‘a’ for forced adjusting of axis ticks;\r
+ *     ‘f’ for printing ticks labels in fixed format;\r
+ *     ‘E’ for using ‘E’ instead of ‘e’ in ticks labels;\r
+ *     ‘F’ for printing ticks labels in LaTeX format;\r
+ *     ‘+’ for printing ‘+’ for positive ticks;\r
+ *     ‘-’ for printing usual ‘-’ in ticks labels;\r
+ *     ‘0123456789’ for precision at printing ticks labels.\r
+ *      Option "value" set the manual rotation angle for the ticks.*/\r
 void MGL_EXPORT mgl_axis(HMGL gr, const char *dir, const char *stl, const char *opt);\r
 void MGL_EXPORT mgl_axis_(uintptr_t *gr, const char *dir, const char *stl, const char *opt,int,int,int);\r
 /// Draw grid lines perpendicular to direction(s) dir.\r
 void MGL_EXPORT mgl_axis_grid(HMGL gr, const char *dir,const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_axis_grid_(uintptr_t *gr, const char *dir,const char *pen, const char *opt,int,int,int);\r
 /// Print the label text for axis dir.\r
+/** Option "value" set additional shifting of the label. */\r
 void MGL_EXPORT mgl_label(HMGL gr, char dir, const char *text, double pos, const char *opt);\r
 void MGL_EXPORT mgl_label_(uintptr_t *gr, const char *dir, const char *text, mreal *pos, const char *opt,int,int,int);\r
+/// Print the label text for axis dir.\r
+/** Option "value" set additional shifting of the label. */\r
 void MGL_EXPORT mgl_labelw(HMGL gr, char dir, const wchar_t *text, double pos, const char *opt);\r
 \r
 /// Draw colorbar at edge of axis\r
+/** Parameter \a sch may contain:\r
+ *      ‘<>^_’ for positioning at left, at right, at top or at bottom correspondingly;\r
+ *      ‘I’ for positioning near bounding (by default, at edges of subplot);\r
+ *      ‘A’ for using absolute coordinates;\r
+ *      ‘~’ for disabling tick labels.\r
+ *      ‘!’ for disabling ticks tuning;\r
+ *      ‘f’ for printing ticks labels in fixed format;\r
+ *      ‘E’ for using ‘E’ instead of ‘e’ in ticks labels;\r
+ *      ‘F’ for printing ticks labels in LaTeX format;\r
+ *      ‘+’ for printing ‘+’ for positive ticks;\r
+ *      ‘-’ for printing usual ‘-’ in ticks labels;\r
+ *      ‘0123456789’ for precision at printing ticks labels.*/\r
 void MGL_EXPORT mgl_colorbar(HMGL gr, const char *sch);\r
 void MGL_EXPORT mgl_colorbar_(uintptr_t *gr, const char *sch,int);\r
 /// Draw colorbar at manual position\r
+/** Parameter \a sch may contain:\r
+ *      ‘<>^_’ for positioning at left, at right, at top or at bottom correspondingly;\r
+ *      ‘I’ for positioning near bounding (by default, at edges of subplot);\r
+ *      ‘A’ for using absolute coordinates;\r
+ *      ‘~’ for disabling tick labels.\r
+ *      ‘!’ for disabling ticks tuning;\r
+ *      ‘f’ for printing ticks labels in fixed format;\r
+ *      ‘E’ for using ‘E’ instead of ‘e’ in ticks labels;\r
+ *      ‘F’ for printing ticks labels in LaTeX format;\r
+ *      ‘+’ for printing ‘+’ for positive ticks;\r
+ *      ‘-’ for printing usual ‘-’ in ticks labels;\r
+ *      ‘0123456789’ for precision at printing ticks labels.*/\r
 void MGL_EXPORT mgl_colorbar_ext(HMGL gr, const char *sch, double x, double y, double w, double h);\r
 void MGL_EXPORT mgl_colorbar_ext_(uintptr_t *gr, const char *sch, mreal *x, mreal *y, mreal *w, mreal *h, int);\r
 /// Draw colorbar with manual colors at edge of axis\r
+/** Parameter \a sch may contain:\r
+ *      ‘<>^_’ for positioning at left, at right, at top or at bottom correspondingly;\r
+ *      ‘I’ for positioning near bounding (by default, at edges of subplot);\r
+ *      ‘A’ for using absolute coordinates;\r
+ *      ‘~’ for disabling tick labels.\r
+ *      ‘!’ for disabling ticks tuning;\r
+ *      ‘f’ for printing ticks labels in fixed format;\r
+ *      ‘E’ for using ‘E’ instead of ‘e’ in ticks labels;\r
+ *      ‘F’ for printing ticks labels in LaTeX format;\r
+ *      ‘+’ for printing ‘+’ for positive ticks;\r
+ *      ‘-’ for printing usual ‘-’ in ticks labels;\r
+ *      ‘0123456789’ for precision at printing ticks labels.*/\r
 void MGL_EXPORT mgl_colorbar_val(HMGL gr, HCDT dat, const char *sch);\r
 void MGL_EXPORT mgl_colorbar_val_(uintptr_t *gr, uintptr_t *dat, const char *sch,int);\r
 /// Draw colorbar with manual colors at manual position\r
+/** Parameter \a sch may contain:\r
+ *      ‘<>^_’ for positioning at left, at right, at top or at bottom correspondingly;\r
+ *      ‘I’ for positioning near bounding (by default, at edges of subplot);\r
+ *      ‘A’ for using absolute coordinates;\r
+ *      ‘~’ for disabling tick labels.\r
+ *      ‘!’ for disabling ticks tuning;\r
+ *      ‘f’ for printing ticks labels in fixed format;\r
+ *      ‘E’ for using ‘E’ instead of ‘e’ in ticks labels;\r
+ *      ‘F’ for printing ticks labels in LaTeX format;\r
+ *      ‘+’ for printing ‘+’ for positive ticks;\r
+ *      ‘-’ for printing usual ‘-’ in ticks labels;\r
+ *      ‘0123456789’ for precision at printing ticks labels.*/\r
 void MGL_EXPORT mgl_colorbar_val_ext(HMGL gr, HCDT dat, const char *sch,double x, double y, double w, double h);\r
 void MGL_EXPORT mgl_colorbar_val_ext_(uintptr_t *gr, uintptr_t *dat, const char *sch, mreal *x, mreal *y, mreal *w, mreal *h, int);\r
 \r
@@ -132,9 +203,26 @@ void MGL_EXPORT mgl_add_legendw(HMGL gr, const wchar_t *text,const char *style);
 void MGL_EXPORT mgl_clear_legend(HMGL gr);\r
 void MGL_EXPORT mgl_clear_legend_(uintptr_t *gr);\r
 /// Draw legend of accumulated strings at position {x,y}\r
+/** Parameter fnt may contain:\r
+ *      font style for legend text;\r
+ *      colors for background (first one), border (second one) and text (last one);\r
+ *      ‘A’ for positioning in absolute coordinates;\r
+ *      ‘^’ for positioning outside of specified point;\r
+ *      ‘-’ for arranging entries horizontally;\r
+ *      ‘#’ for drawing box around legend.\r
+ * Option value set the space between line samples and text (default is 0.1).*/\r
 void MGL_EXPORT mgl_legend_pos(HMGL gr, double x, double y, const char *font, const char *opt);\r
 void MGL_EXPORT mgl_legend_pos_(uintptr_t *gr, mreal *x, mreal *y, const char *font, const char *opt,int,int);\r
 /// Draw legend of accumulated strings\r
+/** Parameter fnt may contain:\r
+ *      font style for legend text;\r
+ *      colors for background (first one), border (second one) and text (last one);\r
+ *      ‘A’ for positioning in absolute coordinates;\r
+ *      ‘^’ for positioning outside of specified point;\r
+ *      ‘-’ for arranging entries horizontally;\r
+ *      ‘#’ for drawing box around legend.\r
+ * Option value set the space between line samples and text (default is 0.1).\r
+ * Parameter \a where sets position: 0 at bottom-left, 1 at bottom-right, 2 at top-left, 3 at top-right (default).*/\r
 void MGL_EXPORT mgl_legend(HMGL gr, int where, const char *font, const char *opt);\r
 void MGL_EXPORT mgl_legend_(uintptr_t *gr, int *where, const char *font, const char *opt,int,int);\r
 /// Set number of marks in legend sample\r
@@ -223,20 +311,23 @@ void MGL_EXPORT mgl_write_json_z_(uintptr_t *gr, const char *fname,const char *d
 MGL_EXPORT const char *mgl_get_json(HMGL gr);\r
 \r
 /// Get RGB values of current bitmap\r
+/** Position of element {i,j} is [3*i + 3*Width*j]. */\r
 MGL_EXPORT const unsigned char *mgl_get_rgb(HMGL gr);\r
 MGL_EXPORT const unsigned char *mgl_get_rgb_(uintptr_t *gr);\r
 /// Get RGBA values of current bitmap\r
+/** Position of element {i,j} is [4*i + 4*Width*j]. */\r
 MGL_EXPORT const unsigned char *mgl_get_rgba(HMGL gr);\r
 MGL_EXPORT const unsigned char *mgl_get_rgba_(uintptr_t *gr);\r
-/// Get RGB values of current bitmap\r
+/// Get RGBA values of background image\r
+/** Position of element {i,j} is [4*i + 4*Width*j]. */\r
 MGL_EXPORT const unsigned char *mgl_get_background(HMGL gr);\r
 MGL_EXPORT const unsigned char *mgl_get_background_(uintptr_t *gr);\r
 /// Set object/subplot id\r
 void MGL_EXPORT mgl_set_obj_id(HMGL gr, int id);\r
 void MGL_EXPORT mgl_set_obj_id_(uintptr_t *gr, int *id);\r
 /// Get object id\r
-int MGL_EXPORT_PURE mgl_get_obj_id(HMGL gr, int x, int y);\r
-int MGL_EXPORT_PURE mgl_get_obj_id_(uintptr_t *gr, int *x, int *y);\r
+int MGL_EXPORT mgl_get_obj_id(HMGL gr, int x, int y);\r
+int MGL_EXPORT mgl_get_obj_id_(uintptr_t *gr, int *x, int *y);\r
 /// Get subplot id\r
 int MGL_EXPORT mgl_get_spl_id(HMGL gr, int x, int y);\r
 int MGL_EXPORT mgl_get_spl_id_(uintptr_t *gr, int *x, int *y);\r
@@ -253,8 +344,8 @@ void MGL_EXPORT mgl_calc_xyz_(uintptr_t *gr, int *xs, int *ys, mreal *x, mreal *
 void MGL_EXPORT mgl_calc_scr(HMGL gr, double x, double y, double z, int *xs, int *ys);\r
 void MGL_EXPORT mgl_calc_scr_(uintptr_t *gr, mreal *x, mreal *y, mreal *z, int *xs, int *ys);\r
 /// Check if {xs,ys} is close to active point with accuracy d, and return its position or -1\r
-long MGL_EXPORT_PURE mgl_is_active(HMGL gr, int xs, int ys, int d);\r
-long MGL_EXPORT_PURE mgl_is_active_(uintptr_t *gr, int *xs, int *ys, int *d);\r
+long MGL_EXPORT mgl_is_active(HMGL gr, int xs, int ys, int d);\r
+long MGL_EXPORT mgl_is_active_(uintptr_t *gr, int *xs, int *ys, int *d);\r
 \r
 /// Create new frame.\r
 int MGL_EXPORT mgl_new_frame(HMGL gr);\r
@@ -299,6 +390,9 @@ void MGL_EXPORT mgl_set_light_(uintptr_t *gr, int *enable);
 /// Switch on/off the specified light source.\r
 void MGL_EXPORT mgl_set_light_n(HMGL gr, int n, int enable);\r
 void MGL_EXPORT mgl_set_light_n_(uintptr_t *gr, int *n, int *enable);\r
+/// Set to attach light settings to inplot.\r
+void MGL_EXPORT mgl_set_attach_light(HMGL gr, int enable);\r
+void MGL_EXPORT mgl_set_attach_light_(uintptr_t *gr, int *enable);\r
 \r
 /// Add white light source at infinity.\r
 void MGL_EXPORT mgl_add_light(HMGL gr, int n, double x, double y, double z);\r
@@ -336,19 +430,37 @@ void MGL_EXPORT mgl_clf_str_(uintptr_t *gr, const char *col, int);
 void MGL_EXPORT mgl_load_background(HMGL gr, const char *fname, double alpha);\r
 void MGL_EXPORT mgl_load_background_(uintptr_t *gr, const char *fname, mreal *alpha, int);\r
 \r
-/// Put further plotting in some region of whole frame.\r
+/// Put further plotting in m-th cell of nx*ny grid of the image.\r
+/** String \a style may contain:\r
+ *  '<' for reserving space at left\r
+ *  '>' for reserving space at right\r
+ *  '^' for reserving space at top\r
+ *  '_' for reserving space at bottom\r
+ *  '#' for using whole region. */\r
 void MGL_EXPORT mgl_subplot(HMGL gr, int nx,int ny,int m,const char *style);\r
 void MGL_EXPORT mgl_subplot_(uintptr_t *gr, int *nx,int *ny,int *m, const char *s,int);\r
-/// Put further plotting in some region of whole frame and shift it by distance {dx,dy}.\r
+/// Put further plotting in m-th cell of nx*ny grid of the image and shift it by distance {dx,dy}.\r
+/** String \a style may contain:\r
+ *  '<' for reserving space at left\r
+ *  '>' for reserving space at right\r
+ *  '^' for reserving space at top\r
+ *  '_' for reserving space at bottom\r
+ *  '#' for using whole region. */\r
 void MGL_EXPORT mgl_subplot_d(HMGL gr, int nx,int ny,int m,const char *style, double dx, double dy);\r
 void MGL_EXPORT mgl_subplot_d_(uintptr_t *gr, int *nx,int *ny,int *m, mreal *dx, mreal *dy);\r
-/// Like MGL_EXPORT mgl_subplot() but "join" several cells\r
+/// Put further plotting in rectangle of dx*dy cells starting from m-th cell of nx*ny grid of the image.\r
+/** String \a style may contain:\r
+ *  '<' for reserving space at left\r
+ *  '>' for reserving space at right\r
+ *  '^' for reserving space at top\r
+ *  '_' for reserving space at bottom\r
+ *  '#' for using whole region. */\r
 void MGL_EXPORT mgl_multiplot(HMGL gr, int nx,int ny,int m,int dx,int dy,const char *style);\r
 void MGL_EXPORT mgl_multiplot_(uintptr_t *gr, int *nx,int *ny,int *m,int *dx,int *dy, const char *s,int);\r
-/// Put further plotting in a region of whole frame.\r
+/// Put further plotting in a region [x1,x2]*[y1,y2] of the image (x1,x2,y1,y2 in range [0, 1]).\r
 void MGL_EXPORT mgl_inplot(HMGL gr, double x1,double x2,double y1,double y2);\r
 void MGL_EXPORT mgl_inplot_(uintptr_t *gr, mreal *x1, mreal *x2, mreal *y1, mreal *y2);\r
-/// Put further plotting in a region of current subplot/inplot.\r
+/// Put further plotting in a region [x1,x2]*[y1,y2] of the subplot (x1,x2,y1,y2 in range [0, 1]).\r
 void MGL_EXPORT mgl_relplot(HMGL gr, double x1,double x2,double y1,double y2);\r
 void MGL_EXPORT mgl_relplot_(uintptr_t *gr, mreal *x1, mreal *x2, mreal *y1, mreal *y2);\r
 /// Put further plotting in column cell of previous subplot/inplot.\r
@@ -361,6 +473,7 @@ void MGL_EXPORT mgl_gridplot_(uintptr_t *gr, int *nx, int *ny, int *m, mreal *d)
 void MGL_EXPORT mgl_stickplot(HMGL gr, int num, int ind, double tet, double phi);\r
 void MGL_EXPORT mgl_stickplot_(uintptr_t *gr, int *num, int *i, mreal *tet, mreal *phi);\r
 /// Add title for current subplot/inplot.\r
+/** Style '#' draw box around the title. */\r
 void MGL_EXPORT mgl_title(HMGL gr, const char *title, const char *stl, double size);\r
 void MGL_EXPORT mgl_title_(uintptr_t *gr, const char *title, const char *stl, mreal *size, int,int);\r
 void MGL_EXPORT mgl_titlew(HMGL gr, const wchar_t *title, const char *stl, double size);\r
@@ -403,8 +516,8 @@ void MGL_EXPORT mgl_wnd_set_func(HMGL gr, int (*draw)(HMGL gr, void *p), void *p
 void MGL_EXPORT mgl_wnd_set_delay(HMGL gr, double dt);\r
 void MGL_EXPORT mgl_wnd_set_delay_(uintptr_t *gr, mreal *dt);\r
 /// Get delay for animation in seconds\r
-double MGL_EXPORT_PURE mgl_wnd_get_delay(HMGL gr);\r
-double MGL_EXPORT_PURE mgl_wnd_get_delay_(uintptr_t *gr);\r
+double MGL_EXPORT mgl_wnd_get_delay(HMGL gr);\r
+double MGL_EXPORT mgl_wnd_get_delay_(uintptr_t *gr);\r
 /// Set window properties\r
 void MGL_EXPORT mgl_setup_window(HMGL gr, int clf_upd, int showpos);\r
 void MGL_EXPORT mgl_setup_window_(uintptr_t *gr, int *clf_upd, int *showpos);\r
@@ -461,21 +574,21 @@ void MGL_EXPORT mgl_parser_add_paramw(HMPR p, int id, const wchar_t *str);
 \r
 /// Find variable with given name or add a new one\r
 /// NOTE !!! You must not delete obtained data arrays !!!\r
-HMDT MGL_EXPORT mgl_parser_add_var(HMPR p, const char *name);\r
+MGL_EXPORT mglDataA *mgl_parser_add_var(HMPR p, const char *name);\r
 uintptr_t MGL_EXPORT mgl_parser_add_var_(uintptr_t* p, const char *name, int);\r
-HMDT MGL_EXPORT mgl_parser_add_varw(HMPR p, const wchar_t *name);\r
+MGL_EXPORT mglDataA *mgl_parser_add_varw(HMPR p, const wchar_t *name);\r
 /// Find variable with given name or return NULL if no one\r
 /// NOTE !!! You must not delete obtained data arrays !!!\r
-MGL_EXPORT_PURE mglDataA *mgl_parser_find_var(HMPR p, const char *name);\r
-uintptr_t MGL_EXPORT_PURE mgl_parser_find_var_(uintptr_t* p, const char *name, int);\r
-MGL_EXPORT_PURE mglDataA *mgl_parser_find_varw(HMPR p, const wchar_t *name);\r
+MGL_EXPORT mglDataA *mgl_parser_find_var(HMPR p, const char *name);\r
+uintptr_t MGL_EXPORT mgl_parser_find_var_(uintptr_t* p, const char *name, int);\r
+MGL_EXPORT mglDataA *mgl_parser_find_varw(HMPR p, const wchar_t *name);\r
 /// Get variable with given id\r
 /// NOTE !!! You must not delete obtained data arrays !!!\r
-MGL_EXPORT_PURE mglDataA *mgl_parser_get_var(HMPR p, unsigned long id);\r
-uintptr_t MGL_EXPORT_PURE mgl_parser_get_var_(uintptr_t* p, unsigned long *id);\r
+MGL_EXPORT mglDataA *mgl_parser_get_var(HMPR p, unsigned long id);\r
+uintptr_t MGL_EXPORT mgl_parser_get_var_(uintptr_t* p, unsigned long *id);\r
 /// Get number of variables\r
-long MGL_EXPORT_PURE mgl_parser_num_var(HMPR p);\r
-long MGL_EXPORT_PURE mgl_parser_num_var_(uintptr_t* p);\r
+long MGL_EXPORT mgl_parser_num_var(HMPR p);\r
+long MGL_EXPORT mgl_parser_num_var_(uintptr_t* p);\r
 \r
 /// Delete variable with name\r
 void MGL_EXPORT mgl_parser_del_var(HMPR p, const char *name);\r
@@ -489,6 +602,11 @@ void MGL_EXPORT mgl_parser_del_all_(uintptr_t *p);
 void MGL_EXPORT mgl_parser_load(HMPR pr, const char *dll_name);\r
 void MGL_EXPORT mgl_parser_load_(uintptr_t *pr, const char *dll_name,int);\r
 \r
+/// Apply one step for equation d vars[i]/dt = eqs[i] using Runge-Kutta method\r
+void MGL_EXPORT mgl_rk_step(HMPR pr, const char *eqs, const char *vars, mreal dt);\r
+void MGL_EXPORT mgl_rk_step_w(HMPR pr, const wchar_t *eqs, const wchar_t *vars, mreal dt);\r
+void MGL_EXPORT mgl_rk_step_(uintptr_t *p, const char *eqs, const char *vars, double *dt, int,int);\r
+\r
 /// Parse and draw single line of the MGL script\r
 int MGL_EXPORT mgl_parse_line(HMGL gr, HMPR p, const char *str, int pos);\r
 int MGL_EXPORT mgl_parse_line_(uintptr_t* gr, uintptr_t* p, const char *str, int *pos, int);\r
@@ -520,21 +638,25 @@ void MGL_EXPORT mgl_parser_stop_(uintptr_t* p);
 ///            3 - setup, 4 - data handle, 5 - data create, 6 - subplot, 7 - program\r
 ///            8 - 1d plot, 9 - 2d plot, 10 - 3d plot, 11 - dd plot, 12 - vector plot\r
 ///            13 - axis, 14 - primitives, 15 - axis setup, 16 - text/legend, 17 - data transform\r
-int MGL_EXPORT_PURE mgl_parser_cmd_type(HMPR pr, const char *name);\r
-int MGL_EXPORT_PURE mgl_parser_cmd_type_(uintptr_t* p, const char *name, int);\r
+int MGL_EXPORT mgl_parser_cmd_type(HMPR pr, const char *name);\r
+int MGL_EXPORT mgl_parser_cmd_type_(uintptr_t* p, const char *name, int);\r
 /// Return description of MGL command\r
-MGL_EXPORT_PURE const char *mgl_parser_cmd_desc(HMPR pr, const char *name);\r
+MGL_EXPORT const char *mgl_parser_cmd_desc(HMPR pr, const char *name);\r
 /// Return string of command format (command name and its argument[s])\r
-MGL_EXPORT_PURE const char *mgl_parser_cmd_frmt(HMPR pr, const char *name);\r
+MGL_EXPORT const char *mgl_parser_cmd_frmt(HMPR pr, const char *name);\r
 /// Get name of command with nmber n\r
-MGL_EXPORT_PURE const char *mgl_parser_cmd_name(HMPR pr, long id);\r
+MGL_EXPORT const char *mgl_parser_cmd_name(HMPR pr, long id);\r
 /// Get number of defined commands\r
-long MGL_EXPORT_PURE mgl_parser_cmd_num(HMPR pr);\r
+long MGL_EXPORT mgl_parser_cmd_num(HMPR pr);\r
 \r
 /// Return result of formula evaluation\r
 HMDT MGL_EXPORT mgl_parser_calc(HMPR pr, const char *formula);\r
 uintptr_t MGL_EXPORT mgl_parser_calc_(uintptr_t *pr, const char *formula,int);\r
 HMDT MGL_EXPORT mgl_parser_calcw(HMPR pr, const wchar_t *formula);\r
+/// Return result of formula evaluation as complex data\r
+HADT MGL_EXPORT mgl_parser_calc_complex(HMPR pr, const char *formula);\r
+uintptr_t MGL_EXPORT mgl_parser_calc_complex_(uintptr_t *pr, const char *formula,int);\r
+HADT MGL_EXPORT mgl_parser_calc_complexw(HMPR pr, const wchar_t *formula);\r
 \r
 #ifdef __cplusplus\r
 }\r
index 70288409996a130ced4a5da3e8e13ec379856ba6..a0367df30acca1300d84812027f4261037450e9d 100644 (file)
@@ -43,112 +43,187 @@ void MGL_EXPORT mgl_contf_gen(HMGL gr, double v1, double v2, HCDT a, HCDT x, HCD
 //void MGL_EXPORT mgl_contv_gen(HMGL gr, double v1, double v2, HCDT a, HCDT x, HCDT y, HCDT z, const char *stl);\r
 //void MGL_EXPORT mgl_axial_gen(HMGL gr, double v1, double v2, HCDT a, HCDT x, HCDT y, HCDT z, const char *stl);\r
 \r
-/// Draw manual contour lines for 2d data specified parametrically\r
+/// Draw contour lines at manual levels for 2d data specified parametrically\r
+/** Style ‘_’ to draw contours at bottom of axis box.\r
+ * Style ‘t’/‘T’ draw contour labels below/above contours. */\r
 void MGL_EXPORT mgl_cont_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_cont_xy_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int);\r
-/// Draw manual contour lines for 2d data\r
+/// Draw contour lines at manual levels for 2d data\r
+/** Style ‘_’ to draw contours at bottom of axis box.\r
+ * Style ‘t’/‘T’ draw contour labels below/above contours. */\r
 void MGL_EXPORT mgl_cont_val(HMGL gr, HCDT v, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_cont_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 /// Draw contour lines for 2d data specified parametrically\r
+/** Style ‘_’ to draw contours at bottom of axis box.\r
+ * Style ‘t’/‘T’ draw contour labels below/above contours.\r
+ * Option "value" set the number of contour levels (default is 7). */\r
 void MGL_EXPORT mgl_cont_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_cont_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 /// Draw contour lines for 2d data\r
+/** Style ‘_’ to draw contours at bottom of axis box.\r
+ * Style ‘t’/‘T’ draw contour labels below/above contours.\r
+ * Option "value" set the number of contour levels (default is 7). */\r
 void MGL_EXPORT mgl_cont(HMGL gr, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_cont_(uintptr_t *gr, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 \r
-/// Draw manual solid contours for 2d data specified parametrically\r
+/// Draw solid contours at manual levels for 2d data specified parametrically\r
+/** Style ‘_’ to draw contours at bottom of axis box. */\r
 void MGL_EXPORT mgl_contf_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_contf_xy_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int);\r
-/// Draw manual solid contours for 2d data\r
+/// Draw solid contours at manual levels for 2d data\r
+/** Style ‘_’ to draw contours at bottom of axis box. */\r
 void MGL_EXPORT mgl_contf_val(HMGL gr, HCDT v, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_contf_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 /// Draw solid contours for 2d data specified parametrically\r
+/** Style ‘_’ to draw contours at bottom of axis box.\r
+ * Option "value" set the number of contour levels (default is 7). */\r
 void MGL_EXPORT mgl_contf_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_contf_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 /// Draw solid contours for 2d data\r
+/** Style ‘_’ to draw contours at bottom of axis box.\r
+ * Option "value" set the number of contour levels (default is 7). */\r
 void MGL_EXPORT mgl_contf(HMGL gr, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_contf_(uintptr_t *gr, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 \r
-/// Draw manual solid contours for 2d data specified parametrically with manual colors\r
+/// Draw solid contours at manual levels for 2d data specified parametrically with specified colors\r
+/** Style ‘_’ to draw contours at bottom of axis box. */\r
 void MGL_EXPORT mgl_contd_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_contd_xy_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int);\r
-/// Draw manual solid contours for 2d data with manual colors\r
+/// Draw solid contours at manual levels for 2d data with specified colors\r
+/** Style ‘_’ to draw contours at bottom of axis box. */\r
 void MGL_EXPORT mgl_contd_val(HMGL gr, HCDT v, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_contd_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *z, const char *sch, const char *opt,int,int);\r
-/// Draw solid contours for 2d data specified parametrically with manual colors\r
+/// Draw solid contours for 2d data specified parametrically with specified colors\r
+/** Style ‘_’ to draw contours at bottom of axis box.\r
+ * Option "value" set the number of contour levels (default is 7). */\r
 void MGL_EXPORT mgl_contd_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_contd_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int);\r
-/// Draw solid contours for 2d data with manual colors\r
+/// Draw solid contours for 2d data with specified colors\r
+/** Style ‘_’ to draw contours at bottom of axis box.\r
+ * Option "value" set the number of contour levels (default is 7). */\r
 void MGL_EXPORT mgl_contd(HMGL gr, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_contd_(uintptr_t *gr, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 \r
-/// Draw manual contour tubes for 2d data specified parametrically\r
+/// Draw contour tubes between manual levels for 2d data specified parametrically\r
+/** Style ‘_’ to draw contours at bottom of axis box. */\r
 void MGL_EXPORT mgl_contv_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_contv_xy_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int);\r
-/// Draw manual contour tubes for 2d data\r
+/// Draw contour tubes between manual levels for 2d data\r
+/** Style ‘_’ to draw contours at bottom of axis box. */\r
 void MGL_EXPORT mgl_contv_val(HMGL gr, HCDT v, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_contv_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 /// Draw contour tubes for 2d data specified parametrically\r
+/** Style ‘_’ to draw contours at bottom of axis box.\r
+ * Option "value" set the number of contour levels (default is 7). */\r
 void MGL_EXPORT mgl_contv_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_contv_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 /// Draw contour tubes for 2d data\r
+/** Style ‘_’ to draw contours at bottom of axis box.\r
+ * Option "value" set the number of contour levels (default is 7). */\r
 void MGL_EXPORT mgl_contv(HMGL gr, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_contv_(uintptr_t *gr, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 \r
-/// Draw manual axial-symmetric isosurfaces for 2d data specified parametrically\r
+/// Draw axial-symmetric isosurfaces at manual levels for 2d data specified parametrically\r
+/** String \a sch may contain:\r
+ * ‘#’ for wired plot;\r
+ * ‘.’ for plot by dots;\r
+ * ‘x’, ‘z’ for rotation around x-, z-axis correspondingly (default is y-axis). */\r
 void MGL_EXPORT mgl_axial_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT a, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_axial_xy_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *a, const char *sch, const char *opt,int,int);\r
-/// Draw manual axial-symmetric isosurfaces for 2d data\r
+/// Draw axial-symmetric isosurfaces at manual levels for 2d data\r
+/** String \a sch may contain:\r
+ * ‘#’ for wired plot;\r
+ * ‘.’ for plot by dots;\r
+ * ‘x’, ‘z’ for rotation around x-, z-axis correspondingly (default is y-axis). */\r
 void MGL_EXPORT mgl_axial_val(HMGL gr, HCDT v, HCDT a, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_axial_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *a, const char *sch, const char *opt,int,int);\r
 /// Draw axial-symmetric isosurfaces for 2d data specified parametrically\r
+/** String \a sch may contain:\r
+ * ‘#’ for wired plot;\r
+ * ‘.’ for plot by dots;\r
+ * ‘x’, ‘z’ for rotation around x-, z-axis correspondingly (default is y-axis).\r
+ * Option "value" set the number of isosurfaces (default is 3). */\r
 void MGL_EXPORT mgl_axial_xy(HMGL gr, HCDT x, HCDT y, HCDT a, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_axial_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *a, const char *sch, const char *opt,int,int);\r
 /// Draw axial-symmetric isosurfaces for 2d data\r
+/** String \a sch may contain:\r
+ * ‘#’ for wired plot;\r
+ * ‘.’ for plot by dots;\r
+ * ‘x’, ‘z’ for rotation around x-, z-axis correspondingly (default is y-axis).\r
+ * Option "value" set the number of isosurfaces (default is 3). */\r
 void MGL_EXPORT mgl_axial(HMGL gr, HCDT a, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_axial_(uintptr_t *gr, uintptr_t *a, const char *sch, const char *opt,int,int);\r
 \r
-/// Draw surface of curve {r,z} rotatation around axis\r
+/// Draw surface of curve {r,z} rotation around axis\r
+/** Style ‘#’ produce wire plot. Style ‘.’ produce plot by dots.*/\r
 void MGL_EXPORT mgl_torus(HMGL gr, HCDT r, HCDT z, const char *col, const char *opt);\r
 void MGL_EXPORT mgl_torus_(uintptr_t *gr, uintptr_t *r, uintptr_t *z, const char *pen, const char *opt,int,int);\r
 \r
 /// Draw grid lines for density plot at slice for 3d data specified parametrically\r
+/** Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.*/\r
 void MGL_EXPORT mgl_grid3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_grid3_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int);\r
 /// Draw grid lines for density plot at slice for 3d data\r
+/** Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.*/\r
 void MGL_EXPORT mgl_grid3(HMGL gr, HCDT a, const char *stl, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_grid3_(uintptr_t *gr, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int);\r
 \r
 /// Draw density plot at slice for 3d data specified parametrically\r
+/** Style ‘#’ draw grid lines. Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.*/\r
 void MGL_EXPORT mgl_dens3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_dens3_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int);\r
 /// Draw density plot at slice for 3d data\r
+/** Style ‘#’ draw grid lines. Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.*/\r
 void MGL_EXPORT mgl_dens3(HMGL gr, HCDT a, const char *stl, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_dens3_(uintptr_t *gr, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int);\r
 \r
-/// Draw manual contour lines at slice for 3d data specified parametrically\r
+/// Draw contour lines at manual levels along slice for 3d data specified parametrically\r
+/** Style ‘#’ draw grid lines.\r
+ * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.\r
+ * Style ‘t’/‘T’ draw contour labels below/above contours. */\r
 void MGL_EXPORT mgl_cont3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_cont3_xyz_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int);\r
-/// Draw manual contour lines at slice for 3d data\r
+/// Draw contour lines at manual levels along slice for 3d data\r
+/** Style ‘#’ draw grid lines.\r
+ * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.\r
+ * Style ‘t’/‘T’ draw contour labels below/above contours. */\r
 void MGL_EXPORT mgl_cont3_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_cont3_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int);\r
-/// Draw contour lines at slice for 3d data specified parametrically\r
+/// Draw contour lines along slice for 3d data specified parametrically\r
+/** Style ‘#’ draw grid lines.\r
+ * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.\r
+ * Style ‘t’/‘T’ draw contour labels below/above contours.\r
+ * Option "value" set the number of contour levels (default is 7). */\r
 void MGL_EXPORT mgl_cont3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_cont3_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int);\r
-/// Draw contour lines at slice for 3d data\r
+/// Draw contour lines along slice for 3d data\r
+/** Style ‘#’ draw grid lines.\r
+ * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.\r
+ * Style ‘t’/‘T’ draw contour labels below/above contours.\r
+ * Option "value" set the number of contour levels (default is 7). */\r
 void MGL_EXPORT mgl_cont3(HMGL gr, HCDT a, const char *sch, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_cont3_(uintptr_t *gr, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int);\r
 \r
-/// Draw manual solid contours at slice for 3d data specified parametrically\r
+/// Draw solid contours at manual levels along slice for 3d data specified parametrically\r
+/** Style ‘#’ draw grid lines.\r
+ * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. */\r
 void MGL_EXPORT mgl_contf3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_contf3_xyz_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int);\r
-/// Draw manual solid contours at slice for 3d data\r
+/// Draw solid contours at manual levels along slice for 3d data\r
+/** Style ‘#’ draw grid lines.\r
+ * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. */\r
 void MGL_EXPORT mgl_contf3_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_contf3_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int);\r
-/// Draw solid contours at slice for 3d data specified parametrically\r
+/// Draw solid contours along slice for 3d data specified parametrically\r
+/** Style ‘#’ draw grid lines.\r
+ * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.\r
+ * Option "value" set the number of contour levels (default is 7). */\r
 void MGL_EXPORT mgl_contf3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_contf3_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int);\r
-/// Draw solid contours at slice for 3d data\r
+/// Draw solid contours along slice for 3d data\r
+/** Style ‘#’ draw grid lines.\r
+ * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.\r
+ * Option "value" set the number of contour levels (default is 7). */\r
 void MGL_EXPORT mgl_contf3(HMGL gr, HCDT a, const char *sch, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_contf3_(uintptr_t *gr, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int);\r
 \r
index 424bbcf0b10f62c7233a7f94997001d71f1b469e..6ca9f62fbf53138358e8bcdd798f7ee16c58880c 100644 (file)
@@ -69,6 +69,16 @@ using mglDataA::Momentum;
        /// Delete the array\r
        virtual ~mglData()      {       if(!link && a)  delete []a;     }\r
 \r
+       /// Move all data from variable d, and delete this variable.\r
+       inline void Move(mglData *d)    // NOTE: Variable d will be deleted!!!\r
+       {       if(d && d->GetNN()>1)\r
+               {       bool l=link;    mreal *b=a;\r
+                       nx=d->nx;       ny=d->ny;       nz=d->nz;       a=d->a; d->a=b;\r
+                       temp=d->temp;   func=d->func;   o=d->o; s=d->s;\r
+                       id=d->id;       link=d->link;   d->link=l;      delete d;       }\r
+               else if(d)      {       *this = d->a[0];        delete d;       }\r
+       }\r
+\r
        inline mreal GetVal(long i, long j=0, long k=0) const\r
        {       return mgl_data_get_value(this,i,j,k);}\r
        inline void SetVal(mreal f, long i, long j=0, long k=0)\r
@@ -318,6 +328,12 @@ using mglDataA::Momentum;
        inline void Sew(const char *dirs="xyz", mreal da=2*mglPi)\r
        {       mgl_data_sew(this,dirs,da);     }\r
        /// Smooth the data on specified direction or directions\r
+       /** String \a dir may contain:\r
+        *  ‘x’, ‘y’, ‘z’ for 1st, 2nd or 3d dimension;\r
+        *  ‘dN’ for linear averaging over N points;\r
+        *  ‘3’ for linear averaging over 3 points;\r
+        *  ‘5’ for linear averaging over 5 points.\r
+        *  By default quadratic averaging over 5 points is used. */\r
        inline void Smooth(const char *dirs="xyz",mreal delta=0)\r
        {       mgl_data_smooth(this,dirs,delta);       }\r
        /// Normalize the data to range [v1,v2]\r
@@ -336,6 +352,14 @@ using mglDataA::Momentum;
        /// Fill data by 'x'/'k' samples for Hankel ('h') or Fourier ('f') transform\r
        inline void FillSample(const char *how)\r
        {       mgl_data_fill_sample(this,how); }\r
+       /// Apply wavelet transform\r
+       /** Parameter \a dir may contain:\r
+        * ‘x‘,‘y‘,‘z‘ for directions,\r
+        * ‘d‘ for daubechies, ‘D‘ for centered daubechies,\r
+        * ‘h‘ for haar, ‘H‘ for centered haar,\r
+        * ‘b‘ for bspline, ‘B‘ for centered bspline,\r
+        * ‘i‘ for applying inverse transform. */\r
+       inline void Wavelet(const char *how, int k)     {       mgl_data_wavelet(this, how, k); }\r
 \r
        /// Return an approximated x-value (root) when dat(x) = val\r
        inline mreal Solve(mreal val, bool use_spline=true, long i0=0) const\r
@@ -458,9 +482,9 @@ inline bool operator<(const mglDataA &b, const mglDataA &d)
 inline bool operator>(const mglDataA &b, const mglDataA &d)\r
 {      return b.Minimal()>d.Minimal(); }\r
 //-----------------------------------------------------------------------------\r
-mreal MGL_EXPORT_PURE mglLinear(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z);\r
-mreal MGL_EXPORT_PURE mglSpline3(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z,mreal *dx=0, mreal *dy=0, mreal *dz=0);\r
-mreal MGL_EXPORT_PURE mglSpline3s(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z);\r
+mreal MGL_EXPORT mglLinear(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z);\r
+mreal MGL_EXPORT mglSpline3(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z,mreal *dx=0, mreal *dy=0, mreal *dz=0);\r
+mreal MGL_EXPORT mglSpline3s(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z);\r
 #endif\r
 //-----------------------------------------------------------------------------\r
 /// Integral data transformation (like Fourier 'f' or 'i', Hankel 'h' or None 'n') for amplitude and phase\r
@@ -697,7 +721,7 @@ class MGL_EXPORT mglDataF : public mglDataA
 public:\r
 \r
        mglDataF(long xx=1,long yy=1,long zz=1):nx(xx),ny(yy),nz(zz), dfunc(0),par(0)\r
-       {       ex=0;   v2=mglPoint(1,1,1);     setD(); }\r
+       {       ex=0;   v2.Set(1,1,1);  setD(); }\r
        mglDataF(const mglDataF &d) : nx(d.nx), ny(d.ny), nz(d.nz), str(d.str), v1(d.v1), v2(d.v2), dx(d.dx),dy(d.dy),dz(d.dz), dfunc(d.dfunc),par(d.par)\r
        {       ex = mgl_create_expr(str.c_str());      }\r
 #if MGL_HAVE_RVAL\r
@@ -871,5 +895,34 @@ public:
        {       return 0;       }\r
 };\r
 //-----------------------------------------------------------------------------\r
+/// Class for replacement of std::vector\r
+class MGL_EXPORT mglDataS : public mglDataA\r
+{\r
+public:\r
+       std::vector<mreal> dat;\r
+\r
+       mglDataS(const mglDataS &st) : dat(st.dat)      {}\r
+       mglDataS(const std::vector<mreal> &d) : dat(d)  {}\r
+       mglDataS(size_t s=1)    {       dat.resize(s);  }\r
+       ~mglDataS()     {}\r
+       inline void reserve(size_t num) {       dat.reserve(num);       }\r
+       inline void clear()     {       dat.clear();    }\r
+       inline double operator[](size_t i)      {       return dat[i];  }\r
+       inline void push_back(double t) {       dat.push_back(t);       }\r
+       inline size_t size() const      {       return dat.size();      }\r
+       const mglDataS &operator=(const mglDataS &st)   {       dat = st.dat;   return st;      }\r
+       const std::vector<mreal> &operator=(const std::vector<mreal> &st)       {       dat = st;       return st;      }\r
+\r
+       mreal v(long i,long j=0,long k=0) const         {       return dat[i];  }\r
+       mreal vthr(long i) const        {       return dat[i];  };\r
+       long GetNx() const      {       return dat.size();      }\r
+       long GetNy() const      {       return 1;       }\r
+       long GetNz() const      {       return 1;       }\r
+       mreal dvx(long i,long j=0,long k=0) const\r
+       {       return i>0? (i<long(dat.size()-1)? (dat[i+1]-dat[i-1])/2:dat[i]-dat[i-1]) : dat[i+1]-dat[i];    }\r
+       mreal dvy(long i,long j=0,long k=0) const       {       return 1;       }\r
+       mreal dvz(long i,long j=0,long k=0) const       {       return 1;       }\r
+};\r
+//-----------------------------------------------------------------------------\r
 #endif\r
 #endif\r
index 2976bdefb9e041520ee8da9d5a8596ecc8e3fb32..913017c55a34ed90ed773885708f9fb5e46dbf48 100644 (file)
@@ -38,16 +38,9 @@ typedef void gsl_matrix;
 #ifdef __cplusplus\r
 extern "C" {\r
 #endif\r
-\r
-/// Set seed for random numbers\r
-void MGL_EXPORT mgl_srnd(long seed);\r
-void MGL_EXPORT mgl_srnd_(int *seed);\r
-/// Get random number\r
-double MGL_EXPORT mgl_rnd();\r
-double MGL_EXPORT mgl_rnd_();\r
 /// Get integer power of x\r
 double MGL_EXPORT_CONST mgl_ipow(double x,int n);\r
-double MGL_EXPORT_PURE mgl_ipow_(mreal *x,int *n);\r
+double MGL_EXPORT mgl_ipow_(mreal *x,int *n);\r
 /// Get number of seconds since 1970 for given string\r
 double MGL_EXPORT mgl_get_time(const char *time, const char *fmt);\r
 double MGL_EXPORT mgl_get_time_(const char *time, const char *fmt,int,int);\r
@@ -200,7 +193,7 @@ void MGL_EXPORT mgl_data_squeeze_(uintptr_t *dat, int *rx,int *ry,int *rz,int *s
 /// Returns pointer to data element [i,j,k]\r
 MGL_EXPORT mreal *mgl_data_value(HMDT dat, long i,long j,long k);\r
 /// Returns pointer to internal data array\r
-MGL_EXPORT_PURE mreal *mgl_data_data(HMDT dat);\r
+MGL_EXPORT mreal *mgl_data_data(HMDT dat);\r
 \r
 /// Gets the x-size of the data.\r
 long MGL_EXPORT mgl_data_get_nx(HCDT d);\r
@@ -229,6 +222,12 @@ void MGL_EXPORT mgl_data_join(HMDT dat, HCDT d);
 void MGL_EXPORT mgl_data_join_(uintptr_t *dat, uintptr_t *d);\r
 \r
 /// Smooth the data on specified direction or directions\r
+/** String \a dir may contain:\r
+ *  ‘x’, ‘y’, ‘z’ for 1st, 2nd or 3d dimension;\r
+ *  ‘dN’ for linear averaging over N points;\r
+ *  ‘3’ for linear averaging over 3 points;\r
+ *  ‘5’ for linear averaging over 5 points.\r
+ *  By default quadratic averaging over 5 points is used. */\r
 void MGL_EXPORT mgl_data_smooth(HMDT d, const char *dirs, mreal delta);\r
 void MGL_EXPORT mgl_data_smooth_(uintptr_t *dat, const char *dirs, mreal *delta,int);\r
 /// Get array which is result of summation in given direction or directions\r
@@ -283,6 +282,15 @@ void MGL_EXPORT mgl_data_fill_sample_(uintptr_t *dat, const char *how,int);
 /// Find correlation between 2 data arrays\r
 HMDT MGL_EXPORT mgl_data_correl(HCDT dat1, HCDT dat2, const char *dir);\r
 uintptr_t MGL_EXPORT mgl_data_correl_(uintptr_t *dat1, uintptr_t *dat2, const char *dir,int);\r
+/// Apply wavelet transform\r
+/** Parameter \a dir may contain:\r
+ * ‘x‘,‘y‘,‘z‘ for directions,\r
+ * ‘d‘ for daubechies, ‘D‘ for centered daubechies,\r
+ * ‘h‘ for haar, ‘H‘ for centered haar,\r
+ * ‘b‘ for bspline, ‘B‘ for centered bspline,\r
+ * ‘i‘ for applying inverse transform. */\r
+void MGL_EXPORT mgl_data_wavelet(HMDT dat, const char *how, int k);\r
+void MGL_EXPORT mgl_data_wavelet_(uintptr_t *d, const char *dir, int *k,int);\r
 \r
 /// Allocate and prepare data for Fourier transform by nthr threads\r
 MGL_EXPORT void *mgl_fft_alloc(long n, void **space, long nthr);\r
@@ -296,14 +304,14 @@ void MGL_EXPORT mgl_fft(double *x, long s, long n, const void *wt, void *ws, int
 void MGL_EXPORT mgl_clear_fft();\r
 \r
 /// Interpolate by cubic spline the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1]\r
-mreal MGL_EXPORT_PURE mgl_data_spline(HCDT dat, mreal x,mreal y,mreal z);\r
-mreal MGL_EXPORT_PURE mgl_data_spline_(uintptr_t *dat, mreal *x,mreal *y,mreal *z);\r
+mreal MGL_EXPORT mgl_data_spline(HCDT dat, mreal x,mreal y,mreal z);\r
+mreal MGL_EXPORT mgl_data_spline_(uintptr_t *dat, mreal *x,mreal *y,mreal *z);\r
 /// Interpolate by linear function the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1]\r
-mreal MGL_EXPORT_PURE mgl_data_linear(HCDT dat, mreal x,mreal y,mreal z);\r
-mreal MGL_EXPORT_PURE mgl_data_linear_(uintptr_t *dat, mreal *x,mreal *y,mreal *z);\r
+mreal MGL_EXPORT mgl_data_linear(HCDT dat, mreal x,mreal y,mreal z);\r
+mreal MGL_EXPORT mgl_data_linear_(uintptr_t *dat, mreal *x,mreal *y,mreal *z);\r
 /// Interpolate by cubic spline the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1]\r
-mreal MGL_EXPORT_PURE mgl_data_spline_ext(HCDT dat, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz);\r
-mreal MGL_EXPORT_PURE mgl_data_spline_ext_(uintptr_t *dat, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz);\r
+mreal MGL_EXPORT mgl_data_spline_ext(HCDT dat, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz);\r
+mreal MGL_EXPORT mgl_data_spline_ext_(uintptr_t *dat, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz);\r
 /// Prepare coefficients for global spline interpolation\r
 HMDT MGL_EXPORT mgl_gspline_init(HCDT x, HCDT v);\r
 uintptr_t MGL_EXPORT mgl_gspline_init_(uintptr_t *x, uintptr_t *v);\r
@@ -311,11 +319,11 @@ uintptr_t MGL_EXPORT mgl_gspline_init_(uintptr_t *x, uintptr_t *v);
 mreal MGL_EXPORT mgl_gspline(HCDT coef, mreal dx, mreal *d1, mreal *d2);\r
 mreal MGL_EXPORT mgl_gspline_(uintptr_t *c, mreal *dx, mreal *d1, mreal *d2);\r
 /// Interpolate by linear function the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1]\r
-mreal MGL_EXPORT_PURE mgl_data_linear_ext(HCDT dat, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz);\r
-mreal MGL_EXPORT_PURE mgl_data_linear_ext_(uintptr_t *dat, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz);\r
+mreal MGL_EXPORT mgl_data_linear_ext(HCDT dat, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz);\r
+mreal MGL_EXPORT mgl_data_linear_ext_(uintptr_t *dat, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz);\r
 /// Return an approximated x-value (root) when dat(x) = val\r
-mreal MGL_EXPORT_PURE mgl_data_solve_1d(HCDT dat, mreal val, int spl, long i0);\r
-mreal MGL_EXPORT_PURE mgl_data_solve_1d_(uintptr_t *dat, mreal *val, int *spl, int *i0);\r
+mreal MGL_EXPORT mgl_data_solve_1d(HCDT dat, mreal val, int spl, long i0);\r
+mreal MGL_EXPORT mgl_data_solve_1d_(uintptr_t *dat, mreal *val, int *spl, int *i0);\r
 /// Return an approximated value (root) when dat(x) = val\r
 HMDT MGL_EXPORT mgl_data_solve(HCDT dat, mreal val, char dir, HCDT i0, int norm);\r
 uintptr_t MGL_EXPORT mgl_data_solve_(uintptr_t *dat, mreal *val, const char *dir, uintptr_t *i0, int *norm,int);\r
@@ -416,12 +424,12 @@ uintptr_t MGL_EXPORT mgl_create_expr_(const char *expr, int);
 void MGL_EXPORT mgl_delete_expr(HMEX ex);\r
 void MGL_EXPORT mgl_delete_expr_(uintptr_t *ex);\r
 /// Return value of expression for given x,y,z variables\r
-double MGL_EXPORT_PURE mgl_expr_eval(HMEX ex, double x, double y,double z);\r
+double MGL_EXPORT mgl_expr_eval(HMEX ex, double x, double y,double z);\r
 double MGL_EXPORT mgl_expr_eval_(uintptr_t *ex, mreal *x, mreal *y, mreal *z);\r
 /// Return value of expression for given variables\r
 double MGL_EXPORT mgl_expr_eval_v(HMEX ex, mreal *vars);\r
 /// Return value of expression differentiation over variable dir for given x,y,z variables\r
-double MGL_EXPORT_PURE mgl_expr_diff(HMEX ex, char dir, double x, double y,double z);\r
+double MGL_EXPORT mgl_expr_diff(HMEX ex, char dir, double x, double y,double z);\r
 double MGL_EXPORT mgl_expr_diff_(uintptr_t *ex, const char *dir, mreal *x, mreal *y, mreal *z, int);\r
 /// Return value of expression differentiation over variable dir for given variables\r
 double MGL_EXPORT mgl_expr_diff_v(HMEX ex, char dir, mreal *vars);\r
index 55d29d1a944fcc831fe6e7c4068e21270a3e4740..70d71d80e7fc499223fadc2ff2d5e822da630451 100644 (file)
@@ -77,6 +77,17 @@ using mglDataA::Momentum;
        mglDataC(long xx=1,long yy=1,long zz=1) {       a=0;    Create(xx,yy,zz);       }\r
        /// Delete the array\r
        virtual ~mglDataC()     {       if(!link && a)  delete []a;     }\r
+\r
+       /// Move all data from variable d, and delete this variable.\r
+       inline void Move(mglDataC *d)   // NOTE: Variable d will be deleted!!!\r
+       {       if(d && d->GetNN()>1)\r
+               {       bool l=link;    dual *b=a;\r
+                       nx=d->nx;       ny=d->ny;       nz=d->nz;       a=d->a; d->a=b;\r
+                       temp=d->temp;   func=d->func;   o=d->o; s=d->s;\r
+                       id=d->id;       link=d->link;   d->link=l;      delete d;       }\r
+               else if(d)      {       *this = d->a[0];        delete d;       }\r
+       }\r
+\r
        inline dual GetVal(long i, long j=0, long k=0) const\r
        {       return mgl_datac_get_value(this,i,j,k);}\r
        inline void SetVal(dual f, long i, long j=0, long k=0)\r
@@ -175,6 +186,27 @@ using mglDataA::Momentum;
        /// Equidistantly fill the data to range [x1,x2] in direction dir\r
        inline void Fill(dual x1,dual x2=mglNaN,char dir='x')\r
        {       mgl_datac_fill(this,x1,x2,dir); }\r
+       \r
+               /// Fill the data by interpolated values of vdat parametrically depended on xdat,ydat,zdat for x,y,z in range [p1,p2] using global spline\r
+       inline void RefillGS(const mglDataA &xdat, const mglDataA &vdat, mreal x1, mreal x2,long sl=-1)\r
+       {       mgl_datac_refill_gs(this,&xdat,&vdat,x1,x2,sl); }\r
+       /// Fill the data by interpolated values of vdat parametrically depended on xdat,ydat,zdat for x,y,z in range [p1,p2]\r
+       inline void Refill(const mglDataA &xdat, const mglDataA &vdat, mreal x1, mreal x2,long sl=-1)\r
+       {       mgl_datac_refill_x(this,&xdat,&vdat,x1,x2,sl);  }\r
+       inline void Refill(const mglDataA &xdat, const mglDataA &vdat, mglPoint p1, mglPoint p2,long sl=-1)\r
+       {       mgl_datac_refill_x(this,&xdat,&vdat,p1.x,p2.x,sl);      }\r
+       inline void Refill(const mglDataA &xdat, const mglDataA &ydat, const mglDataA &vdat, mglPoint p1, mglPoint p2,long sl=-1)\r
+       {       mgl_datac_refill_xy(this,&xdat,&ydat,&vdat,p1.x,p2.x,p1.y,p2.y,sl);     }\r
+       inline void Refill(const mglDataA &xdat, const mglDataA &ydat, const mglDataA &zdat, const mglDataA &vdat, mglPoint p1, mglPoint p2)\r
+       {       mgl_datac_refill_xyz(this,&xdat,&ydat,&zdat,&vdat,p1.x,p2.x,p1.y,p2.y,p1.z,p2.z);       }\r
+       /// Fill the data by interpolated values of vdat parametrically depended on xdat,ydat,zdat for x,y,z in axis range of gr\r
+       inline void Refill(HMGL gr, const mglDataA &xdat, const mglDataA &vdat, long sl=-1, const char *opt="")\r
+       {       mgl_datac_refill_gr(gr,this,&xdat,0,0,&vdat,sl,opt);    }\r
+       inline void Refill(HMGL gr, const mglDataA &xdat, const mglDataA &ydat, const mglDataA &vdat, long sl=-1, const char *opt="")\r
+       {       mgl_datac_refill_gr(gr,this,&xdat,&ydat,0,&vdat,sl,opt);        }\r
+       inline void Refill(HMGL gr, const mglDataA &xdat, const mglDataA &ydat, const mglDataA &zdat, const mglDataA &vdat, const char *opt="")\r
+       {       mgl_datac_refill_gr(gr,this,&xdat,&ydat,&zdat,&vdat,-1,opt);    }\r
+\r
 \r
                /// Put value to data element(s)\r
        inline void Put(dual val, long i=-1, long j=-1, long k=-1)\r
@@ -299,6 +331,12 @@ using mglDataA::Momentum;
        /// Mirror the data in given direction (useful for fourier spectrums)\r
        inline void Mirror(const char *dir)             {       mgl_datac_mirror(this,dir);     }\r
        /// Smooth the data on specified direction or directions\r
+       /** String \a dir may contain:\r
+        *  ‘x’, ‘y’, ‘z’ for 1st, 2nd or 3d dimension;\r
+        *  ‘dN’ for linear averaging over N points;\r
+        *  ‘3’ for linear averaging over 3 points;\r
+        *  ‘5’ for linear averaging over 5 points.\r
+        *  By default quadratic averaging over 5 points is used. */\r
        inline void Smooth(const char *dirs="xyz",mreal delta=0)\r
        {       mgl_datac_smooth(this,dirs,delta);      }\r
 \r
@@ -326,14 +364,14 @@ using mglDataA::Momentum;
        {\r
                dual val,dx,dy,dz;\r
                val = mgl_datac_linear_ext(this,x,y,z, &dx, &dy, &dz);\r
-               dif = mglPoint(dx.real(),dy.real(),dz.real());  return val;\r
+               dif.Set(dx.real(),dy.real(),dz.real()); return val;\r
        }\r
        /// Interpolate by line the data and return its derivatives at given point x,\a y,\a z which normalized in range [0, 1]\r
        inline dual Linear1(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const\r
        {\r
                dual val,dx,dy,dz;\r
                val = mgl_datac_linear_ext(this,x,y,z, &dx, &dy, &dz);\r
-               dif = mglPoint(dx.real(),dy.real(),dz.real());\r
+               dif.Set(dx.real(),dy.real(),dz.real());\r
                dif.x/=nx>1?nx-1:1;     dif.y/=ny>1?ny-1:1;     dif.z/=nz>1?nz-1:1;\r
                return val;\r
        }\r
@@ -352,9 +390,29 @@ using mglDataA::Momentum;
        inline const mglDataC &operator=(const mglDataC &d)\r
        {       if(this!=&d)    Set(&d);        return d;       }\r
        inline dual operator=(dual val)\r
-       {       for(long i=0;i<nx*ny*nz;i++)    a[i]=val;       return val;     }\r
+       {\r
+#pragma omp parallel for\r
+               for(long i=0;i<nx*ny*nz;i++)    a[i]=val;       return val;     }\r
        inline dual operator=(mreal val)\r
-       {       for(long i=0;i<nx*ny*nz;i++)    a[i]=val;       return val;     }\r
+       {\r
+#pragma omp parallel for\r
+               for(long i=0;i<nx*ny*nz;i++)    a[i]=val;       return val;     }\r
+       /// Multiply the data by other one for each element\r
+       inline void operator*=(const mglDataA &d)       {       mgl_datac_mul_dat(this,&d);     }\r
+       /// Divide the data by other one for each element\r
+       inline void operator/=(const mglDataA &d)       {       mgl_datac_div_dat(this,&d);     }\r
+       /// Add the other data\r
+       inline void operator+=(const mglDataA &d)       {       mgl_datac_add_dat(this,&d);     }\r
+       /// Subtract the other data\r
+       inline void operator-=(const mglDataA &d)       {       mgl_datac_sub_dat(this,&d);     }\r
+       /// Multiply each element by the number\r
+       inline void operator*=(dual d)          {       mgl_datac_mul_num(this,d);      }\r
+       /// Divide each element by the number\r
+       inline void operator/=(dual d)          {       mgl_datac_div_num(this,d);      }\r
+       /// Add the number\r
+       inline void operator+=(dual d)          {       mgl_datac_add_num(this,d);      }\r
+       /// Subtract the number\r
+       inline void operator-=(dual d)          {       mgl_datac_sub_num(this,d);      }\r
 #ifndef SWIG\r
        /// Direct access to the data cell\r
        inline dual &operator[](long i) {       return a[i];    }\r
@@ -386,9 +444,9 @@ using mglDataA::Momentum;
 };\r
 //-----------------------------------------------------------------------------\r
 #ifndef SWIG\r
-dual MGL_EXPORT_PURE mglLinearC(const dual *a, long nx, long ny, long nz, mreal x, mreal y, mreal z);\r
-dual MGL_EXPORT_PURE mglSpline3C(const dual *a, long nx, long ny, long nz, mreal x, mreal y, mreal z,dual *dx=0, dual *dy=0, dual *dz=0);\r
-dual MGL_EXPORT_PURE mglSpline3Cs(const dual *a, long nx, long ny, long nz, mreal x, mreal y, mreal z);\r
+dual MGL_EXPORT mglLinearC(const dual *a, long nx, long ny, long nz, mreal x, mreal y, mreal z);\r
+dual MGL_EXPORT mglSpline3C(const dual *a, long nx, long ny, long nz, mreal x, mreal y, mreal z,dual *dx=0, dual *dy=0, dual *dz=0);\r
+dual MGL_EXPORT mglSpline3Cs(const dual *a, long nx, long ny, long nz, mreal x, mreal y, mreal z);\r
 #endif\r
 //-----------------------------------------------------------------------------\r
 /// Saves result of PDE solving (|u|^2) for "Hamiltonian" ham with initial conditions ini\r
@@ -405,6 +463,16 @@ inline mglDataC mglQO3dc(const char *ham, const mglDataA &ini_re, const mglDataA
 inline mglDataC mglQO3dc(const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, const mglDataA &ray, mglData &xx, mglData &yy, mglData &zz, mreal r=1, mreal k0=100)\r
 {      return mglDataC(true, mgl_qo3d_solve_c(ham, &ini_re, &ini_im, &ray, r, k0, &xx, &yy, &zz));     }\r
 //-----------------------------------------------------------------------------\r
+/// Get sub-array of the data with given fixed indexes\r
+inline mglDataC mglSubDataC(const mglDataA &dat, long xx, long yy=-1, long zz=-1)\r
+{      return mglDataC(true,mgl_datac_subdata(&dat,xx,yy,zz)); }\r
+inline mglDataC mglSubDataC(const mglDataA &dat, const mglDataA &xx, const mglDataA &yy, const mglDataA &zz)\r
+{      return mglDataC(true,mgl_datac_subdata_ext(&dat,&xx,&yy,&zz));  }\r
+inline mglDataC mglSubDataC(const mglDataA &dat, const mglDataA &xx, const mglDataA &yy)\r
+{      return mglDataC(true,mgl_datac_subdata_ext(&dat,&xx,&yy,0));    }\r
+inline mglDataC mglSubDataC(const mglDataA &dat, const mglDataA &xx)\r
+{      return mglDataC(true,mgl_datac_subdata_ext(&dat,&xx,0,0));      }\r
+//-----------------------------------------------------------------------------\r
 /// Prepare coefficients for global spline interpolation\r
 inline mglDataC mglGSplineCInit(const mglDataA &xdat, const mglDataA &ydat)\r
 {      return mglDataC(true,mgl_gsplinec_init(&xdat, &ydat));  }\r
index 7c04af617872e10bd12eea073190f1609effc4fd..9f4e21ea4c4e66dfec62a87ccc743ca346ac3571 100644 (file)
@@ -37,14 +37,9 @@ extern "C" {
 #else\r
 typedef void *HADT;\r
 #endif\r
-\r
-/// Set seed for random numbers\r
-void MGL_EXPORT mgl_srnd(long seed);\r
-/// Get random number\r
-double MGL_EXPORT mgl_rnd();\r
 /// Get integer power of x\r
 mdual MGL_EXPORT_CONST mgl_ipowc(dual x,int n);\r
-mdual MGL_EXPORT_PURE mgl_ipowc_(dual *x,int *n);\r
+mdual MGL_EXPORT mgl_ipowc_(dual *x,int *n);\r
 /// Get exp(i*a)\r
 mdual MGL_EXPORT_CONST mgl_expi(dual a);\r
 \r
@@ -94,7 +89,7 @@ void MGL_EXPORT mgl_datac_set_values(HADT dat, const char *val, long nx, long ny
 void MGL_EXPORT mgl_datac_set_values_(uintptr_t *d, const char *val, int *nx, int *ny, int *nz, int l);\r
 \r
 /// Returns pointer to internal data array\r
-MGL_EXPORT_PURE dual *mgl_datac_data(HADT dat);\r
+MGL_EXPORT dual *mgl_datac_data(HADT dat);\r
 /// Returns pointer to data element [i,j,k]\r
 MGL_EXPORT dual *mgl_datac_value(HADT dat, long i,long j,long k);\r
 \r
@@ -178,6 +173,22 @@ void MGL_EXPORT mgl_datac_fill_(uintptr_t *dat, dual *x1,dual *x2,const char *di
 /// Modify the data by specified formula assuming x,y,z in range [r1,r2]\r
 void MGL_EXPORT mgl_datac_fill_eq(HMGL gr, HADT dat, const char *eq, HCDT vdat, HCDT wdat,const char *opt);\r
 void MGL_EXPORT mgl_datac_fill_eq_(uintptr_t *gr, uintptr_t *dat, const char *eq, uintptr_t *vdat, uintptr_t *wdat,const char *opt, int, int);\r
+/// Fill dat by interpolated values of vdat parametrically depended on xdat for x in range [x1,x2] using global spline\r
+void MGL_EXPORT mgl_datac_refill_gs(HADT dat, HCDT xdat, HCDT vdat, mreal x1, mreal x2, long sl);\r
+void MGL_EXPORT mgl_datac_refill_gs_(uintptr_t *dat, uintptr_t *xdat, uintptr_t *vdat, mreal *x1, mreal *x2, long *sl);\r
+/// Fill dat by interpolated values of vdat parametrically depended on xdat for x in range [x1,x2]\r
+void MGL_EXPORT mgl_datac_refill_x(HADT dat, HCDT xdat, HCDT vdat, mreal x1, mreal x2, long sl);\r
+void MGL_EXPORT mgl_datac_refill_x_(uintptr_t *dat, uintptr_t *xdat, uintptr_t *vdat, mreal *x1, mreal *x2, long *sl);\r
+/// Fill dat by interpolated values of vdat parametrically depended on xdat,ydat for x,y in range [x1,x2]*[y1,y2]\r
+void MGL_EXPORT mgl_datac_refill_xy(HADT dat, HCDT xdat, HCDT ydat, HCDT vdat, mreal x1, mreal x2, mreal y1, mreal y2, long sl);\r
+void MGL_EXPORT mgl_datac_refill_xy_(uintptr_t *dat, uintptr_t *xdat, uintptr_t *ydat, uintptr_t *vdat, mreal *x1, mreal *x2, mreal *y1, mreal *y2, long *sl);\r
+/// Fill dat by interpolated values of vdat parametrically depended on xdat,ydat,zdat for x,y,z in range [x1,x2]*[y1,y2]*[z1,z2]\r
+void MGL_EXPORT mgl_datac_refill_xyz(HADT dat, HCDT xdat, HCDT ydat, HCDT zdat, HCDT vdat, mreal x1, mreal x2, mreal y1, mreal y2, mreal z1, mreal z2);\r
+void MGL_EXPORT mgl_datac_refill_xyz_(uintptr_t *dat, uintptr_t *xdat, uintptr_t *ydat, uintptr_t *zdat, uintptr_t *vdat, mreal *x1, mreal *x2, mreal *y1, mreal *y2, mreal *z1, mreal *z2);\r
+/// Fill dat by interpolated values of vdat parametrically depended on xdat,ydat,zdat for x,y,z in axis range\r
+void MGL_EXPORT mgl_datac_refill_gr(HMGL gr, HADT dat, HCDT xdat, HCDT ydat, HCDT zdat, HCDT vdat, long sl, const char *opt);\r
+void MGL_EXPORT mgl_datac_refill_gr_(uintptr_t *gr, uintptr_t *dat, uintptr_t *xdat, uintptr_t *ydat, uintptr_t *zdat, uintptr_t *vdat, long *sl, const char *opt,int);\r
+\r
 /// Modify the data by specified formula\r
 void MGL_EXPORT mgl_datac_modify(HADT dat, const char *eq,long dim);\r
 void MGL_EXPORT mgl_datac_modify_(uintptr_t *dat, const char *eq,int *dim,int);\r
@@ -209,6 +220,12 @@ void MGL_EXPORT mgl_datac_join(HADT dat, HCDT d);
 void MGL_EXPORT mgl_datac_join_(uintptr_t *dat, uintptr_t *d);\r
 \r
 /// Smooth the data on specified direction or directions\r
+/** String \a dir may contain:\r
+ *  ‘x’, ‘y’, ‘z’ for 1st, 2nd or 3d dimension;\r
+ *  ‘dN’ for linear averaging over N points;\r
+ *  ‘3’ for linear averaging over 3 points;\r
+ *  ‘5’ for linear averaging over 5 points.\r
+ *  By default quadratic averaging over 5 points is used. */\r
 void MGL_EXPORT mgl_datac_smooth(HADT d, const char *dirs, mreal delta);\r
 void MGL_EXPORT mgl_datac_smooth_(uintptr_t *dat, const char *dirs, mreal *delta,int);\r
 /// Cumulative summation the data in given direction or directions\r
@@ -236,6 +253,31 @@ void MGL_EXPORT mgl_datac_mirror_(uintptr_t *dat, const char *dir,int);
 void MGL_EXPORT mgl_datac_crop(HADT dat, long n1, long n2, char dir);\r
 void MGL_EXPORT mgl_datac_crop_(uintptr_t *dat, int *n1, int *n2, const char *dir,int);\r
 \r
+/// Multiply the data by other one for each element\r
+void MGL_EXPORT mgl_datac_mul_dat(HADT dat, HCDT d);\r
+void MGL_EXPORT mgl_datac_mul_dat_(uintptr_t *dat, uintptr_t *d);\r
+/// Divide the data by other one for each element\r
+void MGL_EXPORT mgl_datac_div_dat(HADT dat, HCDT d);\r
+void MGL_EXPORT mgl_datac_div_dat_(uintptr_t *dat, uintptr_t *d);\r
+/// Add the other data\r
+void MGL_EXPORT mgl_datac_add_dat(HADT dat, HCDT d);\r
+void MGL_EXPORT mgl_datac_add_dat_(uintptr_t *dat, uintptr_t *d);\r
+/// Subtract the other data\r
+void MGL_EXPORT mgl_datac_sub_dat(HADT dat, HCDT d);\r
+void MGL_EXPORT mgl_datac_sub_dat_(uintptr_t *dat, uintptr_t *d);\r
+/// Multiply each element by the number\r
+void MGL_EXPORT mgl_datac_mul_num(HADT dat, dual d);\r
+void MGL_EXPORT mgl_datac_mul_num_(uintptr_t *dat, dual *d);\r
+/// Divide each element by the number\r
+void MGL_EXPORT mgl_datac_div_num(HADT dat, dual d);\r
+void MGL_EXPORT mgl_datac_div_num_(uintptr_t *dat, dual *d);\r
+/// Add the number\r
+void MGL_EXPORT mgl_datac_add_num(HADT dat, dual d);\r
+void MGL_EXPORT mgl_datac_add_num_(uintptr_t *dat, dual *d);\r
+/// Subtract the number\r
+void MGL_EXPORT mgl_datac_sub_num(HADT dat, dual d);\r
+void MGL_EXPORT mgl_datac_sub_num_(uintptr_t *dat, dual *d);\r
+\r
 /// Apply Hankel transform\r
 void MGL_EXPORT mgl_datac_hankel(HADT dat, const char *dir);\r
 void MGL_EXPORT mgl_datac_hankel_(uintptr_t *dat, const char *dir,int);\r
@@ -259,17 +301,17 @@ HMDT MGL_EXPORT mgl_datac_arg(HCDT dat);
 uintptr_t MGL_EXPORT mgl_datac_arg_(uintptr_t *dat);\r
 \r
 /// Interpolate by linear function the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1]\r
-mdual MGL_EXPORT_PURE mgl_datac_linear(HCDT d, mreal x,mreal y,mreal z);\r
-mdual MGL_EXPORT_PURE mgl_datac_linear_(uintptr_t *d, mreal *x,mreal *y,mreal *z);\r
+mdual MGL_EXPORT mgl_datac_linear(HCDT d, mreal x,mreal y,mreal z);\r
+mdual MGL_EXPORT mgl_datac_linear_(uintptr_t *d, mreal *x,mreal *y,mreal *z);\r
 /// Interpolate by linear function the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1]\r
-mdual MGL_EXPORT_PURE mgl_datac_linear_ext(HCDT d, mreal x,mreal y,mreal z, dual *dx,dual *dy,dual *dz);\r
-mdual MGL_EXPORT_PURE mgl_datac_linear_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, dual *dx,dual *dy,dual *dz);\r
+mdual MGL_EXPORT mgl_datac_linear_ext(HCDT d, mreal x,mreal y,mreal z, dual *dx,dual *dy,dual *dz);\r
+mdual MGL_EXPORT mgl_datac_linear_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, dual *dx,dual *dy,dual *dz);\r
 /// Interpolate by cubic spline the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1]\r
-mdual MGL_EXPORT_PURE mgl_datac_spline(HCDT dat, mreal x,mreal y,mreal z);\r
-mdual MGL_EXPORT_PURE mgl_datac_spline_(uintptr_t *dat, mreal *x,mreal *y,mreal *z);\r
+mdual MGL_EXPORT mgl_datac_spline(HCDT dat, mreal x,mreal y,mreal z);\r
+mdual MGL_EXPORT mgl_datac_spline_(uintptr_t *dat, mreal *x,mreal *y,mreal *z);\r
 /// Interpolate by cubic spline the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1]\r
-mdual MGL_EXPORT_PURE mgl_datac_spline_ext(HCDT dat, mreal x,mreal y,mreal z, dual *dx,dual *dy,dual *dz);\r
-mdual MGL_EXPORT_PURE mgl_datac_spline_ext_(uintptr_t *dat, mreal *x,mreal *y,mreal *z, dual *dx,dual *dy,dual *dz);\r
+mdual MGL_EXPORT mgl_datac_spline_ext(HCDT dat, mreal x,mreal y,mreal z, dual *dx,dual *dy,dual *dz);\r
+mdual MGL_EXPORT mgl_datac_spline_ext_(uintptr_t *dat, mreal *x,mreal *y,mreal *z, dual *dx,dual *dy,dual *dz);\r
 /// Prepare coefficients for global spline interpolation\r
 HADT MGL_EXPORT mgl_gsplinec_init(HCDT x, HCDT v);\r
 uintptr_t MGL_EXPORT mgl_gspline_init_(uintptr_t *x, uintptr_t *v);\r
@@ -284,7 +326,7 @@ uintptr_t MGL_EXPORT mgl_create_cexpr_(const char *expr, int);
 void MGL_EXPORT mgl_delete_cexpr(HAEX ex);\r
 void MGL_EXPORT mgl_delete_cexpr_(uintptr_t *ex);\r
 /// Return value of expression for given x,y,z variables\r
-mdual MGL_EXPORT_PURE mgl_cexpr_eval(HAEX ex, dual x, dual y,dual z);\r
+mdual MGL_EXPORT mgl_cexpr_eval(HAEX ex, dual x, dual y,dual z);\r
 mdual MGL_EXPORT mgl_cexpr_eval_(uintptr_t *ex, dual *x, dual *y, dual *z);\r
 /// Return value of expression for given variables\r
 mdual MGL_EXPORT mgl_cexpr_eval_v(HAEX ex, dual *vars);\r
index ef91810e4f8c2482d7d6b2c1f07f31619ae8ad26..a87d414b771b4e3fd95279736c44964e19f2cdae 100644 (file)
@@ -47,8 +47,6 @@
 #endif\r
 \r
 #endif\r
-\r
-#define MGL_VER2       3.1     // minor version of MathGL 2.* (like 1.3 for v.2.1.3)\r
 //-----------------------------------------------------------------------------\r
 #ifdef WIN32 //_MSC_VER needs this before math.h\r
 #define        _USE_MATH_DEFINES\r
@@ -97,11 +95,14 @@ typedef unsigned long uintptr_t;
 #if (_MSC_VER<=1800)\r
 #define collapse(a)    // MSVS don't support OpenMP 3.*\r
 #define strtoull _strtoui64\r
-#define hypot  _hypot\r
+//#define hypot        _hypot\r
 #define getcwd _getcwd\r
 #define chdir  _chdir // BORLAND has chdir\r
 #endif\r
 #define snprintf _snprintf\r
+#if (_MSC_VER<1600) // based on https://hg.python.org/cpython/rev/9aedb876c2d7\r
+#define hypot  _hypot\r
+#endif\r
 #endif\r
 \r
 #if !MGL_SYS_NAN\r
@@ -167,6 +168,7 @@ typedef float mreal;
 #define mgl_min(a,b)   ({typeof (a) _a = (a); typeof (b) _b = (b); _a > _b ? _b : _a;})\r
 #define mgl_max(a,b)   ({typeof (a) _a = (a); typeof (b) _b = (b); _a > _b ? _a : _b;})\r
 #define mgl_sign(a)            ({typeof (a) _a = (a); _a<0 ? -1:1;})\r
+#define mgl_int(a)             ({typeof (a) _a = (a); long(_a+(_a>=0 ? 0.5:-0.5));})\r
 #else\r
 #define mgl_min(a,b)   (((a)>(b)) ? (b) : (a))\r
 #define mgl_max(a,b)   (((a)>(b)) ? (a) : (b))\r
@@ -175,6 +177,7 @@ typedef float mreal;
 #define mgl_isfin(a)   ((a)-(a)==mreal(0.))\r
 #define mgl_isbad(a)   ((a)-(a)!=mreal(0.))\r
 #define mgl_sign(a)            ((a)<0 ? -1:1)\r
+#define mgl_int(a)             (long(a+((a)>=0 ? 0.5:-0.5)))\r
 #endif\r
 //-----------------------------------------------------------------------------\r
 enum{  // types of predefined curvelinear coordinate systems\r
@@ -224,6 +227,7 @@ enum{       // Codes for warnings/messages
        mglScrCmd,              // Wrong command in MGL script\r
        mglScrLong,             // Too long line in MGL script\r
        mglScrStr,              // Unbalanced ' in MGL script\r
+       mglScrTemp,             // Change temporary data in MGL script\r
        mglWarnEnd              // Maximal number of warnings (must be last)\r
 };\r
 //-----------------------------------------------------------------------------\r
@@ -253,7 +257,7 @@ extern uint64_t mgl_mask_val[16];
 #define MGL_SHOW_POS           0x001000        ///< Switch to show or not mouse click position\r
 #define MGL_CLF_ON_UPD         0x002000        ///< Clear plot before Update()\r
 #define MGL_NOSUBTICKS         0x004000        ///< Disable subticks drawing (for bounding box)\r
-//#define MGL_DIFFUSIVE                0x008000        ///< Use diffusive light instead of specular\r
+#define MGL_LOCAL_LIGHT                0x008000        ///< Keep light sources for each inplot\r
 #define MGL_VECT_FRAME         0x010000        ///< Use DrwDat to remember all data of frames\r
 #define MGL_REDUCEACC          0x020000        ///< Reduce accuracy of points (to reduc size of output files)\r
 #define MGL_PREFERVC           0x040000        ///< Prefer vertex color instead of texture if output format supports\r
@@ -264,15 +268,13 @@ extern uint64_t mgl_mask_val[16];
 #include <complex.h>\r
 #if MGL_USE_DOUBLE\r
 typedef double _Complex mdual;\r
-#ifndef _Complex_I\r
-#define _Complex_I (double _Complex){0, 1}\r
-#endif\r
 #else\r
 typedef float _Complex mdual;\r
-#ifndef _Complex_I\r
-#define _Complex_I (float _Complex){0, 1}\r
 #endif\r
+#ifndef _Complex_I\r
+#define _Complex_I     1.0i\r
 #endif\r
+const mdual mgl_I=_Complex_I;\r
 #define mgl_abs(x)     cabs(x)\r
 #endif\r
 #ifdef __cplusplus\r
@@ -284,7 +286,7 @@ typedef std::complex<mreal> dual;
 typedef std::complex<double> ddual;\r
 #if !MGL_HAVE_C99_COMPLEX\r
 #define mdual dual\r
-#define _Complex_I dual(0,1)\r
+#define mgl_I dual(0,1)\r
 #define mgl_abs(x)     abs(x)\r
 #endif\r
 //-----------------------------------------------------------------------------\r
@@ -297,15 +299,15 @@ typedef double _Complex ddual;
 /// Find length of wchar_t string (bypass standard wcslen bug)\r
 double MGL_EXPORT_CONST mgl_hypot(double x, double y);\r
 /// Find length of wchar_t string (bypass standard wcslen bug)\r
-size_t MGL_EXPORT_PURE mgl_wcslen(const wchar_t *str);\r
+size_t MGL_EXPORT mgl_wcslen(const wchar_t *str);\r
 /// Get RGB values for given color id or fill by -1 if no one found\r
 void MGL_EXPORT mgl_chrrgb(char id, float rgb[3]);\r
 /// Check if string contain color id and return its number\r
-long MGL_EXPORT_PURE mgl_have_color(const char *stl);\r
+long MGL_EXPORT mgl_have_color(const char *stl);\r
 /// Find symbol in string excluding {} and return its position or NULL\r
-MGL_EXPORT_PURE const char *mglchr(const char *str, char ch);\r
+MGL_EXPORT const char *mglchr(const char *str, char ch);\r
 /// Find any symbol from chr in string excluding {} and return its position or NULL\r
-MGL_EXPORT_PURE const char *mglchrs(const char *str, const char *chr);\r
+MGL_EXPORT const char *mglchrs(const char *str, const char *chr);\r
 /// Set number of thread for plotting and data handling (for pthread version only)\r
 void MGL_EXPORT mgl_set_num_thr(int n);\r
 void MGL_EXPORT mgl_set_num_thr_(int *n);\r
@@ -325,7 +327,7 @@ void MGL_EXPORT mgl_clear_fft();
 void MGL_EXPORT mgl_set_global_warn(const char *text);\r
 void MGL_EXPORT mgl_set_global_warn_(const char *text,int);\r
 /// Get text of global warning message(s)\r
-MGL_EXPORT_PURE const char *mgl_get_global_warn();\r
+MGL_EXPORT const char *mgl_get_global_warn();\r
 int MGL_EXPORT mgl_get_global_warn_(char *out, int len);\r
 #ifdef __cplusplus\r
 }\r
index 8dda570d287a89f765dfe1b5c2ba675f87abbfdf..82e3144b753276ee706e301eee6efd0c81edd911 100644 (file)
@@ -27,44 +27,61 @@ extern "C" {
 //-----------------------------------------------------------------------------\r
 extern int mglFitPnts;                 ///< Number of output points in fitting\r
 extern char mglFitRes[1024];   ///< Last fitted formula\r
+/// Fit data along x-direction for each data row. Return array with values for found formula.\r
 HMDT MGL_EXPORT mgl_fit_1(HMGL gr, HCDT y, const char *eq, const char *vars, HMDT ini, const char *opt);\r
+uintptr_t MGL_EXPORT mgl_fit_1_(uintptr_t* gr, uintptr_t* y, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n);\r
+/// Fit data along x-, y-directions for each data slice. Return array with values for found formula.\r
 HMDT MGL_EXPORT mgl_fit_2(HMGL gr, HCDT z, const char *eq, const char *vars, HMDT ini, const char *opt);\r
+uintptr_t MGL_EXPORT mgl_fit_2_(uintptr_t* gr, uintptr_t* z, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n);\r
+/// Fit data along along all directions. Return array with values for found formula.\r
 HMDT MGL_EXPORT mgl_fit_3(HMGL gr, HCDT a, const char *eq, const char *vars, HMDT ini, const char *opt);\r
+uintptr_t MGL_EXPORT mgl_fit_3_(uintptr_t* gr, uintptr_t* a, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n);\r
+/// Fit data along x-direction for each data row. Return array with values for found formula.\r
 HMDT MGL_EXPORT mgl_fit_xy(HMGL gr, HCDT x, HCDT y, const char *eq, const char *vars, HMDT ini, const char *opt);\r
+uintptr_t MGL_EXPORT mgl_fit_xy_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n);\r
+/// Fit data along x-, y-directions for each data slice. Return array with values for found formula.\r
 HMDT MGL_EXPORT mgl_fit_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *eq, const char *vars, HMDT ini, const char *opt);\r
+uintptr_t MGL_EXPORT mgl_fit_xyz_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n);\r
+/// Fit data along along all directions. Return array with values for found formula.\r
 HMDT MGL_EXPORT mgl_fit_xyza(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *eq, const char *vars, HMDT ini, const char *opt);\r
+uintptr_t MGL_EXPORT mgl_fit_xyza_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, uintptr_t* a, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n);\r
+       /// Fit data with dispersion s along x-direction for each data row. Return array with values for found formula.\r
 HMDT MGL_EXPORT mgl_fit_ys(HMGL gr, HCDT y, HCDT s, const char *eq, const char *vars, HMDT ini, const char *opt);\r
+uintptr_t MGL_EXPORT mgl_fit_ys_(uintptr_t* gr, uintptr_t* y, uintptr_t* ss, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n);\r
 HMDT MGL_EXPORT mgl_fit_xys(HMGL gr, HCDT x, HCDT y, HCDT s, const char *eq, const char *vars, HMDT ini, const char *opt);\r
+uintptr_t MGL_EXPORT mgl_fit_xys_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* ss, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n);\r
+       /// Fit data with dispersion s along x-, y-directions for each data slice. Return array with values for found formula.\r
 HMDT MGL_EXPORT mgl_fit_xyzs(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT s, const char *eq, const char *vars, HMDT ini, const char *opt);\r
+uintptr_t MGL_EXPORT mgl_fit_xyzs_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, uintptr_t* ss, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n);\r
 HMDT MGL_EXPORT mgl_fit_xyzas(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, HCDT s, const char *eq, const char *vars, HMDT ini, const char *opt);\r
+uintptr_t MGL_EXPORT mgl_fit_xyzas_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, uintptr_t* a, uintptr_t* ss, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n);\r
 \r
-MGL_EXPORT_CONST const char *mgl_get_fit(HMGL gr);\r
+/// Get last fitted formula\r
+MGL_EXPORT const char *mgl_get_fit(HMGL gr);\r
 int MGL_EXPORT mgl_get_fit_(uintptr_t *gr, char *out, int len);\r
 \r
+/// Make histogram (distribution) of data. This function do not plot data.\r
+/** Option "value" sets the size of output array (default is mglFitPnts=100). */\r
 HMDT MGL_EXPORT mgl_hist_x(HMGL gr, HCDT x, HCDT a, const char *opt);\r
-HMDT MGL_EXPORT mgl_hist_xy(HMGL gr, HCDT x, HCDT y, HCDT a, const char *opt);\r
-HMDT MGL_EXPORT mgl_hist_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *opt);\r
-\r
-void MGL_EXPORT mgl_puts_fit(HMGL gr, double x, double y, double z, const char *prefix, const char *font, double size);\r
-mreal MGL_EXPORT mgl_get_fit_chi();\r
-//-----------------------------------------------------------------------------\r
-uintptr_t MGL_EXPORT mgl_fit_1_(uintptr_t* gr, uintptr_t* y, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n);\r
-uintptr_t MGL_EXPORT mgl_fit_2_(uintptr_t* gr, uintptr_t* z, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n);\r
-uintptr_t MGL_EXPORT mgl_fit_3_(uintptr_t* gr, uintptr_t* a, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n);\r
-uintptr_t MGL_EXPORT mgl_fit_xy_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n);\r
-uintptr_t MGL_EXPORT mgl_fit_xyz_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n);\r
-uintptr_t MGL_EXPORT mgl_fit_xyza_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, uintptr_t* a, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n);\r
-uintptr_t MGL_EXPORT mgl_fit_ys_(uintptr_t* gr, uintptr_t* y, uintptr_t* ss, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n);\r
-uintptr_t MGL_EXPORT mgl_fit_xys_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* ss, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n);\r
-uintptr_t MGL_EXPORT mgl_fit_xyzs_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, uintptr_t* ss, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n);\r
-uintptr_t MGL_EXPORT mgl_fit_xyzas_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, uintptr_t* a, uintptr_t* ss, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n);\r
-\r
 uintptr_t MGL_EXPORT mgl_hist_x_(uintptr_t* gr, uintptr_t* x, uintptr_t* a, const char *opt,int);\r
+/// Make histogram (distribution) of data. This function do not plot data.\r
+/** Option "value" sets the size of output array (default is mglFitPnts=100). */\r
+HMDT MGL_EXPORT mgl_hist_xy(HMGL gr, HCDT x, HCDT y, HCDT a, const char *opt);\r
 uintptr_t MGL_EXPORT mgl_hist_xy_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* a, const char *opt,int);\r
+/// Make histogram (distribution) of data. This function do not plot data.\r
+/** Option "value" sets the size of output array (default is mglFitPnts=100). */\r
+HMDT MGL_EXPORT mgl_hist_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *opt);\r
 uintptr_t MGL_EXPORT mgl_hist_xyz_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, uintptr_t* a, const char *opt,int);\r
 \r
+/// Print fitted last formula (with coefficients)\r
+void MGL_EXPORT mgl_puts_fit(HMGL gr, double x, double y, double z, const char *prefix, const char *font, double size);\r
 void MGL_EXPORT mgl_puts_fit_(uintptr_t* gr, mreal *x, mreal *y, mreal *z, const char *prefix, const char *font, mreal *size, int l, int n);\r
+/// Get chi for last fitted formula\r
+mreal MGL_EXPORT mgl_get_fit_chi();\r
 mreal MGL_EXPORT mgl_get_fit_chi_();\r
+/// Get covariance matrix for last fitted formula\r
+HCDT MGL_EXPORT mgl_get_fit_covar();\r
+uintptr_t MGL_EXPORT mgl_get_fit_covar_();\r
 //-----------------------------------------------------------------------------\r
 #ifdef __cplusplus\r
 }\r
index dcb23b52d54ddbee7fc16d4b166b7d236fc63629..678681ecf969a73123510bb92507a576c09180d1 100644 (file)
@@ -55,7 +55,7 @@ struct MGL_EXPORT mglTeXsymb  {       unsigned kod;   const wchar_t *tex;     };
 const float mgl_fgen = 4*14;\r
 /// Get font color, style and align for internal parser\r
 bool MGL_EXPORT mglGetStyle(const char *how, int *font, int *align=0);\r
-long MGL_EXPORT_PURE mgl_internal_code(unsigned s, const std::vector<mglGlyphDescr> &glyphs);\r
+long MGL_EXPORT mgl_internal_code(unsigned s, const std::vector<mglGlyphDescr> &glyphs);\r
 class mglBase;\r
 //-----------------------------------------------------------------------------\r
 /// Class for font typeface and text plotting procedures\r
@@ -69,6 +69,10 @@ public:
 \r
        /// Load font data to memory. Normally used by constructor.\r
        bool Load(const char *base, const char *path=0);\r
+       /// Load binary font data to memory. Normally used by constructor.\r
+       bool LoadBin(const char *base, const char *path=0);\r
+       /// Save binary font data\r
+       size_t SaveBin(const char *fname);\r
        /// Free memory\r
        void Clear();\r
        /// Copy data from other font\r
index a27d5a56b4fe664e939e9cb92acaeeab19df578c..286a3bbd6f324c2b233419739ea766e62061126d 100644 (file)
@@ -80,6 +80,8 @@ public:
        inline void Light(int n,bool enable)    {       mgl_set_light_n(gr, n, enable); }\r
        /// Use diffusive light (only for local light sources) -- OBSOLETE\r
        inline void SetDifLight(bool dif)               {       mgl_set_light_dif(gr, dif);     }\r
+       /// Set to attach light settings to inplot.\r
+       inline void AttachLight(bool enable)            {       mgl_set_attach_light(gr, enable);       }\r
        /// Add a light source.\r
        inline void AddLight(int n, mglPoint p, char col='w', double bright=0.5, double ap=0)\r
        {       mgl_add_light_ext(gr, n, p.x, p.y, p.z, col, bright, ap);       }\r
@@ -92,7 +94,7 @@ public:
        /// Set the fog distance or switch it off (if d=0).\r
        inline void Fog(double d, double dz=0.25)       {       mgl_set_fog(gr, d, dz);         }\r
 \r
-       /// Set relative width of rectangles in Bars, Barh, BoxPlot\r
+       /// Set relative width of rectangles in Bars, Barh, BoxPlot, Candle, OHLC (default is 0.7)\r
        inline void SetBarWidth(double width)   {       mgl_set_bar_width(gr, width);   }\r
        /// Set default size of marks (locally you can use "size" option)\r
        inline void SetMarkSize(double size)            {       mgl_set_mark_size(gr, size);    }\r
@@ -174,15 +176,15 @@ public:
        /// Set range in direction dir as minimal and maximal values of data a\r
        inline void SetRange(char dir, const mglDataA &dat, bool add=false)\r
        {       mgl_set_range_dat(gr, dir, &dat, add);  }\r
-       /// Set values of axis range as minimal and maximal values of datas\r
+       /// Set values of axis range as minimal and maximal values of corresponding data\r
        inline void SetRanges(const mglDataA &xx, const mglDataA &yy, const mglDataA &zz, const mglDataA &cc)\r
        {       mgl_set_range_dat(gr,'x',&xx,0);        mgl_set_range_dat(gr,'y',&yy,0);\r
                mgl_set_range_dat(gr,'z',&zz,0);        mgl_set_range_dat(gr,'c',&cc,0);        }\r
-       /// Set values of axis range as minimal and maximal values of datas\r
+       /// Set values of axis range as minimal and maximal values of corresponding data\r
        inline void SetRanges(const mglDataA &xx, const mglDataA &yy, const mglDataA &zz)\r
        {       mgl_set_range_dat(gr,'x',&xx,0);        mgl_set_range_dat(gr,'y',&yy,0);\r
                mgl_set_range_dat(gr,'z',&zz,0);        mgl_set_range_dat(gr,'c',&zz,0);        }\r
-       /// Set values of axis range as minimal and maximal values of datas\r
+       /// Set values of axis range as minimal and maximal values of corresponding data\r
        inline void SetRanges(const mglDataA &xx, const mglDataA &yy)\r
        {       mgl_set_range_dat(gr,'x',&xx,0);        mgl_set_range_dat(gr,'y',&yy,0);        }\r
        /// Set values of axis ranges\r
@@ -203,12 +205,15 @@ public:
        inline void SetOrigin(double x0, double y0, double z0=mglNaN)\r
        {       mgl_set_origin(gr, x0, y0, z0); }\r
 \r
-       /// Set the transformation formulas for coordinate\r
+       /// Set the transformation formulas for coordinate. Use "" or NULL for built-in ones\r
        inline void SetFunc(const char *EqX, const char *EqY, const char *EqZ=NULL, const char *EqA=NULL)\r
        {       mgl_set_func(gr, EqX, EqY, EqZ, EqA);   }\r
        /// Set one of predefined transformation rule\r
        inline void SetCoor(int how)            {       mgl_set_coor(gr, how);  }\r
        /// Set to draw Ternary axis (triangle like axis, grid and so on)\r
+       /** val=1 for Ternary axis (a+b+c=1, z=z),\r
+        *  val=2 for Quaternary axis (a+b+c+d=1),\r
+        *  val|4 for projections. */\r
        inline void Ternary(int val)            {       mgl_set_ternary(gr, val);       }\r
 \r
        /// Set to use or not tick labels rotation\r
@@ -253,7 +258,7 @@ public:
        {       mgl_set_tick_templ(gr,dir,t);   }\r
        inline void SetTickTempl(char dir, const wchar_t *t)\r
        {       mgl_set_tick_templw(gr,dir,t);  }\r
-       /// Tune ticks\r
+       /// Tune ticks (tune|1 for common multiplier, tune|2 for common component)\r
        inline void SetTuneTicks(int tune, double fact_pos=1.15)\r
        {       mgl_tune_ticks(gr, tune, fact_pos);     }\r
        /// Set additional shift of tick labels\r
@@ -266,13 +271,25 @@ public:
        inline void SetOriginTick(bool enable=true)\r
        {       mgl_set_flag(gr,!enable, MGL_NO_ORIGIN);        }\r
 \r
-       /// Put further plotting in some region of whole frame.\r
+       /// Put further plotting in m-th cell of nx*ny grid of the image.\r
+       /** String \a style may contain:\r
+        *  '<' for reserving space at left\r
+        *  '>' for reserving space at right\r
+        *  '^' for reserving space at top\r
+        *  '_' for reserving space at bottom\r
+        *  '#' for using whole region. */\r
        inline void SubPlot(int nx,int ny,int m,const char *style="<>_^", double dx=0, double dy=0)\r
        {       mgl_subplot_d(gr, nx, ny, m, style, dx, dy);    }\r
-       /// Like SubPlot() but "join" several cells\r
+       /// Put further plotting in rectangle of dx*dy cells starting from m-th cell of nx*ny grid of the image.\r
+       /** String \a style may contain:\r
+        *  '<' for reserving space at left\r
+        *  '>' for reserving space at right\r
+        *  '^' for reserving space at top\r
+        *  '_' for reserving space at bottom\r
+        *  '#' for using whole region. */\r
        inline void MultiPlot(int nx,int ny,int m, int dx, int dy, const char *style="<>_^")\r
        {       mgl_multiplot(gr, nx, ny, m, dx, dy, style);    }\r
-       /// Put further plotting in a region of whole frame.\r
+       /// Put further plotting in a region [x1,x2]*[y1,y2] of the image or subplot (x1,x2,y1,y2 in range [0, 1]).\r
        inline void InPlot(double x1,double x2,double y1,double y2, bool rel=true)\r
        {       if(rel) mgl_relplot(gr, x1, x2, y1, y2);\r
                else    mgl_inplot(gr, x1, x2, y1, y2); }\r
@@ -295,8 +312,11 @@ public:
        inline void Pop()       {       mgl_mat_pop(gr);        }\r
 \r
        /// Add title for current subplot/inplot\r
+       /** Style '#' draw box around the title. */\r
        inline  void Title(const char *title,const char *stl="",double size=-2)\r
        {       mgl_title(gr,title,stl,size);   }\r
+       /// Add title for current subplot/inplot\r
+       /** Style '#' draw box around the title. */\r
        inline  void Title(const wchar_t *title,const char *stl="",double size=-2)\r
        {       mgl_titlew(gr,title,stl,size);  }\r
        /// Set aspect ratio for further plotting.\r
@@ -323,7 +343,14 @@ public:
 \r
        /// Set size of frame in pixels. Normally this function is called internally.\r
        inline void SetSize(int width, int height)      {       mgl_set_size(gr, width, height);        }\r
+       /// Scaling for all further set size calls.\r
+       static inline void SetSizeScl(double scl)       {       mgl_set_size_scl(scl);  }\r
        /// Set plot quality\r
+       /** qual=0 -- no face drawing (fastest),\r
+        *  qual=1 -- no color interpolation (fast),\r
+        *  qual=2 -- high quality (normal),\r
+        *  qual|4 -- direct bitmap drawing (low memory usage);\r
+        *  qual|8 for dots drawing instead of primitives (extremely fast). */\r
        inline void SetQuality(int qual=MGL_DRAW_NORM)  {       mgl_set_quality(gr, qual);      }\r
        /// Get plot quality\r
        inline int GetQuality() {       return mgl_get_quality(gr);     }\r
@@ -433,20 +460,26 @@ public:
        {       mgl_import_mgld(gr, fname, add);        }\r
 \r
        /// Copy RGB values into array which is allocated by user\r
+       /** Position of element {i,j} is [3*i + 3*Width*j]. */\r
        inline bool GetRGB(char *imgdata, int imglen)\r
        {\r
                long w=mgl_get_width(gr), h=mgl_get_height(gr);\r
                if(imglen>=3*w*h)       memcpy(imgdata, mgl_get_rgb(gr),3*w*h);\r
                return imglen>=3*w*h;\r
        }\r
+       /// Get RGB values of current bitmap\r
+       /** Position of element {i,j} is [3*i + 3*Width*j]. */\r
        inline const unsigned char *GetRGB()            {       return mgl_get_rgb(gr); }\r
        /// Copy RGBA values into array which is allocated by user\r
+       /** Position of element {i,j} is [4*i + 4*Width*j]. */\r
        inline bool GetRGBA(char *imgdata, int imglen)\r
        {\r
                long w=mgl_get_width(gr), h=mgl_get_height(gr);\r
                if(imglen>=4*w*h)       memcpy(imgdata, mgl_get_rgba(gr),4*w*h);\r
                return imglen>=4*w*h;\r
        }\r
+       /// Get RGBA values of current bitmap\r
+       /** Position of element {i,j} is [4*i + 4*Width*j]. */\r
        inline const unsigned char *GetRGBA()   {       return mgl_get_rgba(gr);        }\r
        /// Copy BGRN values into array which is allocated by user\r
        inline bool GetBGRN(unsigned char *imgdata, int imglen)\r
@@ -463,12 +496,15 @@ public:
                return imglen>=4*w*h;\r
        }\r
        /// Copy RGBA values of background image into array which is allocated by user\r
+       /** Position of element {i,j} is [4*i + 4*Width*j]. */\r
        inline bool GetBackground(char *imgdata, int imglen)\r
        {\r
                long w=mgl_get_width(gr), h=mgl_get_height(gr);\r
                if(imglen>=4*w*h)       memcpy(imgdata, mgl_get_background(gr),4*w*h);\r
                return imglen>=4*w*h;\r
        }\r
+       /// Get RGBA values of background image\r
+       /** Position of element {i,j} is [4*i + 4*Width*j]. */\r
        inline const unsigned char *GetBackground()     {       return mgl_get_background(gr);  }\r
        /// Get width of the image\r
        inline int GetWidth()   {       return mgl_get_width(gr);       }\r
@@ -500,10 +536,13 @@ public:
        /// Combine plots from 2 canvases. Result will be saved into this\r
        inline void Combine(const mglGraph *g)  {       mgl_combine_gr(gr,g->gr);       }\r
 \r
-       /// Clear up the frame\r
+       /// Clear up the frame and fill background by specified color\r
        inline void Clf(double r, double g, double b)   {       mgl_clf_rgb(gr, r, g, b);       }\r
+       /// Clear up the frame and fill background by specified color with manual transparency\r
        inline void Clf(const char *col)        {       mgl_clf_str(gr, col);   }\r
+       /// Clear up the frame and fill background by specified color\r
        inline void Clf(char col)       {       mgl_clf_chr(gr, col);   }\r
+       /// Clear up the frame\r
        inline void Clf()       {       mgl_clf(gr);    }\r
        /// Clear unused points and primitives. Useful only in combination with SetFaceNum().\r
        inline void ClearUnused()       {       mgl_clear_unused(gr);   }\r
@@ -521,6 +560,7 @@ public:
        inline void Mark(mglPoint p, const char *mark)\r
        {       mgl_mark(gr, p.x, p.y, p.z, mark);      }\r
        /// Draws the line between points by specified pen\r
+       /** Large \a n (for example, n=100) should be used for geodesic line in curved coordinates */\r
        inline void Line(mglPoint p1, mglPoint p2, const char *pen="B",int n=2)\r
        {       mgl_line(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, pen, n);       }\r
        /// Draws the spline curve between points by specified pen\r
@@ -543,24 +583,42 @@ public:
        inline void FaceZ(mglPoint p, double wx, double wy, const char *stl="w", double dx=0, double dy=0)\r
        {       mgl_facez(gr, p.x, p.y, p.z, wx, wy, stl, dx, dy);      }\r
        /// Draws the drop at point p in direction d with color col and radius r\r
+       /** Parameter \a shift set the degree of drop oblongness: ‘0’ is sphere, ‘1’ is maximally oblongness drop. Parameter \a ap set relative width of the drop (this is analogue of “ellipticity” for the sphere).*/\r
        inline void Drop(mglPoint p, mglPoint d, double r, const char *col="r", double shift=1, double ap=1)\r
        {       mgl_drop(gr, p.x, p.y, p.z, d.x, d.y, d.z, r, col, shift, ap);  }\r
        /// Draws the sphere at point p with color col and radius r\r
        inline void Sphere(mglPoint p, double r, const char *col="r")\r
        {       mgl_sphere(gr, p.x, p.y, p.z, r, col);  }\r
        /// Draws the cone between points p1,p2 with radius r1,r2 and with style stl\r
+       /** Parameter \a stl can contain:\r
+        * ‘@’ for drawing edges;\r
+        * ‘#’ for wired cones;\r
+        * ‘t’ for drawing tubes/cylinder instead of cones/prisms;\r
+        * ‘4’, ‘6’, ‘8’ for drawing square, hex- or octo-prism instead of cones.*/\r
        inline void Cone(mglPoint p1, mglPoint p2, double r1, double r2=-1, const char *stl="r@")\r
        {       mgl_cone(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z,r1,r2,stl);     }\r
        /// Draws the ellipse between points p1,p2 with color stl and width r\r
+       /** Parameter \a stl can contain:\r
+        * ‘#’ for wired figure (boundary only);\r
+        * ‘@’ for filled figure and with boundary (second color or black one is used for boundary).*/\r
        inline void Ellipse(mglPoint p1, mglPoint p2, double r, const char *stl="r")\r
        {       mgl_ellipse(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, r,stl);     }\r
        /// Draws the circle at point p with color stl and radius r\r
+       /** Parameter \a stl can contain:\r
+        * ‘#’ for wired figure (boundary only);\r
+        * ‘@’ for filled figure and with boundary (second color or black one is used for boundary).*/\r
        inline void Circle(mglPoint p, double r, const char *stl="r")\r
        {       mgl_ellipse(gr, p.x, p.y, p.z, p.x, p.y, p.z, r,stl);   }\r
        /// Draws the rhomb between points p1,p2 with color stl and width r\r
+       /** Parameter \a stl can contain:\r
+        * ‘#’ for wired figure (boundary only);\r
+        * ‘@’ for filled figure and with boundary (second color or black one is used for boundary).*/\r
        inline void Rhomb(mglPoint p1, mglPoint p2, double r, const char *stl="r")\r
        {       mgl_rhomb(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, r,stl);       }\r
        /// Draws the polygon based on points p1,p2 with color stl\r
+       /** Parameter \a stl can contain:\r
+        * ‘#’ for wired figure (boundary only);\r
+        * ‘@’ for filled figure and with boundary (second color or black one is used for boundary).*/\r
        inline void Polygon(mglPoint p1, mglPoint p2, int n, const char *stl="r")\r
        {       mgl_polygon(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, n,stl);     }\r
        /// Draws the arc around axis pr with center at p0 and starting from p1, by color stl and angle a (in degrees)\r
@@ -578,55 +636,134 @@ public:
        /// Print text in position p with specified font\r
        inline void Putsw(mglPoint p,const wchar_t *text,const char *font=":C",double size=-1)\r
        {       mgl_putsw(gr, p.x, p.y, p.z, text, font, size); }\r
+       /// Print text in position p with specified font\r
        inline void Puts(mglPoint p,const char *text,const char *font=":C",double size=-1)\r
        {       mgl_puts(gr, p.x, p.y, p.z, text, font, size);  }\r
+       /// Print text in position p with specified font\r
        inline void Putsw(double x, double y,const wchar_t *text,const char *font=":AC",double size=-1)\r
        {       mgl_putsw(gr, x, y, 0, text, font, size);       }\r
+       /// Print text in position p with specified font\r
        inline void Puts(double x, double y,const char *text,const char *font=":AC",double size=-1)\r
        {       mgl_puts(gr, x, y, 0, text, font, size);        }\r
        /// Print text in position p along direction d with specified font\r
        inline void Putsw(mglPoint p, mglPoint d, const wchar_t *text, const char *font=":L", double size=-1)\r
        {       mgl_putsw_dir(gr, p.x, p.y, p.z, d.x, d.y, d.z, text, font, size);      }\r
+       /// Print text in position p along direction d with specified font\r
        inline void Puts(mglPoint p, mglPoint d, const char *text, const char *font=":L", double size=-1)\r
        {       mgl_puts_dir(gr, p.x, p.y, p.z, d.x, d.y, d.z, text, font, size);       }\r
 \r
        /// Print text along the curve\r
        inline void Text(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *text, const char *font="", const char *opt="")\r
        {       mgl_text_xyz(gr, &x, &y, &z, text, font, opt);  }\r
+       /// Print text along the curve\r
        inline void Text(const mglDataA &x, const mglDataA &y, const char *text, const char *font="", const char *opt="")\r
        {       mgl_text_xy(gr, &x, &y, text, font, opt);       }\r
+       /// Print text along the curve\r
        inline void Text(const mglDataA &y, const char *text, const char *font="", const char *opt="")\r
        {       mgl_text_y(gr, &y, text, font, opt);    }\r
+       /// Print text along the curve\r
        inline void Text(const mglDataA &x, const mglDataA &y, const mglDataA &z, const wchar_t *text, const char *font="", const char *opt="")\r
        {       mgl_textw_xyz(gr, &x, &y, &z, text, font, opt); }\r
+       /// Print text along the curve\r
        inline void Text(const mglDataA &x, const mglDataA &y, const wchar_t *text, const char *font="", const char *opt="")\r
        {       mgl_textw_xy(gr, &x, &y, text, font, opt);      }\r
+       /// Print text along the curve\r
        inline void Text(const mglDataA &y, const wchar_t *text, const char *font="", const char *opt="")\r
        {       mgl_textw_y(gr, &y, text, font, opt);   }\r
 \r
        /// Draws bounding box outside the plotting volume with color c.\r
+       /** Style ‘@’ produce filled back faces. */\r
        inline void Box(const char *col="", bool ticks=true)\r
        {       mgl_box_str(gr, col, ticks);    }\r
        /// Draw axises with ticks in direction(s) dir.\r
+       /** Parameter \a dir may contain:\r
+        *      ‘xyzt’for drawing axis in corresponding direction;\r
+        *      ‘XYZT’ for drawing axis in corresponding direction but with inverted positions of labels;\r
+        *      ‘~’, ‘_’ for disabling tick labels;\r
+        *      ‘U’ for disabling rotation of tick labels;\r
+        *      ‘^’ for inverting default axis origin;\r
+        *      ‘!’ for disabling ticks tuning;\r
+        *      ‘AKDTVISO’ for drawing arrow at the end of axis;\r
+        *      ‘a’ for forced adjusting of axis ticks;\r
+        *      ‘f’ for printing ticks labels in fixed format;\r
+        *      ‘E’ for using ‘E’ instead of ‘e’ in ticks labels;\r
+        *      ‘F’ for printing ticks labels in LaTeX format;\r
+        *      ‘+’ for printing ‘+’ for positive ticks;\r
+        *      ‘-’ for printing usual ‘-’ in ticks labels;\r
+        *      ‘0123456789’ for precision at printing ticks labels.\r
+        *       Option "value" set the manual rotation angle for the ticks. */\r
        inline void Axis(const char *dir="xyzt", const char *stl="", const char *opt="")\r
        {       mgl_axis(gr, dir,stl,opt);      }\r
        /// Draw grid lines perpendicular to direction(s) dir.\r
        inline void Grid(const char *dir="xyzt",const char *pen="B", const char *opt="")\r
        {       mgl_axis_grid(gr, dir, pen, opt);       }\r
        /// Print the label text for axis dir.\r
+       /** Option "value" set additional shifting of the label. */\r
        inline void Label(char dir, const char *text, double pos=+1, const char *opt="")\r
        {       mgl_label(gr, dir, text, pos, opt);     }\r
+       /// Print the label text for axis dir.\r
+       /** Option "value" set additional shifting of the label. */\r
        inline void Label(char dir, const wchar_t *text, double pos=+1, const char *opt="")\r
        {       mgl_labelw(gr, dir, text, pos, opt);    }\r
 \r
        /// Draw colorbar at edge of axis\r
+       /** Parameter \a sch may contain:\r
+        *       ‘<>^_’ for positioning at left, at right, at top or at bottom correspondingly;\r
+        *       ‘I’ for positioning near bounding (by default, at edges of subplot);\r
+        *       ‘A’ for using absolute coordinates;\r
+        *       ‘~’ for disabling tick labels.\r
+        *       ‘!’ for disabling ticks tuning;\r
+        *       ‘f’ for printing ticks labels in fixed format;\r
+        *       ‘E’ for using ‘E’ instead of ‘e’ in ticks labels;\r
+        *       ‘F’ for printing ticks labels in LaTeX format;\r
+        *       ‘+’ for printing ‘+’ for positive ticks;\r
+        *       ‘-’ for printing usual ‘-’ in ticks labels;\r
+        *       ‘0123456789’ for precision at printing ticks labels.*/\r
        inline void Colorbar(const char *sch="")\r
        {       mgl_colorbar(gr, sch);  }\r
+       /// Draw colorbar at manual position\r
+       /** Parameter \a sch may contain:\r
+        *       ‘<>^_’ for positioning at left, at right, at top or at bottom correspondingly;\r
+        *       ‘I’ for positioning near bounding (by default, at edges of subplot);\r
+        *       ‘A’ for using absolute coordinates;\r
+        *       ‘~’ for disabling tick labels.\r
+        *       ‘!’ for disabling ticks tuning;\r
+        *       ‘f’ for printing ticks labels in fixed format;\r
+        *       ‘E’ for using ‘E’ instead of ‘e’ in ticks labels;\r
+        *       ‘F’ for printing ticks labels in LaTeX format;\r
+        *       ‘+’ for printing ‘+’ for positive ticks;\r
+        *       ‘-’ for printing usual ‘-’ in ticks labels;\r
+        *       ‘0123456789’ for precision at printing ticks labels.*/\r
        inline void Colorbar(const char *sch,double x,double y,double w=1,double h=1)\r
        {       mgl_colorbar_ext(gr, sch, x,y,w,h);     }\r
        /// Draw colorbar with manual colors at edge of axis\r
+       /** Parameter \a sch may contain:\r
+        *       ‘<>^_’ for positioning at left, at right, at top or at bottom correspondingly;\r
+        *       ‘I’ for positioning near bounding (by default, at edges of subplot);\r
+        *       ‘A’ for using absolute coordinates;\r
+        *       ‘~’ for disabling tick labels.\r
+        *       ‘!’ for disabling ticks tuning;\r
+        *       ‘f’ for printing ticks labels in fixed format;\r
+        *       ‘E’ for using ‘E’ instead of ‘e’ in ticks labels;\r
+        *       ‘F’ for printing ticks labels in LaTeX format;\r
+        *       ‘+’ for printing ‘+’ for positive ticks;\r
+        *       ‘-’ for printing usual ‘-’ in ticks labels;\r
+        *       ‘0123456789’ for precision at printing ticks labels.*/\r
        inline void Colorbar(const mglDataA &val, const char *sch="")\r
        {       mgl_colorbar_val(gr, &val, sch);        }\r
+       /// Draw colorbar with manual colors at manual position\r
+       /** Parameter \a sch may contain:\r
+        *       ‘<>^_’ for positioning at left, at right, at top or at bottom correspondingly;\r
+        *       ‘I’ for positioning near bounding (by default, at edges of subplot);\r
+        *       ‘A’ for using absolute coordinates;\r
+        *       ‘~’ for disabling tick labels.\r
+        *       ‘!’ for disabling ticks tuning;\r
+        *       ‘f’ for printing ticks labels in fixed format;\r
+        *       ‘E’ for using ‘E’ instead of ‘e’ in ticks labels;\r
+        *       ‘F’ for printing ticks labels in LaTeX format;\r
+        *       ‘+’ for printing ‘+’ for positive ticks;\r
+        *       ‘-’ for printing usual ‘-’ in ticks labels;\r
+        *       ‘0123456789’ for precision at printing ticks labels.*/\r
        inline void Colorbar(const mglDataA &val, const char *sch,double x,double y,double w=1,double h=1)\r
        {       mgl_colorbar_val_ext(gr, &val, sch, x,y,w,h);   }\r
 \r
@@ -639,9 +776,26 @@ public:
        inline void ClearLegend()\r
        {       mgl_clear_legend(gr);   }\r
        /// Draw legend of accumulated strings at position {x,y}\r
+       /** Parameter fnt may contain:\r
+        *       font style for legend text;\r
+        *       colors for background (first one), border (second one) and text (last one);\r
+        *       ‘A’ for positioning in absolute coordinates;\r
+        *       ‘^’ for positioning outside of specified point;\r
+        *       ‘-’ for arranging entries horizontally;\r
+        *       ‘#’ for drawing box around legend.\r
+        * Option value set the space between line samples and text (default is 0.1).*/\r
        inline void Legend(double x, double y, const char *font="#", const char *opt="")\r
        {       mgl_legend_pos(gr, x, y, font, opt);    }\r
        /// Draw legend of accumulated strings\r
+       /** Parameter fnt may contain:\r
+        *       font style for legend text;\r
+        *       colors for background (first one), border (second one) and text (last one);\r
+        *       ‘A’ for positioning in absolute coordinates;\r
+        *       ‘^’ for positioning outside of specified point;\r
+        *       ‘-’ for arranging entries horizontally;\r
+        *       ‘#’ for drawing box around legend.\r
+        * Option value set the space between line samples and text (default is 0.1).\r
+        * Parameter \a where sets position: 0 at bottom-left, 1 at bottom-right, 2 at top-left, 3 at top-right (default).*/\r
        inline void Legend(int where=3, const char *font="#", const char *opt="")\r
        {       mgl_legend(gr, where, font, opt);       }\r
        /// Set number of marks in legend sample\r
@@ -650,517 +804,1139 @@ public:
        /// Draw usual curve {x,y,z}\r
        inline void Plot(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *pen="", const char *opt="")\r
        {       mgl_plot_xyz(gr, &x, &y, &z, pen, opt); }\r
+       /// Draw usual curve {x,y}\r
        inline void Plot(const mglDataA &x, const mglDataA &y, const char *pen="", const char *opt="")\r
        {       mgl_plot_xy(gr, &x, &y, pen,opt);       }\r
+       /// Draw usual curve {x,y} with x in x-axis range\r
        inline void Plot(const mglDataA &y, const char *pen="", const char *opt="")\r
        {       mgl_plot(gr, &y, pen,opt);      }\r
-       /// Draw tape(s) which rotates as (bi-)normales of curve {x,y,z}\r
+       /// Draw tapes which rotates as (bi-)normales of curve {x,y,z}\r
+       /** The width of tape is proportional to barwidth and can be changed by option "value".*/\r
        inline void Tape(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *pen="", const char *opt="")\r
        {       mgl_tape_xyz(gr, &x, &y, &z, pen, opt); }\r
+       /// Draw tapes which rotates as (bi-)normales of curve {x,y}\r
+       /** The width of tape is proportional to barwidth and can be changed by option "value".*/\r
        inline void Tape(const mglDataA &x, const mglDataA &y, const char *pen="", const char *opt="")\r
        {       mgl_tape_xy(gr, &x, &y, pen,opt);       }\r
+       /// Draw tapes which rotates as (bi-)normales of curve {x,y} with x in x-axis range\r
+       /** The width of tape is proportional to barwidth and can be changed by option "value".*/\r
        inline void Tape(const mglDataA &y, const char *pen="", const char *opt="")\r
        {       mgl_tape(gr, &y, pen,opt);      }\r
        /// Draw radar chart (plot in curved coordinates)\r
+       /** Option "value" set the additional shift of data (i.e. the data a+value is used instead of a).*/\r
        inline void Radar(const mglDataA &a, const char *pen="", const char *opt="")\r
        {       mgl_radar(gr, &a, pen, opt);    }\r
+\r
        /// Draw stairs for points in arrays {x,y,z}\r
        inline void Step(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *pen="", const char *opt="")\r
        {       mgl_step_xyz(gr, &x, &y, &z, pen, opt); }\r
+       /// Draw stairs for points in arrays {x,y}\r
        inline void Step(const mglDataA &x, const mglDataA &y, const char *pen="", const char *opt="")\r
        {       mgl_step_xy(gr, &x, &y, pen, opt);      }\r
+       /// Draw stairs for points in arrays {x,y} with x in x-axis range\r
        inline void Step(const mglDataA &y, const char *pen="", const char *opt="")\r
        {       mgl_step(gr, &y, pen, opt);     }\r
+\r
        /// Draw curve {x,y,z} which is colored by c (like tension plot)\r
        inline void Tens(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const char *pen="", const char *opt="")\r
        {       mgl_tens_xyz(gr, &x, &y, &z, &c, pen, opt);     }\r
+       /// Draw curve {x,y} which is colored by c (like tension plot)\r
        inline void Tens(const mglDataA &x, const mglDataA &y, const mglDataA &c, const char *pen="", const char *opt="")\r
        {       mgl_tens_xy(gr, &x, &y, &c, pen, opt);  }\r
+       /// Draw curve {x,y} with x in x-axis range which is colored by c (like tension plot)\r
        inline void Tens(const mglDataA &y, const mglDataA &c, const char *pen="", const char *opt="")\r
        {       mgl_tens(gr, &y, &c, pen, opt); }\r
+\r
        /// Fill area between curve {x,y,z} and axis plane\r
+       /** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
        inline void Area(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *pen="", const char *opt="")\r
        {       mgl_area_xyz(gr, &x, &y, &z, pen, opt); }\r
+       /// Fill area between curve {x,y} and axis plane\r
+       /** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
        inline void Area(const mglDataA &x, const mglDataA &y, const char *pen="", const char *opt="")\r
        {       mgl_area_xy(gr, &x, &y, pen, opt);      }\r
+       /// Fill area between curve {x,y} with x in x-axis range and axis plane\r
+       /** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
        inline void Area(const mglDataA &y, const char *pen="", const char *opt="")\r
        {       mgl_area(gr, &y, pen, opt);     }\r
-       /// Fill area between curves y1 and y2 specified parametrically\r
+\r
+       /// Fill area between curves {x,y1} and {x,y2} with x in x-axis range\r
+       /** Style 'i' will fill area only if y1 < y2.\r
+         * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
        inline void Region(const mglDataA &y1, const mglDataA &y2, const char *pen="", const char *opt="")\r
        {       mgl_region(gr, &y1, &y2, pen, opt);     }\r
+       /// Fill area between curves {x,y1} and {x,y2}\r
+       /** Style 'i' will fill area only if y1 < y2.\r
+         * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
        inline void Region(const mglDataA &x, const mglDataA &y1, const mglDataA &y2, const char *pen="", const char *opt="")\r
        {       mgl_region_xy(gr, &x, &y1, &y2, pen, opt);      }\r
        /// Fill area (draw ribbon) between curves {x1,y1,z1} and {x2,y2,z2}\r
+       /** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
        inline void Region(const mglDataA &x1, const mglDataA &y1, const mglDataA &z1, const mglDataA &x2, const mglDataA &y2, const mglDataA &z2, const char *pen="", const char *opt="")\r
        {       mgl_region_3d(gr, &x1, &y1, &z1, &x2, &y2, &z2, pen, opt);      }\r
+       /// Fill area (draw ribbon) between curves {x1,y1} and {x2,y2}\r
+       /** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
        inline void Region(const mglDataA &x1, const mglDataA &y1, const mglDataA &x2, const mglDataA &y2, const char *pen="", const char *opt="")\r
        {       mgl_region_3d(gr, &x1, &y1, NULL, &x2, &y2, NULL, pen, opt);    }\r
+\r
        /// Draw vertical lines from points {x,y,z} to axis plane\r
        inline void Stem(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *pen="", const char *opt="")\r
        {       mgl_stem_xyz(gr, &x, &y, &z, pen, opt); }\r
+       /// Draw vertical lines from points {x,y} to axis plane\r
        inline void Stem(const mglDataA &x, const mglDataA &y, const char *pen="", const char *opt="")\r
        {       mgl_stem_xy(gr, &x, &y, pen, opt);      }\r
+       /// Draw vertical lines from points {x,y} with x in x-axis range to axis plane\r
        inline void Stem(const mglDataA &y, const char *pen="", const char *opt="")\r
        {       mgl_stem(gr, &y, pen, opt);     }\r
 \r
        /// Draw vertical bars from points {x,y,z} to axis plane\r
+       /** String \a pen may contain:\r
+        * ‘a’ for drawing boxes one above another (like summation);\r
+        * ‘f’ for waterfall chart;\r
+        * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right.\r
+        * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
        inline void Bars(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *pen="", const char *opt="")\r
        {       mgl_bars_xyz(gr, &x, &y, &z, pen, opt); }\r
+       /// Draw vertical bars from points {x,y} to axis plane\r
+       /** String \a pen may contain:\r
+        * ‘a’ for drawing boxes one above another (like summation);\r
+        * ‘f’ for waterfall chart;\r
+        * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right.\r
+        * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
        inline void Bars(const mglDataA &x, const mglDataA &y, const char *pen="", const char *opt="")\r
        {       mgl_bars_xy(gr, &x, &y, pen, opt);      }\r
+       /// Draw vertical bars from points {x,y} with x in x-axis range to axis plane\r
+       /** String \a pen may contain:\r
+        * ‘a’ for drawing boxes one above another (like summation);\r
+        * ‘f’ for waterfall chart;\r
+        * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right.\r
+        * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
        inline void Bars(const mglDataA &y, const char *pen="", const char *opt="")\r
        {       mgl_bars(gr, &y, pen, opt);     }\r
        /// Draw horizontal bars from points {x,y} to axis plane\r
+       /** String \a pen may contain:\r
+        * ‘a’ for drawing boxes one above another (like summation);\r
+        * ‘f’ for waterfall chart;\r
+        * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right.\r
+        * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
        inline void Barh(const mglDataA &y, const mglDataA &v, const char *pen="", const char *opt="")\r
        {       mgl_barh_yx(gr, &y, &v, pen, opt);      }\r
+       /// Draw horizontal bars from points {x,y} with y in y-axis range to axis plane\r
+       /** String \a pen may contain:\r
+        * ‘a’ for drawing boxes one above another (like summation);\r
+        * ‘f’ for waterfall chart;\r
+        * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right.\r
+        * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
        inline void Barh(const mglDataA &v, const char *pen="", const char *opt="")\r
        {       mgl_barh(gr, &v, pen, opt);     }\r
        /// Draw chart for data a\r
+       /** Space denote transparent color. Style '#' draw black borders. */\r
        inline void Chart(const mglDataA &a, const char *colors="", const char *opt="")\r
        {       mgl_chart(gr, &a, colors,opt);  }\r
 \r
        /// Draw Open-High-Low-Close (OHLC) diagram\r
+       /**  Different colors for up and down values are used if number of specified colors is equal to 2*number of curves. */\r
        inline void OHLC(const mglDataA &x, const mglDataA &open, const mglDataA &high, const mglDataA &low, const mglDataA &close, const char *pen="", const char *opt="")\r
        {       mgl_ohlc_x(gr, &x, &open,&high,&low,&close,pen,opt);    }\r
+       /// Draw Open-High-Low-Close (OHLC) diagram with x in x-axis range\r
+       /**  Different colors for up and down values are used if number of specified colors is equal to 2*number of curves. */\r
        inline void OHLC(const mglDataA &open, const mglDataA &high, const mglDataA &low, const mglDataA &close, const char *pen="", const char *opt="")\r
        {       mgl_ohlc(gr, &open,&high,&low,&close,pen,opt);  }\r
 \r
        /// Draw box-plot (special 5-value plot used in statistic)\r
+       /** String \a pen may contain ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right.*/\r
        inline void BoxPlot(const mglDataA &x, const mglDataA &y, const char *pen="", const char *opt="")\r
        {       mgl_boxplot_xy(gr, &x, &y, pen,opt);    }\r
+       /// Draw box-plot (special 5-value plot used in statistic) with x in x-axis range\r
+       /** String \a pen may contain ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right.*/\r
        inline void BoxPlot(const mglDataA &y, const char *pen="", const char *opt="")\r
        {       mgl_boxplot(gr, &y, pen,opt);   }\r
+\r
        /// Draw candle plot\r
+       /** Different colors are used for up and down values if 2 colors are specified.\r
+        *  Style ‘#’ force drawing wire candle even for 2-color scheme. */\r
        inline void Candle(const mglDataA &x, const mglDataA &v1, const mglDataA &v2, const mglDataA &y1, const mglDataA &y2, const char *pen="", const char *opt="")\r
        {       mgl_candle_xyv(gr, &x, &v1, &v2, &y1, &y2, pen, opt);   }\r
+       /// Draw candle plot with x in x-axis range\r
+       /** Different colors are used for up and down values if 2 colors are specified.\r
+        *  Style ‘#’ force drawing wire candle even for 2-color scheme. */\r
        inline void Candle(const mglDataA &v1, const mglDataA &v2, const mglDataA &y1, const mglDataA &y2, const char *pen="", const char *opt="")\r
        {       mgl_candle_yv(gr, &v1, &v2, &y1, &y2, pen, opt);        }\r
        inline void Candle(const mglDataA &v1, const mglDataA &v2, const char *pen="", const char *opt="")\r
        {       mgl_candle_yv(gr, &v1, &v2, NULL, NULL, pen, opt);      }\r
+       /// Draw candle plot with v1=v[i], v2=v[i+1]\r
+       /** Different colors are used for up and down values if 2 colors are specified.\r
+        *  Style ‘#’ force drawing wire candle even for 2-color scheme. */\r
        inline void Candle(const mglDataA &y, const mglDataA &y1, const mglDataA &y2, const char *pen="", const char *opt="")\r
        {       mgl_candle(gr, &y, &y1, &y2, pen, opt); }\r
+       /// Draw candle plot with v1=v[i], v2=v[i+1]\r
+       /** Different colors are used for up and down values if 2 colors are specified.\r
+        *  Style ‘#’ force drawing wire candle even for 2-color scheme. */\r
        inline void Candle(const mglDataA &y, const char *pen="", const char *opt="")\r
        {       mgl_candle(gr, &y, NULL, NULL, pen, opt);       }\r
+\r
        /// Draw cones from points {x,y,z} to axis plane\r
+       /** String \a pen may contain:\r
+        * ‘@’ for drawing edges;\r
+        * ‘#’ for wired cones;\r
+        * ‘t’ for drawing tubes/cylinders instead of cones/prisms;\r
+        * ‘4’, ‘6’, ‘8’ for drawing square, hex- or octo-prism instead of cones;\r
+        * ‘<’, ‘^’ or ‘>’ for aligning cones left, right or centering them at its x-coordinates.\r
+        * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
        inline void Cones(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *pen="@", const char *opt="")\r
        {       mgl_cones_xyz(gr, &x, &y, &z, pen, opt);        }\r
+       /// Draw cones from points {x,z} to axis plane\r
+       /** String \a pen may contain:\r
+        * ‘@’ for drawing edges;\r
+        * ‘#’ for wired cones;\r
+        * ‘t’ for drawing tubes/cylinders instead of cones/prisms;\r
+        * ‘4’, ‘6’, ‘8’ for drawing square, hex- or octo-prism instead of cones;\r
+        * ‘<’, ‘^’ or ‘>’ for aligning cones left, right or centering them at its x-coordinates.\r
+        * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
        inline void Cones(const mglDataA &x, const mglDataA &z, const char *pen="@", const char *opt="")\r
        {       mgl_cones_xz(gr, &x, &z, pen, opt);     }\r
+       /// Draw cones from points {x,z} with x in x-axis range to axis plane\r
+       /** String \a pen may contain:\r
+        * ‘@’ for drawing edges;\r
+        * ‘#’ for wired cones;\r
+        * ‘t’ for drawing tubes/cylinders instead of cones/prisms;\r
+        * ‘4’, ‘6’, ‘8’ for drawing square, hex- or octo-prism instead of cones;\r
+        * ‘<’, ‘^’ or ‘>’ for aligning cones left, right or centering them at its x-coordinates.\r
+        * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
        inline void Cones(const mglDataA &z, const char *pen="@", const char *opt="")\r
        {       mgl_cones(gr, &z, pen, opt);    }\r
 \r
-       /// Draw error boxes {ex,ey} at points {x,y}\r
+       /// Draw error boxes {ey} at points {x,y} with x in x-axis range\r
+       /** Style ‘@’ set to draw large semitransparent mark instead of error box.*/\r
        inline void Error(const mglDataA &y, const mglDataA &ey, const char *pen="", const char *opt="")\r
        {       mgl_error(gr, &y, &ey, pen, opt);       }\r
+       /// Draw error boxes {ey} at points {x,y}\r
+       /** Style ‘@’ set to draw large semitransparent mark instead of error box.*/\r
        inline void Error(const mglDataA &x, const mglDataA &y, const mglDataA &ey, const char *pen="", const char *opt="")\r
        {       mgl_error_xy(gr, &x, &y, &ey, pen, opt);        }\r
+       /// Draw error boxes {ex,ey} at points {x,y}\r
+       /** Style ‘@’ set to draw large semitransparent mark instead of error box.*/\r
        inline void Error(const mglDataA &x, const mglDataA &y, const mglDataA &ex, const mglDataA &ey, const char *pen="", const char *opt="")\r
        {       mgl_error_exy(gr, &x, &y, &ex, &ey, pen, opt);  }\r
+\r
        /// Draw marks with size r at points {x,y,z}\r
        inline void Mark(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &r, const char *pen, const char *opt="")\r
        {       mgl_mark_xyz(gr, &x, &y, &z, &r, pen, opt);     }\r
+       /// Draw marks with size r at points {x,y}\r
        inline void Mark(const mglDataA &x, const mglDataA &y, const mglDataA &r, const char *pen, const char *opt="")\r
        {       mgl_mark_xy(gr, &x, &y, &r, pen, opt);  }\r
+       /// Draw marks with size r at points {x,y} with x in x-axis range\r
        inline void Mark(const mglDataA &y, const mglDataA &r, const char *pen, const char *opt="")\r
        {       mgl_mark_y(gr, &y, &r, pen, opt);       }\r
+\r
        /// Draw textual marks with size r at points {x,y,z}\r
        inline void TextMark(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &r, const char *text, const char *fnt="", const char *opt="")\r
        {       mgl_textmark_xyzr(gr, &x, &y, &z, &r, text, fnt, opt);  }\r
+       /// Draw textual marks with size r at points {x,y}\r
        inline void TextMark(const mglDataA &x, const mglDataA &y, const mglDataA &r, const char *text, const char *fnt="", const char *opt="")\r
        {       mgl_textmark_xyr(gr, &x, &y, &r, text, fnt, opt);       }\r
+       /// Draw textual marks with size r at points {x,y} with x in x-axis range\r
        inline void TextMark(const mglDataA &y, const mglDataA &r, const char *text, const char *fnt="", const char *opt="")\r
        {       mgl_textmark_yr(gr, &y, &r, text, fnt, opt);    }\r
+       /// Draw textual marks at points {x,y} with x in x-axis range\r
        inline void TextMark(const mglDataA &y, const char *text, const char *fnt="", const char *opt="")\r
        {       mgl_textmark(gr, &y, text, fnt, opt);   }\r
+       /// Draw textual marks with size r at points {x,y,z}\r
        inline void TextMark(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &r, const wchar_t *text, const char *fnt="", const char *opt="")\r
        {       mgl_textmarkw_xyzr(gr, &x, &y, &z, &r, text, fnt, opt); }\r
+       /// Draw textual marks with size r at points {x,y}\r
        inline void TextMark(const mglDataA &x, const mglDataA &y, const mglDataA &r, const wchar_t *text, const char *fnt="", const char *opt="")\r
        {       mgl_textmarkw_xyr(gr, &x, &y, &r, text, fnt, opt);      }\r
+       /// Draw textual marks with size r at points {x,y} with x in x-axis range\r
        inline void TextMark(const mglDataA &y, const mglDataA &r, const wchar_t *text, const char *fnt="", const char *opt="")\r
        {       mgl_textmarkw_yr(gr, &y, &r, text, fnt, opt);   }\r
+       /// Draw textual marks at points {x,y} with x in x-axis range\r
        inline void TextMark(const mglDataA &y, const wchar_t *text, const char *fnt="", const char *opt="")\r
        {       mgl_textmarkw(gr, &y, text, fnt, opt);  }\r
 \r
        /// Draw labels for points coordinate(s) at points {x,y,z}\r
+       /** String \a fnt may contain:\r
+        *       ‘f’ for fixed format of printed numbers;\r
+        *       ‘E’ for using ‘E’ instead of ‘e’;\r
+        *       ‘F’ for printing in LaTeX format;\r
+        *       ‘+’ for printing ‘+’ for positive numbers;\r
+        *       ‘-’ for printing usual ‘-’;\r
+        *       ‘0123456789’ for precision at printing numbers.*/\r
        inline void Label(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *text, const char *fnt="", const char *opt="")\r
        {       mgl_label_xyz(gr, &x, &y, &z, text, fnt, opt);  }\r
+       /// Draw labels for points coordinate(s) at points {x,y}\r
+       /** String \a fnt may contain:\r
+        *       ‘f’ for fixed format of printed numbers;\r
+        *       ‘E’ for using ‘E’ instead of ‘e’;\r
+        *       ‘F’ for printing in LaTeX format;\r
+        *       ‘+’ for printing ‘+’ for positive numbers;\r
+        *       ‘-’ for printing usual ‘-’;\r
+        *       ‘0123456789’ for precision at printing numbers.*/\r
        inline void Label(const mglDataA &x, const mglDataA &y, const char *text, const char *fnt="", const char *opt="")\r
        {       mgl_label_xy(gr, &x, &y, text, fnt, opt);       }\r
+       /// Draw labels for points coordinate(s) at points {x,y} with x in x-axis range\r
+       /** String \a fnt may contain:\r
+        *       ‘f’ for fixed format of printed numbers;\r
+        *       ‘E’ for using ‘E’ instead of ‘e’;\r
+        *       ‘F’ for printing in LaTeX format;\r
+        *       ‘+’ for printing ‘+’ for positive numbers;\r
+        *       ‘-’ for printing usual ‘-’;\r
+        *       ‘0123456789’ for precision at printing numbers.*/\r
        inline void Label(const mglDataA &y, const char *text, const char *fnt="", const char *opt="")\r
        {       mgl_label_y(gr, &y, text, fnt, opt);    }\r
+       /// Draw labels for points coordinate(s) at points {x,y,z}\r
+       /** String \a fnt may contain:\r
+        *       ‘f’ for fixed format of printed numbers;\r
+        *       ‘E’ for using ‘E’ instead of ‘e’;\r
+        *       ‘F’ for printing in LaTeX format;\r
+        *       ‘+’ for printing ‘+’ for positive numbers;\r
+        *       ‘-’ for printing usual ‘-’;\r
+        *       ‘0123456789’ for precision at printing numbers.*/\r
        inline void Label(const mglDataA &x, const mglDataA &y, const mglDataA &z, const wchar_t *text, const char *fnt="", const char *opt="")\r
        {       mgl_labelw_xyz(gr, &x, &y, &z, text, fnt, opt); }\r
+       /// Draw labels for points coordinate(s) at points {x,y}\r
+       /** String \a fnt may contain:\r
+        *       ‘f’ for fixed format of printed numbers;\r
+        *       ‘E’ for using ‘E’ instead of ‘e’;\r
+        *       ‘F’ for printing in LaTeX format;\r
+        *       ‘+’ for printing ‘+’ for positive numbers;\r
+        *       ‘-’ for printing usual ‘-’;\r
+        *       ‘0123456789’ for precision at printing numbers.*/\r
        inline void Label(const mglDataA &x, const mglDataA &y, const wchar_t *text, const char *fnt="", const char *opt="")\r
        {       mgl_labelw_xy(gr, &x, &y, text, fnt, opt);      }\r
+       /// Draw labels for points coordinate(s) at points {x,y} with x in x-axis range\r
+       /** String \a fnt may contain:\r
+        *       ‘f’ for fixed format of printed numbers;\r
+        *       ‘E’ for using ‘E’ instead of ‘e’;\r
+        *       ‘F’ for printing in LaTeX format;\r
+        *       ‘+’ for printing ‘+’ for positive numbers;\r
+        *       ‘-’ for printing usual ‘-’;\r
+        *       ‘0123456789’ for precision at printing numbers.*/\r
        inline void Label(const mglDataA &y, const wchar_t *text, const char *fnt="", const char *opt="")\r
        {       mgl_labelw_y(gr, &y, text, fnt, opt);   }\r
 \r
        /// Draw table for values val along given direction with row labels text\r
+       /** String \a fnt may contain:\r
+        *       ‘#’ for drawing cell borders;\r
+        *       ‘|’ for limiting table widh by subplot one (equal to option ‘value 1’);\r
+        *       ‘=’ for equal width of all cells;\r
+        *       ‘f’ for fixed format of printed numbers;\r
+        *       ‘E’ for using ‘E’ instead of ‘e’;\r
+        *       ‘F’ for printing in LaTeX format;\r
+        *       ‘+’ for printing ‘+’ for positive numbers;\r
+        *       ‘-’ for printing usual ‘-’;\r
+        *       ‘0123456789’ for precision at printing numbers.\r
+        * Option value set the width of the table (default is 1).*/\r
        inline void Table(const mglDataA &val, const char *text, const char *fnt="#|", const char *opt="")\r
        {       mgl_table(gr, 0, 0, &val, text, fnt, opt);      }\r
+       /// Draw table for values val along given direction with row labels text\r
+       /** String \a fnt may contain:\r
+        *       ‘#’ for drawing cell borders;\r
+        *       ‘|’ for limiting table widh by subplot one (equal to option ‘value 1’);\r
+        *       ‘=’ for equal width of all cells;\r
+        *       ‘f’ for fixed format of printed numbers;\r
+        *       ‘E’ for using ‘E’ instead of ‘e’;\r
+        *       ‘F’ for printing in LaTeX format;\r
+        *       ‘+’ for printing ‘+’ for positive numbers;\r
+        *       ‘-’ for printing usual ‘-’;\r
+        *       ‘0123456789’ for precision at printing numbers.\r
+        * Option value set the width of the table (default is 1).*/\r
        inline void Table(const mglDataA &val, const wchar_t *text, const char *fnt="#|", const char *opt="")\r
        {       mgl_tablew(gr, 0, 0, &val, text, fnt, opt);     }\r
        /// Draw table for values val along given direction with row labels text at given position\r
+       /** String \a fnt may contain:\r
+        *       ‘#’ for drawing cell borders;\r
+        *       ‘|’ for limiting table widh by subplot one (equal to option ‘value 1’);\r
+        *       ‘=’ for equal width of all cells;\r
+        *       ‘f’ for fixed format of printed numbers;\r
+        *       ‘E’ for using ‘E’ instead of ‘e’;\r
+        *       ‘F’ for printing in LaTeX format;\r
+        *       ‘+’ for printing ‘+’ for positive numbers;\r
+        *       ‘-’ for printing usual ‘-’;\r
+        *       ‘0123456789’ for precision at printing numbers.\r
+        * Option value set the width of the table (default is 1).*/\r
        inline void Table(double x, double y, const mglDataA &val, const char *text, const char *fnt="#|", const char *opt="")\r
        {       mgl_table(gr, x, y, &val, text, fnt, opt);      }\r
+       /// Draw table for values val along given direction with row labels text at given position\r
+       /** String \a fnt may contain:\r
+        *       ‘#’ for drawing cell borders;\r
+        *       ‘|’ for limiting table widh by subplot one (equal to option ‘value 1’);\r
+        *       ‘=’ for equal width of all cells;\r
+        *       ‘f’ for fixed format of printed numbers;\r
+        *       ‘E’ for using ‘E’ instead of ‘e’;\r
+        *       ‘F’ for printing in LaTeX format;\r
+        *       ‘+’ for printing ‘+’ for positive numbers;\r
+        *       ‘-’ for printing usual ‘-’;\r
+        *       ‘0123456789’ for precision at printing numbers.\r
+        * Option value set the width of the table (default is 1).*/\r
        inline void Table(double x, double y, const mglDataA &val, const wchar_t *text, const char *fnt="#|", const char *opt="")\r
        {       mgl_tablew(gr, x, y, &val, text, fnt, opt);     }\r
 \r
        /// Draw tube with radius r around curve {x,y,z}\r
        inline void Tube(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &r, const char *pen="", const char *opt="")\r
        {       mgl_tube_xyzr(gr, &x, &y, &z, &r, pen, opt);    }\r
+       /// Draw tube with radius r around curve {x,y,z}\r
        inline void Tube(const mglDataA &x, const mglDataA &y, const mglDataA &z, double r, const char *pen="", const char *opt="")\r
        {       mgl_tube_xyz(gr, &x, &y, &z, r, pen, opt);      }\r
+       /// Draw tube with radius r around curve {x,y}\r
        inline void Tube(const mglDataA &x, const mglDataA &y, const mglDataA &r, const char *pen="", const char *opt="")\r
        {       mgl_tube_xyr(gr, &x, &y, &r, pen, opt); }\r
+       /// Draw tube with radius r around curve {x,y}\r
        inline void Tube(const mglDataA &x, const mglDataA &y, double r, const char *pen="", const char *opt="")\r
        {       mgl_tube_xy(gr, &x, &y, r, pen, opt);   }\r
+       /// Draw tube with radius r around curve {x,y} with x in x-axis range\r
        inline void Tube(const mglDataA &y, const mglDataA &r, const char *pen="", const char *opt="")\r
        {       mgl_tube_r(gr, &y, &r, pen, opt);       }\r
+       /// Draw tube with radius r around curve {x,y} with x in x-axis range\r
        inline void Tube(const mglDataA &y, double r, const char *pen="", const char *opt="")\r
        {       mgl_tube(gr, &y, r, pen, opt);  }\r
-       /// Draw surface of curve {r,z} rotatation around axis\r
+       /// Draw surface of curve {r,z} rotation around axis\r
+       /** Style ‘#’ produce wire plot. Style ‘.’ produce plot by dots.*/\r
        inline void Torus(const mglDataA &r, const mglDataA &z, const char *pen="", const char *opt="")\r
        {       mgl_torus(gr, &r, &z, pen,opt); }\r
 \r
        /// Draw mesh lines for 2d data specified parametrically\r
        inline void Mesh(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *stl="", const char *opt="")\r
        {       mgl_mesh_xy(gr, &x, &y, &z, stl, opt);  }\r
+       /// Draw mesh lines for 2d data\r
        inline void Mesh(const mglDataA &z, const char *stl="", const char *opt="")\r
        {       mgl_mesh(gr, &z, stl, opt);     }\r
-       /// Draw mesh lines for 2d data specified parametrically\r
+\r
+       /// Draw waterfall plot for 2d data specified parametrically\r
+       /** Style 'x' draw lines in x-direction. */\r
        inline void Fall(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *stl="", const char *opt="")\r
        {       mgl_fall_xy(gr, &x, &y, &z, stl, opt);  }\r
+       /// Draw waterfall plot for 2d data\r
+       /** Style 'x' draw lines in x-direction. */\r
        inline void Fall(const mglDataA &z, const char *stl="", const char *opt="")\r
        {       mgl_fall(gr, &z, stl, opt);     }\r
+\r
        /// Draw belts for 2d data specified parametrically\r
+       /** Style 'x' draw belts in x-direction. */\r
        inline void Belt(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *stl="", const char *opt="")\r
        {       mgl_belt_xy(gr, &x, &y, &z, stl, opt);  }\r
+       /// Draw belts for 2d data\r
+       /** Style 'x' draw belts in x-direction. */\r
        inline void Belt(const mglDataA &z, const char *stl="", const char *opt="")\r
        {       mgl_belt(gr, &z, stl, opt);     }\r
+\r
        /// Draw surface for 2d data specified parametrically with color proportional to z\r
+       /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
        inline void Surf(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *stl="", const char *opt="")\r
        {       mgl_surf_xy(gr, &x, &y, &z, stl, opt);  }\r
+       /// Draw surface for 2d data with color proportional to z\r
+       /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
        inline void Surf(const mglDataA &z, const char *stl="", const char *opt="")\r
        {       mgl_surf(gr, &z, stl, opt);     }\r
+\r
        /// Draw grid lines for density plot of 2d data specified parametrically\r
        inline void Grid(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *stl="", const char *opt="")\r
        {       mgl_grid_xy(gr, &x, &y, &z, stl, opt);  }\r
+       /// Draw grid lines for density plot of 2d data\r
        inline void Grid(const mglDataA &z, const char *stl="", const char *opt="")\r
        {       mgl_grid(gr, &z, stl, opt);     }\r
+\r
        /// Draw vertical tiles for 2d data specified parametrically\r
        inline void Tile(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *stl="", const char *opt="")\r
        {       mgl_tile_xy(gr, &x, &y, &z, stl, opt);  }\r
+       /// Draw vertical tiles for 2d data\r
        inline void Tile(const mglDataA &z, const char *stl="", const char *opt="")\r
        {       mgl_tile(gr, &z, stl, opt);     }\r
+\r
        /// Draw density plot for 2d data specified parametrically\r
-       inline void Dens(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *stl="", const char *opt="")\r
-       {       mgl_dens_xy(gr, &x, &y, &z, stl, opt);  }\r
-       inline void Dens(const mglDataA &z, const char *stl="", const char *opt="")\r
-       {       mgl_dens(gr, &z, stl, opt);     }\r
+       /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
+       inline void Dens(const mglDataA &x, const mglDataA &y, const mglDataA &c, const char *stl="", const char *opt="")\r
+       {       mgl_dens_xy(gr, &x, &y, &c, stl, opt);  }\r
+       /// Draw density plot for 2d data\r
+       /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
+       inline void Dens(const mglDataA &c, const char *stl="", const char *opt="")\r
+       {       mgl_dens(gr, &c, stl, opt);     }\r
+\r
        /// Draw vertical boxes for 2d data specified parametrically\r
+       /** Style ‘#’ draw filled boxes. */\r
        inline void Boxs(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *stl="", const char *opt="")\r
        {       mgl_boxs_xy(gr, &x, &y, &z, stl, opt);  }\r
+       /// Draw vertical boxes for 2d data\r
+       /** Style ‘#’ draw filled boxes. */\r
        inline void Boxs(const mglDataA &z, const char *stl="", const char *opt="")\r
        {       mgl_boxs(gr, &z, stl, opt);     }\r
 \r
-       /// Draw contour lines for 2d data specified parametrically\r
+       /// Draw contour lines at manual levels for 2d data specified parametrically\r
+       /** Style ‘_’ to draw contours at bottom of axis box.\r
+        * Style 't'/'T' draw contour labels below/above contours.*/\r
        inline void Cont(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_cont_xy_val(gr, &v, &x, &y, &z, sch, opt);  }\r
+       /// Draw contour lines for 2d data\r
+       /** Style ‘_’ to draw contours at bottom of axis box.\r
+        * Style 't'/'T' draw contour labels below/above contours.*/\r
        inline void Cont(const mglDataA &v, const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_cont_val(gr, &v, &z, sch, opt);     }\r
+       /// Draw contour lines at manual levels for 2d data specified parametrically\r
+       /** Style ‘_’ to draw contours at bottom of axis box.\r
+        * Style ‘t’/‘T’ draw contour labels below/above contours.\r
+        * Option "value" set the number of contour levels (default is 7). */\r
        inline void Cont(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_cont_xy(gr, &x, &y, &z, sch, opt);  }\r
+       /// Draw contour lines for 2d data\r
+       /** Style ‘_’ to draw contours at bottom of axis box.\r
+        * Style ‘t’/‘T’ draw contour labels below/above contours.\r
+        * Option "value" set the number of contour levels (default is 7). */\r
        inline void Cont(const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_cont(gr, &z, sch, opt);     }\r
-       /// Draw solid contours for 2d data specified parametrically\r
+\r
+       /// Draw solid contours at manual levels for 2d data specified parametrically\r
+       /** Style ‘_’ to draw contours at bottom of axis box. */\r
        inline void ContF(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_contf_xy_val(gr, &v, &x, &y, &z, sch, opt); }\r
+       /// Draw solid contours at manual levels for 2d data\r
+       /** Style ‘_’ to draw contours at bottom of axis box. */\r
        inline void ContF(const mglDataA &v, const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_contf_val(gr, &v, &z, sch, opt);    }\r
+       /// Draw solid contours for 2d data specified parametrically\r
+       /** Style ‘_’ to draw contours at bottom of axis box.\r
+        * Option "value" set the number of contour levels (default is 7). */\r
        inline void ContF(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_contf_xy(gr, &x, &y, &z, sch, opt); }\r
+       /// Draw solid contours for 2d data\r
+       /** Style ‘_’ to draw contours at bottom of axis box.\r
+        * Option "value" set the number of contour levels (default is 7). */\r
        inline void ContF(const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_contf(gr, &z, sch, opt);    }\r
-       /// Draw solid contours for 2d data specified parametrically with manual colors\r
+\r
+       /// Draw solid contours at manual levels for 2d data specified parametrically with specified colors\r
+       /** Style ‘_’ to draw contours at bottom of axis box. */\r
        inline void ContD(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_contd_xy_val(gr, &v, &x, &y, &z, sch, opt); }\r
+       /// Draw solid contours at manual levels for 2d data with specified colors\r
+       /** Style ‘_’ to draw contours at bottom of axis box. */\r
        inline void ContD(const mglDataA &v, const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_contd_val(gr, &v, &z, sch, opt);    }\r
+       /// Draw solid contours for 2d data specified parametrically with specified colors\r
+       /** Style ‘_’ to draw contours at bottom of axis box.\r
+        * Option "value" set the number of contour levels (default is 7). */\r
        inline void ContD(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_contd_xy(gr, &x, &y, &z, sch, opt); }\r
+       /// Draw solid contours for 2d data with specified colors\r
+       /** Style ‘_’ to draw contours at bottom of axis box.\r
+        * Option "value" set the number of contour levels (default is 7). */\r
        inline void ContD(const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_contd(gr, &z, sch, opt);    }\r
-       /// Draw contour tubes for 2d data specified parametrically\r
+\r
+       /// Draw contour tubes between manual levels for 2d data specified parametrically\r
+       /** Style ‘_’ to draw contours at bottom of axis box. */\r
        inline void ContV(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_contv_xy_val(gr, &v, &x, &y, &z, sch, opt); }\r
+       /// Draw contour tubes between manual levels for 2d data\r
+       /** Style ‘_’ to draw contours at bottom of axis box. */\r
        inline void ContV(const mglDataA &v, const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_contv_val(gr, &v, &z, sch, opt);    }\r
+       /// Draw contour tubes for 2d data specified parametrically\r
+       /** Style ‘_’ to draw contours at bottom of axis box.\r
+        * Option "value" set the number of contour levels (default is 7). */\r
        inline void ContV(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_contv_xy(gr, &x, &y, &z, sch, opt); }\r
+       /// Draw contour tubes for 2d data\r
+       /** Style ‘_’ to draw contours at bottom of axis box.\r
+        * Option "value" set the number of contour levels (default is 7). */\r
        inline void ContV(const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_contv(gr, &z, sch, opt);    }\r
 \r
-       /// Draw axial-symmetric isosurfaces for 2d data specified parametrically\r
+       /// Draw axial-symmetric isosurfaces at manual levels for 2d data specified parametrically\r
+       /** String \a sch may contain:\r
+        * ‘#’ for wired plot;\r
+        * ‘.’ for plot by dots;\r
+        * ‘x’, ‘z’ for rotation around x-, z-axis correspondingly (default is y-axis). */\r
        inline void Axial(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_axial_xy_val(gr, &v, &x, &y, &z, sch,opt);  }\r
+       /// Draw axial-symmetric isosurfaces at manual levels for 2d data\r
+       /** String \a sch may contain:\r
+        * ‘#’ for wired plot;\r
+        * ‘.’ for plot by dots;\r
+        * ‘x’, ‘z’ for rotation around x-, z-axis correspondingly (default is y-axis). */\r
        inline void Axial(const mglDataA &v, const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_axial_val(gr, &v, &z, sch, opt);    }\r
+       /// Draw axial-symmetric isosurfaces for 2d data specified parametrically\r
+       /** String \a sch may contain:\r
+        * ‘#’ for wired plot;\r
+        * ‘.’ for plot by dots;\r
+        * ‘x’, ‘z’ for rotation around x-, z-axis correspondingly (default is y-axis).\r
+        * Option "value" set the number of isosurfaces (default is 3). */\r
        inline void Axial(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_axial_xy(gr, &x, &y, &z, sch, opt); }\r
+       /// Draw axial-symmetric isosurfaces for 2d data\r
+       /** String \a sch may contain:\r
+        * ‘#’ for wired plot;\r
+        * ‘.’ for plot by dots;\r
+        * ‘x’, ‘z’ for rotation around x-, z-axis correspondingly (default is y-axis).\r
+        * Option "value" set the number of isosurfaces (default is 3). */\r
        inline void Axial(const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_axial(gr, &z, sch, opt);    }\r
 \r
        /// Draw grid lines for density plot at slice for 3d data specified parametrically\r
+       /** Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.*/\r
        inline void Grid3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *stl="", double sVal=-1, const char *opt="")\r
        {       mgl_grid3_xyz(gr, &x, &y, &z, &a, stl, sVal, opt);      }\r
+       /// Draw grid lines for density plot at slice for 3d data\r
+       /** Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.*/\r
        inline void Grid3(const mglDataA &a, const char *stl="", double sVal=-1, const char *opt="")\r
        {       mgl_grid3(gr, &a, stl, sVal, opt);      }\r
+\r
        /// Draw density plot at slice for 3d data specified parametrically\r
+       /** Style ‘#’ draw grid lines. Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.*/\r
        inline void Dens3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *stl="", double sVal=-1, const char *opt="")\r
        {       mgl_dens3_xyz(gr, &x, &y, &z, &a, stl, sVal, opt);      }\r
+       /// Draw density plot at slice for 3d data\r
+       /** Style ‘#’ draw grid lines. Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.*/\r
        inline void Dens3(const mglDataA &a, const char *stl="", double sVal=-1, const char *opt="")\r
        {       mgl_dens3(gr, &a, stl, sVal, opt);      }\r
 \r
-       /// Draw isosurface(s) for 3d data specified parametrically\r
+       /// Draw isosurface for 3d data specified parametrically\r
+       /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.*/\r
        inline void Surf3(double Val, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *stl="", const char *opt="")\r
        {       mgl_surf3_xyz_val(gr, Val, &x, &y, &z, &a, stl, opt);   }\r
+       /// Draw isosurface for 3d data\r
+       /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.*/\r
        inline void Surf3(double Val, const mglDataA &a, const char *stl="", const char *opt="")\r
        {       mgl_surf3_val(gr, Val, &a, stl, opt);   }\r
+       /// Draw isosurfaces for 3d data specified parametrically\r
+       /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.\r
+        * Option "value" set the number of isosurfaces (default is 3). */\r
        inline void Surf3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *stl="", const char *opt="")\r
        {       mgl_surf3_xyz(gr, &x, &y, &z, &a, stl, opt);    }\r
+       /// Draw isosurfaces for 3d data\r
+       /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.\r
+        * Option "value" set the number of isosurfaces (default is 3). */\r
        inline void Surf3(const mglDataA &a, const char *stl="", const char *opt="")\r
        {       mgl_surf3(gr, &a, stl, opt);    }\r
 \r
-       /// Draw a semi-transparent cloud for 3d data\r
+       /// Draw a semi-transparent cloud for 3d data specified parametrically\r
+       /** Style ‘.’ produce plot by dots. Style ‘i’ use inverted values for transparency. */\r
        inline void Cloud(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *stl="", const char *opt="")\r
        {       mgl_cloud_xyz(gr, &x, &y, &z, &a, stl, opt);    }\r
+       /// Draw a semi-transparent cloud for 3d data\r
+       /** Style ‘.’ produce plot by dots. Style ‘i’ use inverted values for transparency. */\r
        inline void Cloud(const mglDataA &a, const char *stl="", const char *opt="")\r
        {       mgl_cloud(gr, &a, stl, opt);    }\r
 \r
-       /// Draw contour lines at slice for 3d data specified parametrically\r
+       /// Draw contour lines at manual levels along slice for 3d data specified parametrically\r
+       /** Style ‘#’ draw grid lines.\r
+        * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.\r
+        * Style ‘t’/‘T’ draw contour labels below/above contours. */\r
        inline void Cont3(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="")\r
        {       mgl_cont3_xyz_val(gr, &v, &x, &y, &z, &a, sch, sVal, opt);      }\r
+       /// Draw contour lines at manual levels along slice for 3d data\r
+       /** Style ‘#’ draw grid lines.\r
+        * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.\r
+        * Style ‘t’/‘T’ draw contour labels below/above contours. */\r
        inline void Cont3(const mglDataA &v, const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="")\r
        {       mgl_cont3_val(gr, &v, &a, sch, sVal, opt);      }\r
+       /// Draw contour lines along slice for 3d data specified parametrically\r
+       /** Style ‘#’ draw grid lines.\r
+        * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.\r
+        * Style ‘t’/‘T’ draw contour labels below/above contours.\r
+        * Option "value" set the number of contour levels (default is 7). */\r
        inline void Cont3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="")\r
        {       mgl_cont3_xyz(gr, &x, &y, &z, &a, sch, sVal, opt);      }\r
+       /// Draw contour lines along slice for 3d data\r
+       /** Style ‘#’ draw grid lines.\r
+        * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.\r
+        * Style ‘t’/‘T’ draw contour labels below/above contours.\r
+        * Option "value" set the number of contour levels (default is 7). */\r
        inline void Cont3(const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="")\r
        {       mgl_cont3(gr, &a, sch, sVal, opt);      }\r
 \r
-       /// Draw solid contours at slice for 3d data specified parametrically\r
+       /// Draw solid contours at manual levels along slice for 3d data specified parametrically\r
+       /** Style ‘#’ draw grid lines. Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. */\r
        inline void ContF3(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="")\r
        {       mgl_contf3_xyz_val(gr, &v, &x, &y, &z, &a, sch, sVal, opt);     }\r
+       /// Draw solid contours at manual levels along slice for 3d data\r
+       /** Style ‘#’ draw grid lines. Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. */\r
        inline void ContF3(const mglDataA &v, const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="")\r
        {       mgl_contf3_val(gr, &v, &a, sch, sVal, opt);     }\r
+       /// Draw solid contours along slice for 3d data specified parametrically\r
+       /** Style ‘#’ draw grid lines. Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.\r
+        *  Option "value" set the number of contour levels (default is 7).*/\r
        inline void ContF3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="")\r
        {       mgl_contf3_xyz(gr, &x, &y, &z, &a, sch, sVal, opt);     }\r
+       /// Draw solid contours along slice for 3d data\r
+       /** Style ‘#’ draw grid lines. Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.\r
+        *  Option "value" set the number of contour levels (default is 7).*/\r
        inline void ContF3(const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="")\r
        {       mgl_contf3(gr, &a, sch, sVal, opt);     }\r
 \r
        /// Draw several isosurfaces for 3d beam in curvilinear coordinates\r
+       /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.\r
+        *  Variable \a flag is bitwise:\r
+        * ‘0x1’ - draw in accompanied (not laboratory) coordinates;\r
+        * ‘0x2’ - draw projection to \rho-z plane;\r
+        * ‘0x4’ - draw normalized in each slice field.*/\r
        inline void Beam(const mglDataA &tr, const mglDataA &g1, const mglDataA &g2, const mglDataA &a, double r, const char *stl=0, int flag=0, int num=3)\r
        {       mgl_beam(gr, &tr,&g1,&g2,&a,r,stl,flag,num);    }\r
+       /// Draw isosurface at value \a val for 3d beam in curvilinear coordinates\r
+       /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.\r
+        *  Variable \a flag is bitwise:\r
+        * ‘0x1’ - draw in accompanied (not laboratory) coordinates;\r
+        * ‘0x2’ - draw projection to \rho-z plane;\r
+        * ‘0x4’ - draw normalized in each slice field.*/\r
        inline void Beam(double val, const mglDataA &tr, const mglDataA &g1, const mglDataA &g2, const mglDataA &a, double r, const char *stl=NULL, int flag=0)\r
        {       mgl_beam_val(gr,val,&tr,&g1,&g2,&a,r,stl,flag); }\r
 \r
        /// Draw vertical tiles with variable size r for 2d data specified parametrically\r
        inline void TileS(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &r, const char *stl="", const char *opt="")\r
        {       mgl_tiles_xy(gr, &x, &y, &z, &r, stl, opt);     }\r
+       /// Draw vertical tiles with variable size r for 2d data\r
        inline void TileS(const mglDataA &z, const mglDataA &r, const char *stl="", const char *opt="")\r
        {       mgl_tiles(gr, &z, &r, stl, opt);        }\r
+\r
        /// Draw surface for 2d data specified parametrically with color proportional to c\r
+       /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
        inline void SurfC(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const char *sch="", const char *opt="")\r
        {       mgl_surfc_xy(gr, &x, &y, &z, &c, sch,opt);      }\r
+       /// Draw surface for 2d data with color proportional to c\r
+       /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
        inline void SurfC(const mglDataA &z, const mglDataA &c, const char *sch="", const char *opt="")\r
        {       mgl_surfc(gr, &z, &c, sch,opt); }\r
+\r
        /// Draw surface for 2d data specified parametrically with alpha proportional to c\r
+       /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
        inline void SurfA(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const char *sch="", const char *opt="")\r
        {       mgl_surfa_xy(gr, &x, &y, &z, &c, sch,opt);      }\r
+       /// Draw surface for 2d data with alpha proportional to c\r
+       /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
        inline void SurfA(const mglDataA &z, const mglDataA &c, const char *sch="", const char *opt="")\r
        {       mgl_surfa(gr, &z, &c, sch,opt); }\r
 \r
+       /// Draw surface for 2d data specified parametrically with color proportional to c and alpha proportional to a\r
+       /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
+       inline void SurfCA(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const mglDataA &a, const char *sch="", const char *opt="")\r
+       {       mgl_surfca_xy(gr, &x, &y, &z, &c, &a, sch,opt); }\r
+       /// Draw surface for 2d data with color proportional to c and alpha proportional to a\r
+       /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
+       inline void SurfCA(const mglDataA &z, const mglDataA &c, const mglDataA &a, const char *sch="", const char *opt="")\r
+       {       mgl_surfca(gr, &z, &c, &a, sch,opt);    }\r
+\r
        /// Color map of matrix a to matrix b, both matrix can parametrically depend on coordinates\r
+       /** Style ‘.’ produce plot by dots. */\r
        inline void Map(const mglDataA &x, const mglDataA &y, const mglDataA &a, const mglDataA &b, const char *sch="", const char *opt="")\r
        {       mgl_map_xy(gr, &x, &y, &a, &b, sch, opt);       }\r
+       /// Color map of matrix a to matrix b\r
+       /** Style ‘.’ produce plot by dots. */\r
        inline void Map(const mglDataA &a, const mglDataA &b, const char *sch="", const char *opt="")\r
        {       mgl_map(gr, &a, &b, sch, opt);  }\r
+\r
        /// Draw density plot for spectra-gramm specified parametrically\r
+       /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
        inline void STFA(const mglDataA &x, const mglDataA &y, const mglDataA &re, const mglDataA &im, int dn, const char *sch="", const char *opt="")\r
        {       mgl_stfa_xy(gr, &x, &y, &re, &im, dn, sch, opt);        }\r
+       /// Draw density plot for spectra-gramm\r
+       /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
        inline void STFA(const mglDataA &re, const mglDataA &im, int dn, const char *sch="", const char *opt="")\r
        {       mgl_stfa(gr, &re, &im, dn, sch, opt);   }\r
 \r
-       /// Draw isosurface(s) for 3d data specified parametrically with alpha proportional to b\r
+       /// Draw isosurface for 3d data specified parametrically with alpha proportional to b\r
+       /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */\r
        inline void Surf3A(double Val, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="")\r
        {       mgl_surf3a_xyz_val(gr, Val, &x, &y, &z, &a, &b, stl, opt);      }\r
+       /// Draw isosurface for 3d data with alpha proportional to b\r
+       /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */\r
        inline void Surf3A(double Val, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="")\r
        {       mgl_surf3a_val(gr, Val, &a, &b, stl, opt);      }\r
+       /// Draw isosurfaces for 3d data specified parametrically with alpha proportional to b\r
+       /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.\r
+        * Option "value" set the number of isosurfaces (default is 3). */\r
        inline void Surf3A(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="")\r
        {       mgl_surf3a_xyz(gr, &x, &y, &z, &a, &b, stl, opt);       }\r
+       /// Draw isosurfaces for 3d data with alpha proportional to b\r
+       /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.\r
+        * Option "value" set the number of isosurfaces (default is 3). */\r
        inline void Surf3A(const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="")\r
        {       mgl_surf3a(gr, &a, &b, stl, opt);       }\r
 \r
-       /// Draw isosurface(s) for 3d data specified parametrically with color proportional to b\r
-       inline void Surf3C(double Val, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="")\r
-       {       mgl_surf3c_xyz_val(gr, Val, &x, &y, &z, &a, &b, stl,opt);       }\r
-       inline void Surf3C(double Val, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="")\r
-       {       mgl_surf3c_val(gr, Val, &a, &b, stl, opt);      }\r
-       inline void Surf3C(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="")\r
-       {       mgl_surf3c_xyz(gr, &x, &y, &z, &a, &b, stl, opt);       }\r
-       inline void Surf3C(const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="")\r
-       {       mgl_surf3c(gr, &a, &b, stl, opt);       }\r
+       /// Draw isosurface for 3d data specified parametrically with color proportional to c\r
+       /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */\r
+       inline void Surf3C(double Val, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &c, const char *stl="", const char *opt="")\r
+       {       mgl_surf3c_xyz_val(gr, Val, &x, &y, &z, &a, &c, stl,opt);       }\r
+       /// Draw isosurface for 3d data with color proportional to c\r
+       /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */\r
+       inline void Surf3C(double Val, const mglDataA &a, const mglDataA &c, const char *stl="", const char *opt="")\r
+       {       mgl_surf3c_val(gr, Val, &a, &c, stl, opt);      }\r
+       /// Draw isosurfaces for 3d data specified parametrically with color proportional to c\r
+       /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.\r
+        * Option "value" set the number of isosurfaces (default is 3). */\r
+       inline void Surf3C(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &c, const char *stl="", const char *opt="")\r
+       {       mgl_surf3c_xyz(gr, &x, &y, &z, &a, &c, stl, opt);       }\r
+       /// Draw isosurfaces for 3d data specified parametrically with color proportional to c\r
+       /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.\r
+        * Option "value" set the number of isosurfaces (default is 3). */\r
+       inline void Surf3C(const mglDataA &a, const mglDataA &c, const char *stl="", const char *opt="")\r
+       {       mgl_surf3c(gr, &a, &c, stl, opt);       }\r
+\r
+       /// Draw isosurface for 3d data specified parametrically with color proportional to c and alpha proportional to b\r
+       /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */\r
+       inline void Surf3CA(double Val, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &c, const mglDataA &b, const char *stl="", const char *opt="")\r
+       {       mgl_surf3ca_xyz_val(gr, Val, &x, &y, &z, &a, &c, &b, stl,opt);  }\r
+       /// Draw isosurface for 3d data with color proportional to c and alpha proportional to b\r
+       /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */\r
+       inline void Surf3CA(double Val, const mglDataA &a, const mglDataA &c, const mglDataA &b, const char *stl="", const char *opt="")\r
+       {       mgl_surf3ca_val(gr, Val, &a, &c, &b, stl, opt); }\r
+       /// Draw isosurfaces for 3d data specified parametrically with color proportional to c and alpha proportional to b\r
+       /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.\r
+        * Option "value" set the number of isosurfaces (default is 3). */\r
+       inline void Surf3CA(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &c, const mglDataA &b, const char *stl="", const char *opt="")\r
+       {       mgl_surf3ca_xyz(gr, &x, &y, &z, &a, &c, &b, stl, opt);  }\r
+       /// Draw isosurfaces for 3d data with color proportional to c and alpha proportional to b\r
+       /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.\r
+        * Option "value" set the number of isosurfaces (default is 3). */\r
+       inline void Surf3CA(const mglDataA &a, const mglDataA &c, const mglDataA &b, const char *stl="", const char *opt="")\r
+       {       mgl_surf3ca(gr, &a, &c, &b, stl, opt);  }\r
 \r
        /// Plot dew drops for vector field {ax,ay} parametrically depended on coordinate {x,y}\r
        inline void Dew(const mglDataA &x, const mglDataA &y, const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="")\r
        {       mgl_dew_xy(gr, &x, &y, &ax, &ay, sch, opt);     }\r
+       /// Plot dew drops for vector field {ax,ay}\r
        inline void Dew(const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="")\r
        {       mgl_dew_2d(gr, &ax, &ay, sch, opt);     }\r
-       /// Plot vectors at position {x,y,z} along {ax,ay,az} with length/color proportional to |a|\r
+\r
+       /// Plot vectors at position {x,y} along {ax,ay} with length/color proportional to |a|\r
+       /** Option value set the vector length factor (if non-zero) or vector length to be proportional the distance between curve points (if value=0). */\r
        inline void Traj(const mglDataA &x, const mglDataA &y, const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="")\r
        {       mgl_traj_xy(gr, &x, &y, &ax, &ay, sch, opt);    }\r
+       /// Plot vectors at position {x,y,z} along {ax,ay,az} with length/color proportional to |a|\r
+       /** Option value set the vector length factor (if non-zero) or vector length to be proportional the distance between curve points (if value=0). */\r
        inline void Traj(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="")\r
        {       mgl_traj_xyz(gr, &x, &y, &z, &ax, &ay, &az, sch, opt);  }\r
 \r
-       /// Plot vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with length/color proportional to |a|\r
+       /// Plot vector field {ax,ay} parametrically depended on coordinate {x,y} with length/color proportional to |a|\r
+       /** String \a sch may contain:\r
+        * ‘f’ for drawing arrows with fixed lengths,\r
+        * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering),\r
+        * ‘.’ for drawing hachures with dots instead of arrows,\r
+        * ‘=’ for enabling color gradient along arrows. */\r
        inline void Vect(const mglDataA &x, const mglDataA &y, const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="")\r
        {       mgl_vect_xy(gr, &x, &y, &ax, &ay, sch, opt);    }\r
+       /// Plot vector field {ax,ay} with length/color proportional to |a|\r
+       /** String \a sch may contain:\r
+        * ‘f’ for drawing arrows with fixed lengths,\r
+        * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering),\r
+        * ‘.’ for drawing hachures with dots instead of arrows,\r
+        * ‘=’ for enabling color gradient along arrows. */\r
        inline void Vect(const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="")\r
        {       mgl_vect_2d(gr, &ax, &ay, sch, opt);    }\r
+       /// Plot vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with length/color proportional to |a|\r
+       /** String \a sch may contain:\r
+        * ‘f’ for drawing arrows with fixed lengths,\r
+        * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering),\r
+        * ‘.’ for drawing hachures with dots instead of arrows,\r
+        * ‘=’ for enabling color gradient along arrows. */\r
        inline void Vect(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="")\r
        {       mgl_vect_xyz(gr, &x, &y, &z, &ax, &ay, &az, sch, opt);  }\r
+       /// Plot vector field {ax,ay,az} with length/color proportional to |a|\r
+       /** String \a sch may contain:\r
+        * ‘f’ for drawing arrows with fixed lengths,\r
+        * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering),\r
+        * ‘.’ for drawing hachures with dots instead of arrows,\r
+        * ‘=’ for enabling color gradient along arrows. */\r
        inline void Vect(const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="")\r
        {       mgl_vect_3d(gr, &ax, &ay, &az, sch, opt);       }\r
 \r
-       /// Draw vector plot at slice for 3d data specified parametrically\r
+       /// Draw vector plot along slice for 3d data specified parametrically\r
+       /** String \a sch may contain:\r
+        * ‘f’ for drawing arrows with fixed lengths,\r
+        * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering),\r
+        * ‘.’ for drawing hachures with dots instead of arrows,\r
+        * ‘=’ for enabling color gradient along arrows,\r
+        * ‘ x’, ‘z’ for producing plot perpendicular to x- or z-direction correspondingly. */\r
        inline void Vect3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *stl="", double sVal=-1, const char *opt="")\r
        {       mgl_vect3_xyz(gr, &x, &y, &z, &ax,&ay,&az, stl, sVal, opt);     }\r
+       /// Draw vector plot along slice for 3d data\r
+       /** String \a sch may contain:\r
+        * ‘f’ for drawing arrows with fixed lengths,\r
+        * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering),\r
+        * ‘.’ for drawing hachures with dots instead of arrows,\r
+        * ‘=’ for enabling color gradient along arrows,\r
+        * ‘ x’, ‘z’ for producing plot perpendicular to x- or z-direction correspondingly. */\r
        inline void Vect3(const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *stl="", double sVal=-1, const char *opt="")\r
        {       mgl_vect3(gr, &ax,&ay,&az, stl, sVal, opt);     }\r
 \r
-       /// Plot flows for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a|\r
+       /// Plot flows for vector field {ax,ay} parametrically depended on coordinate {x,y} with color proportional to |a|\r
+       /** String \a sch may contain:\r
+        * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+        * ‘#’ for starting threads from edges only;\r
+        * ‘v’ for drawing arrows on the threads;\r
+        * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly.\r
+        * Option "value" sets the number of threads (default is 5). */\r
        inline void Flow(const mglDataA &x, const mglDataA &y, const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="")\r
        {       mgl_flow_xy(gr, &x, &y, &ax, &ay, sch, opt);    }\r
+       /// Plot flows for vector field {ax,ay} with color proportional to |a|\r
+       /** String \a sch may contain:\r
+        * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+        * ‘#’ for starting threads from edges only;\r
+        * ‘v’ for drawing arrows on the threads;\r
+        * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly.\r
+        * Option "value" sets the number of threads (default is 5). */\r
        inline void Flow(const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="")\r
        {       mgl_flow_2d(gr, &ax, &ay, sch, opt);    }\r
+       /// Plot flows for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a|\r
+       /** String \a sch may contain:\r
+        * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+        * ‘#’ for starting threads from edges only;\r
+        * ‘v’ for drawing arrows on the threads;\r
+        * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly.\r
+        * Option "value" sets the number of threads (default is 5). */\r
        inline void Flow(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="")\r
        {       mgl_flow_xyz(gr, &x, &y, &z, &ax, &ay, &az, sch, opt);  }\r
+       /// Plot flows for vector field {ax,ay,az} with color proportional to |a|\r
+       /** String \a sch may contain:\r
+        * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+        * ‘#’ for starting threads from edges only;\r
+        * ‘v’ for drawing arrows on the threads;\r
+        * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly.\r
+        * Option "value" sets the number of threads (default is 5). */\r
        inline void Flow(const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="")\r
        {       mgl_flow_3d(gr, &ax, &ay, &az, sch, opt);       }\r
 \r
-       /// Plot flow from point p for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a|\r
+       /// Plot flow from point p for vector field {ax,ay} parametrically depended on coordinate {x,y} with color proportional to |a|\r
+       /** String \a sch may contain:\r
+        * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+        * ‘#’ for starting threads from edges only;\r
+        * ‘v’ for drawing arrows on the threads. */\r
        inline void FlowP(mglPoint p, const mglDataA &x, const mglDataA &y, const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="")\r
        {       mgl_flowp_xy(gr, p.x, p.y, p.z, &x, &y, &ax, &ay, sch, opt);    }\r
+       /// Plot flow from point p for vector field {ax,ay} with color proportional to |a|\r
+       /** String \a sch may contain:\r
+        * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+        * ‘#’ for starting threads from edges only;\r
+        * ‘v’ for drawing arrows on the threads. */\r
        inline void FlowP(mglPoint p, const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="")\r
        {       mgl_flowp_2d(gr, p.x, p.y, p.z, &ax, &ay, sch, opt);    }\r
+       /// Plot flow from point p for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a|\r
+       /** String \a sch may contain:\r
+        * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+        * ‘#’ for starting threads from edges only;\r
+        * ‘v’ for drawing arrows on the threads;\r
+        * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. */\r
        inline void FlowP(mglPoint p, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="")\r
        {       mgl_flowp_xyz(gr, p.x, p.y, p.z, &x, &y, &z, &ax, &ay, &az, sch, opt);  }\r
+       /// Plot flow from point p for vector field {ax,ay,az} with color proportional to |a|\r
+       /** String \a sch may contain:\r
+        * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+        * ‘#’ for starting threads from edges only;\r
+        * ‘v’ for drawing arrows on the threads;\r
+        * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. */\r
        inline void FlowP(mglPoint p, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="")\r
        {       mgl_flowp_3d(gr, p.x, p.y, p.z, &ax, &ay, &az, sch, opt);       }\r
 \r
        /// Plot flows for gradient of scalar field phi parametrically depended on coordinate {x,y,z}\r
+       /** String \a sch may contain:\r
+        * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+        * ‘#’ for starting threads from edges only;\r
+        * ‘v’ for drawing arrows on the threads;\r
+        * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly.\r
+        * Option "value" sets the number of threads (default is 5). */\r
        inline void Grad(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &phi, const char *sch="", const char *opt="")\r
        {       mgl_grad_xyz(gr,&x,&y,&z,&phi,sch,opt); }\r
+       /// Plot flows for gradient of scalar field phi parametrically depended on coordinate {x,y}\r
+       /** String \a sch may contain:\r
+        * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+        * ‘#’ for starting threads from edges only;\r
+        * ‘v’ for drawing arrows on the threads;\r
+        * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly.\r
+        * Option "value" sets the number of threads (default is 5). */\r
        inline void Grad(const mglDataA &x, const mglDataA &y, const mglDataA &phi, const char *sch="", const char *opt="")\r
        {       mgl_grad_xy(gr,&x,&y,&phi,sch,opt);     }\r
+       /// Plot flows for gradient of scalar field phi\r
+       /** String \a sch may contain:\r
+        * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+        * ‘#’ for starting threads from edges only;\r
+        * ‘v’ for drawing arrows on the threads;\r
+        * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly.\r
+        * Option "value" sets the number of threads (default is 5). */\r
        inline void Grad(const mglDataA &phi, const char *sch="", const char *opt="")\r
        {       mgl_grad(gr,&phi,sch,opt);      }\r
 \r
-       /// Plot flow pipes for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color and radius proportional to |a|\r
+       /// Plot flow pipes for vector field {ax,ay} parametrically depended on coordinate {x,y} with color and radius proportional to |a|\r
+       /** String \a sch may contain:\r
+        * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+        * ‘#’ for starting threads from edges only;\r
+        * ‘i’ for pipe radius to be inverse proportional to amplitude.\r
+        * Option "value" sets the number of threads (default is 5). */\r
        inline void Pipe(const mglDataA &x, const mglDataA &y, const mglDataA &ax, const mglDataA &ay, const char *sch="", double r0=0.05, const char *opt="")\r
        {       mgl_pipe_xy(gr, &x, &y, &ax, &ay, sch, r0, opt);        }\r
+       /// Plot flow pipes for vector field {ax,ay} with color and radius proportional to |a|\r
+       /** String \a sch may contain:\r
+        * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+        * ‘#’ for starting threads from edges only;\r
+        * ‘i’ for pipe radius to be inverse proportional to amplitude.\r
+        * Option "value" sets the number of threads (default is 5). */\r
        inline void Pipe(const mglDataA &ax, const mglDataA &ay, const char *sch="", double r0=0.05, const char *opt="")\r
        {       mgl_pipe_2d(gr, &ax, &ay, sch, r0, opt);        }\r
+       /// Plot flow pipes for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color and radius proportional to |a|\r
+       /** String \a sch may contain:\r
+        * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+        * ‘#’ for starting threads from edges only;\r
+        * ‘i’ for pipe radius to be inverse proportional to amplitude;\r
+        * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly.\r
+        * Option "value" sets the number of threads (default is 5). */\r
        inline void Pipe(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", double r0=0.05, const char *opt="")\r
        {       mgl_pipe_xyz(gr, &x, &y, &z, &ax, &ay, &az, sch, r0, opt);      }\r
+       /// Plot flow pipes for vector field {ax,ay,az} with color and radius proportional to |a|\r
+       /** String \a sch may contain:\r
+        * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+        * ‘#’ for starting threads from edges only;\r
+        * ‘i’ for pipe radius to be inverse proportional to amplitude;\r
+        * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly.\r
+        * Option "value" sets the number of threads (default is 5). */\r
        inline void Pipe(const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", double r0=0.05, const char *opt="")\r
        {       mgl_pipe_3d(gr, &ax, &ay, &az, sch, r0, opt);   }\r
 \r
        /// Draw density plot for data at x = sVal\r
+       /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
        inline void DensX(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="")\r
        {       mgl_dens_x(gr, &a, stl, sVal, opt);     }\r
        /// Draw density plot for data at y = sVal\r
+       /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
        inline void DensY(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="")\r
        {       mgl_dens_y(gr, &a, stl, sVal, opt);     }\r
        /// Draw density plot for data at z = sVal\r
+       /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
        inline void DensZ(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="")\r
        {       mgl_dens_z(gr, &a, stl, sVal, opt);     }\r
+\r
        /// Draw contour lines for data at x = sVal\r
+       /** Style ‘t’/‘T’ draw contour labels below/above contours.\r
+        * Option "value" set the number of contour levels (default is 7). */\r
        inline void ContX(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="")\r
        {       mgl_cont_x(gr, &a, stl, sVal, opt);     }\r
+       /// Draw contour lines at manual levels for data at x = sVal\r
+       /** Style ‘t’/‘T’ draw contour labels below/above contours. */\r
        inline void ContX(const mglDataA &v, const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="")\r
        {       mgl_cont_x_val(gr, &v, &a, stl, sVal, opt);     }\r
        /// Draw contour lines for data at y = sVal\r
+       /** Style ‘t’/‘T’ draw contour labels below/above contours.\r
+        * Option "value" set the number of contour levels (default is 7). */\r
        inline void ContY(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="")\r
        {       mgl_cont_y(gr, &a, stl, sVal, opt);     }\r
+       /// Draw contour lines at manual levels for data at y = sVal\r
+       /** Style ‘t’/‘T’ draw contour labels below/above contours. */\r
        inline void ContY(const mglDataA &v, const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="")\r
        {       mgl_cont_y_val(gr, &v, &a, stl, sVal, opt);     }\r
        /// Draw contour lines for data at z = sVal\r
+       /** Style ‘t’/‘T’ draw contour labels below/above contours.\r
+        * Option "value" set the number of contour levels (default is 7). */\r
        inline void ContZ(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="")\r
        {       mgl_cont_z(gr, &a, stl, sVal, opt);     }\r
+       /// Draw contour lines at manual levels for data at z = sVal\r
+       /** Style ‘t’/‘T’ draw contour labels below/above contours. */\r
        inline void ContZ(const mglDataA &v, const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="")\r
        {       mgl_cont_z_val(gr, &v, &a, stl, sVal, opt);     }\r
+\r
        /// Draw solid contours for data at x = sVal\r
+       /** Option "value" set the number of contour levels (default is 7). */\r
        inline void ContFX(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="")\r
        {       mgl_contf_x(gr, &a, stl, sVal, opt);    }\r
+       /// Draw solid contours at manual levels for data at x = sVal\r
        inline void ContFX(const mglDataA &v, const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="")\r
        {       mgl_contf_x_val(gr, &v, &a, stl, sVal, opt);    }\r
        /// Draw solid contours for data at y = sVal\r
+       /** Option "value" set the number of contour levels (default is 7). */\r
        inline void ContFY(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="")\r
        {       mgl_contf_y(gr, &a, stl, sVal, opt);    }\r
+       /// Draw solid contours at manual levels for data at y = sVal\r
        inline void ContFY(const mglDataA &v, const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="")\r
        {       mgl_contf_y_val(gr, &v, &a, stl, sVal, opt);    }\r
        /// Draw solid contours for data at z = sVal\r
+       /** Option "value" set the number of contour levels (default is 7). */\r
        inline void ContFZ(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="")\r
        {       mgl_contf_z(gr, &a, stl, sVal, opt);    }\r
+       /// Draw solid contours at manual levels for data at z = sVal\r
        inline void ContFZ(const mglDataA &v, const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="")\r
        {       mgl_contf_z_val(gr, &v, &a, stl, sVal, opt);    }\r
 \r
        /// Draw curve for formula with x in x-axis range\r
+       /** Option "value" set initial number of points. */\r
        inline void FPlot(const char *fy, const char *stl="", const char *opt="")\r
        {       mgl_fplot(gr, fy, stl, opt);    }\r
        /// Draw curve for formulas parametrically depended on t in range [0,1]\r
+       /** Option "value" set initial number of points. */\r
        inline void FPlot(const char *fx, const char *fy, const char *fz, const char *stl, const char *opt="")\r
        {       mgl_fplot_xyz(gr, fx, fy, fz, stl, opt);        }\r
        /// Draw surface by formula with x,y in axis range\r
+       /** Option "value" set initial number of points. */\r
        inline void FSurf(const char *fz, const char *stl="", const char *opt="")\r
        {       mgl_fsurf(gr, fz, stl, opt);    }\r
        /// Draw surface by formulas parametrically depended on u,v in range [0,1]\r
+       /** Option "value" set initial number of points. */\r
        inline void FSurf(const char *fx, const char *fy, const char *fz, const char *stl, const char *opt="")\r
        {       mgl_fsurf_xyz(gr, fx, fy, fz, stl, opt);        }\r
 \r
        /// Draw triangle mesh for points in arrays {x,y,z} with specified color c.\r
+       /** Style ‘#’ produce wire plot. If id.ny=c.nx then c set the triangle colors, else vertex colors. */\r
        inline void TriPlot(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const char *sch="", const char *opt="")\r
        {       mgl_triplot_xyzc(gr, &nums, &x, &y, &z, &c, sch, opt);  }\r
+       /// Draw triangle mesh for points in arrays {x,y,z}\r
+       /** Style ‘#’ produce wire plot. */\r
        inline void TriPlot(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_triplot_xyz(gr, &nums, &x, &y, &z, sch, opt);       }\r
+       /// Draw triangle mesh for points in arrays {x,y}\r
+       /** Style ‘#’ produce wire plot. */\r
        inline void TriPlot(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const char *sch="", const char *opt="")\r
        {       mgl_triplot_xy(gr, &nums, &x, &y, sch, opt);    }\r
-       /// Draw quad mesh for points in arrays {x,y,z} with specified color c.\r
+\r
+       /// Draw quad mesh for points in arrays {x,y,z} with specified color c\r
+       /** Style ‘#’ produce wire plot. If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */\r
        inline void QuadPlot(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const char *sch="", const char *opt="")\r
        {       mgl_quadplot_xyzc(gr, &nums, &x, &y, &z, &c, sch, opt); }\r
+       /// Draw quad mesh for points in arrays {x,y,z}\r
+       /** Style ‘#’ produce wire plot. */\r
        inline void QuadPlot(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_quadplot_xyz(gr, &nums, &x, &y, &z, sch, opt);      }\r
+       /// Draw quad mesh for points in arrays {x,y}\r
+       /** Style ‘#’ produce wire plot. */\r
        inline void QuadPlot(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const char *sch="", const char *opt="")\r
        {       mgl_quadplot_xy(gr, &nums, &x, &y, sch, opt);   }\r
 \r
-       /// Draw contour lines for triangle mesh for points in arrays {x,y,z} with specified color c.\r
+       /// Draw contour lines for triangle mesh for points in arrays {x,y,z}\r
+       /** Style ‘_’ to draw contours at bottom of axis box.\r
+        * Style ‘t’/‘T’ draw contour labels below/above contours.\r
+        * If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */\r
        inline void TriCont(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_tricont_xyc(gr, &nums, &x, &y, &z, sch, opt);       }\r
+       /// Draw contour lines for triangle mesh for points in arrays {x,y,z}\r
+       /** Style ‘_’ to draw contours at bottom of axis box.\r
+        * Style ‘t’/‘T’ draw contour labels below/above contours.\r
+        * If id.ny=c.nx then c set the quadrangle colors, else vertex colors.\r
+        * Option "value" set the number of contour levels (default is 7). */\r
        inline void TriContV(const mglDataA &v, const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_tricont_xycv(gr, &v, &nums, &x, &y, &z, sch, opt);  }\r
+       /// Draw contour lines for triangle mesh for points in arrays {x,y,z} with specified color c.\r
+       /** Style ‘_’ to draw contours at bottom of axis box.\r
+        * Style ‘t’/‘T’ draw contour labels below/above contours.\r
+        * If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */\r
        inline void TriCont(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", const char *opt="")\r
        {       mgl_tricont_xyzc(gr, &nums, &x, &y, &z, &a, sch, opt);  }\r
+       /// Draw contour lines for triangle mesh for points in arrays {x,y,z} with specified color c.\r
+       /** Style ‘_’ to draw contours at bottom of axis box.\r
+        * Style ‘t’/‘T’ draw contour labels below/above contours.\r
+        * If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */\r
        inline void TriContV(const mglDataA &v, const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", const char *opt="")\r
        {       mgl_tricont_xyzcv(gr, &v, &nums, &x, &y, &z, &a, sch, opt);     }\r
+       /// Draw contour lines for triangle mesh for points in arrays {x,y,z} with specified color c.\r
+       /** Style ‘_’ to draw contours at bottom of axis box.\r
+        * Style ‘t’/‘T’ draw contour labels below/above contours.\r
+        * If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */\r
        inline void TriCont(const mglDataA &v, const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", const char *opt="")\r
        {       mgl_tricont_xyzcv(gr, &v, &nums, &x, &y, &z, &a, sch, opt);     }\r
 \r
-       /// Draw contour tubes for triangle mesh for points in arrays {x,y,z} with specified color c.\r
+       /// Draw contour tubes for triangle mesh for points in arrays {x,y,z}\r
+       /** Option "value" set the number of contour levels (default is 7). */\r
        inline void TriContVt(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_tricontv_xyc(gr, &nums, &x, &y, &z, sch, opt);      }\r
+       /// Draw contour tubes for triangle mesh for points in arrays {x,y,z} with specified color c\r
+       /** Option "value" set the number of contour levels (default is 7). */\r
        inline void TriContVt(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", const char *opt="")\r
        {       mgl_tricontv_xyzc(gr, &nums, &x, &y, &z, &a, sch, opt); }\r
+       /// Draw contour tubes for triangle mesh for points in arrays {x,y,z} with specified color c\r
+       /** If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */\r
        inline void TriContVt(const mglDataA &v, const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", const char *opt="")\r
        {       mgl_tricontv_xyzcv(gr, &v, &nums, &x, &y, &z, &a, sch, opt);    }\r
 \r
@@ -1174,58 +1950,73 @@ public:
        inline void Dots(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const mglDataA &a, const char *sch="", const char *opt="")\r
        {       mgl_dots_ca(gr, &x, &y, &z, &c, &a, sch, opt);  }\r
        /// Draw surface reconstructed for points in arrays {x,y,z}.\r
+       /** Style ‘#’ produce wired plot. */\r
        inline void Crust(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="")\r
        {       mgl_crust(gr, &x, &y, &z, sch, opt);    }\r
 \r
        /// Fit data along x-direction for each data row. Return array with values for found formula.\r
        inline mglData Fit(const mglDataA &y, const char *eq, const char *vars, const char *opt="")\r
        {       return mglData(true,mgl_fit_1(gr, &y, eq,vars,0, opt)); }\r
+       /// Fit data along x-direction for each data row starting from \a ini values. Return array with values for found formula.\r
        inline mglData Fit(const mglDataA &y, const char *eq, const char *vars, mglData &ini, const char *opt="")\r
        {       return mglData(true,mgl_fit_1(gr, &y, eq, vars, &ini, opt));    }\r
        /// Fit data along x-, y-directions for each data slice. Return array with values for found formula.\r
        inline mglData Fit2(const mglDataA &z, const char *eq, const char *vars, const char *opt="")\r
        {       return mglData(true,mgl_fit_2(gr, &z, eq, vars,0, opt));        }\r
+       /// Fit data along x-, y-direction for each data slice starting from \a ini values. Return array with values for found formula.\r
        inline mglData Fit2(const mglDataA &z, const char *eq, const char *vars, mglData &ini, const char *opt="")\r
        {       return mglData(true,mgl_fit_2(gr, &z, eq, vars, &ini, opt));    }\r
        /// Fit data along along all directions. Return array with values for found formula.\r
        inline mglData Fit3(const mglDataA &a, const char *eq, const char *vars, const char *opt="")\r
        {       return mglData(true,mgl_fit_3(gr, &a, eq, vars,0, opt));        }\r
+       /// Fit data along all directions starting from \a ini values. Return array with values for found formula.\r
        inline mglData Fit3(const mglDataA &a, const char *eq, const char *vars, mglData &ini, const char *opt="")\r
        {       return mglData(true,mgl_fit_3(gr, &a, eq, vars, &ini, opt));    }\r
+\r
        /// Fit data along x-direction for each data row. Return array with values for found formula.\r
        inline mglData Fit(const mglDataA &x, const mglDataA &y, const char *eq, const char *vars, const char *opt="")\r
        {       return mglData(true,mgl_fit_xy(gr, &x, &y, eq, vars,0, opt));   }\r
+       /// Fit data along x-direction for each data row starting from \a ini values. Return array with values for found formula.\r
        inline mglData Fit(const mglDataA &x, const mglDataA &y, const char *eq, const char *vars, mglData &ini, const char *opt="")\r
        {       return mglData(true,mgl_fit_xy(gr, &x, &y, eq, vars, &ini, opt));       }\r
        /// Fit data along x-, y-directions for each data slice. Return array with values for found formula.\r
        inline mglData Fit(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *eq, const char *vars, const char *opt="")\r
        {       return mglData(true,mgl_fit_xyz(gr, &x, &y, &z, eq, vars,0, opt));      }\r
+       /// Fit data along x-, y-directions for each data slice starting from \a ini values. Return array with values for found formula.\r
        inline mglData Fit(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *eq, const char *vars, mglData &ini, const char *opt="")\r
        {       return mglData(true,mgl_fit_xyz(gr, &x, &y, &z, eq, vars, &ini, opt));  }\r
        /// Fit data along along all directions. Return array with values for found formula.\r
        inline mglData Fit(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *eq, const char *vars, const char *opt="")\r
        {       return mglData(true,mgl_fit_xyza(gr, &x, &y, &z, &a, eq, vars,0, opt)); }\r
+       /// Fit data along along all directions starting from \a ini values. Return array with values for found formula.\r
        inline mglData Fit(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *eq, const char *vars, mglData &ini, const char *opt="")\r
        {       return mglData(true,mgl_fit_xyza(gr, &x, &y, &z, &a, eq,vars, &ini, opt));      }\r
+\r
        /// Fit data with dispersion s along x-direction for each data row. Return array with values for found formula.\r
        inline mglData FitS(const mglDataA &y, const mglDataA &s, const char *eq, const char *vars, const char *opt="")\r
        {       return mglData(true,mgl_fit_ys(gr, &y, &s, eq, vars,0, opt));   }\r
+       /// Fit data with dispersion s along x-direction for each data row starting from \a ini values. Return array with values for found formula.\r
        inline mglData FitS(const mglDataA &y, const mglDataA &s, const char *eq, const char *vars, mglData &ini, const char *opt="")\r
        {       return mglData(true,mgl_fit_ys(gr, &y, &s, eq, vars, &ini, opt));       }\r
+       /// Fit data with dispersion s along x-direction for each data row. Return array with values for found formula.\r
        inline mglData FitS(const mglDataA &x, const mglDataA &y, const mglDataA &s, const char *eq, const char *vars, const char *opt="")\r
        {       return mglData(true,mgl_fit_xys(gr, &x, &y, &s, eq, vars,0, opt));      }\r
+       /// Fit data with dispersion s along x-direction for each data row starting from \a ini values. Return array with values for found formula.\r
        inline mglData FitS(const mglDataA &x, const mglDataA &y, const mglDataA &s, const char *eq, const char *vars, mglData &ini, const char *opt="")\r
        {       return mglData(true,mgl_fit_xys(gr, &x, &y, &s, eq, vars, &ini, opt));  }\r
        /// Fit data with dispersion s along x-, y-directions for each data slice. Return array with values for found formula.\r
        inline mglData FitS(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &s, const char *eq, const char *vars, const char *opt="")\r
        {       return mglData(true,mgl_fit_xyzs(gr, &x, &y, &z, &s, eq, vars,0, opt)); }\r
+       /// Fit data with dispersion s along x-, y-directions for each data slice starting from \a ini values. Return array with values for found formula.\r
        inline mglData FitS(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &s, const char *eq, const char *vars, mglData &ini, const char *opt="")\r
        {       return mglData(true,mgl_fit_xyzs(gr, &x, &y, &z, &s, eq, vars, &ini, opt));     }\r
        /// Fit data with dispersion s along all directions. Return array with values for found formula.\r
        inline mglData FitS(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &s, const char *eq, const char *vars, const char *opt="")\r
        {       return mglData(true,mgl_fit_xyzas(gr, &x, &y, &z, &a, &s, eq, vars,0, opt));    }\r
+       /// Fit data with dispersion s along all directions starting from \a ini values. Return array with values for found formula.\r
        inline mglData FitS(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &s, const char *eq, const char *vars, mglData &ini, const char *opt="")\r
        {       return mglData(true,mgl_fit_xyzas(gr, &x, &y, &z, &a, &s, eq, vars, &ini, opt));        }\r
+\r
        /// Print fitted last formula (with coefficients)\r
        inline void PutsFit(mglPoint p, const char *prefix=0, const char *font="", double size=-1)\r
        {       mgl_puts_fit(gr, p.x, p.y, p.z, prefix, font, size);    }\r
@@ -1235,18 +2026,25 @@ public:
        /// Get chi for last fitted formula\r
        static inline mreal GetFitChi()\r
        {       return mgl_get_fit_chi();       }\r
+       /// Get covariance matrix for last fitted formula\r
+       static inline mglData GetFitCovar()\r
+       {       return mglData(mgl_get_fit_covar());    }\r
 \r
-       /// Solve PDE with x,y,z in range [Min, Max]\r
+       /// Solve PDE with x,y,z in range axis range\r
        inline mglData PDE(const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, double dz=0.1, double k0=100, const char *opt="")\r
        {       return mglData(true,mgl_pde_solve(gr,ham,&ini_re,&ini_im,dz,k0, opt));  }\r
-       /// Fill data by formula with x,y,z in range [Min, Max]\r
+       /// Solve PDE with x,y,z in range axis range\r
+       inline mglDataC PDEc(const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, double dz=0.1, double k0=100, const char *opt="")\r
+       {       return mglDataC(true,mgl_pde_solve_c(gr,ham,&ini_re,&ini_im,dz,k0, opt));       }\r
+\r
+       /// Fill data by formula with x,y,z in range axis range\r
        inline void Fill(mglData &u, const char *eq, const char *opt="")\r
        {       mgl_data_fill_eq(gr, &u, eq, 0, 0, opt);        }\r
        inline void Fill(mglData &u, const char *eq, const mglDataA &v, const char *opt="")\r
        {       mgl_data_fill_eq(gr, &u, eq, &v, 0, opt);       }\r
        inline void Fill(mglData &u, const char *eq, const mglDataA &v, const mglDataA &w, const char *opt="")\r
        {       mgl_data_fill_eq(gr, &u, eq, &v, &w, opt);      }\r
-       /// Fill data by formula with x,y,z in range [Min, Max]\r
+       /// Fill data by formula with x,y,z in range axis range\r
        inline void Fill(mglDataC &u, const char *eq, const char *opt="")\r
        {       mgl_datac_fill_eq(gr, &u, eq, 0, 0, opt);       }\r
        inline void Fill(mglDataC &u, const char *eq, const mglDataA &v, const char *opt="")\r
@@ -1254,23 +2052,40 @@ public:
        inline void Fill(mglDataC &u, const char *eq, const mglDataA &v, const mglDataA &w, const char *opt="")\r
        {       mgl_datac_fill_eq(gr, &u, eq, &v, &w, opt);     }\r
 \r
-       /// Fill dat by interpolated values of vdat parametrically depended on xdat,ydat,zdat for x,y,z in axis range\r
+       /// Fill dat by interpolated values of vdat parametrically depended on xdat for x in axis range\r
        inline void Refill(mglData &dat, const mglDataA &xdat, const mglDataA &vdat, long sl=-1, const char *opt="")\r
        {       mgl_data_refill_gr(gr,&dat,&xdat,0,0,&vdat,sl,opt);     }\r
+       /// Fill dat by interpolated values of vdat parametrically depended on xdat,ydat for x,y in axis range\r
        inline void Refill(mglData &dat, const mglDataA &xdat, const mglDataA &ydat, const mglDataA &vdat, long sl=-1, const char *opt="")\r
        {       mgl_data_refill_gr(gr,&dat,&xdat,&ydat,0,&vdat,sl,opt); }\r
+       /// Fill dat by interpolated values of vdat parametrically depended on xdat,ydat,zdat for x,y,z in axis range\r
        inline void Refill(mglData &dat, const mglDataA &xdat, const mglDataA &ydat, const mglDataA &zdat, const mglDataA &vdat, const char *opt="")\r
        {       mgl_data_refill_gr(gr,&dat,&xdat,&ydat,&zdat,&vdat,-1,opt);     }\r
 \r
-       /// Set the data by triangulated surface values assuming x,y,z in range [Min, Max]\r
+       /// Fill dat by interpolated values of vdat parametrically depended on xdat for x in axis range\r
+       inline void Refill(mglDataC &dat, const mglDataA &xdat, const mglDataA &vdat, long sl=-1, const char *opt="")\r
+       {       mgl_datac_refill_gr(gr,&dat,&xdat,0,0,&vdat,sl,opt);    }\r
+       /// Fill dat by interpolated values of vdat parametrically depended on xdat,ydat for x,y in axis range\r
+       inline void Refill(mglDataC &dat, const mglDataA &xdat, const mglDataA &ydat, const mglDataA &vdat, long sl=-1, const char *opt="")\r
+       {       mgl_datac_refill_gr(gr,&dat,&xdat,&ydat,0,&vdat,sl,opt);        }\r
+       /// Fill dat by interpolated values of vdat parametrically depended on xdat,ydat,zdat for x,y,z in axis range\r
+       inline void Refill(mglDataC &dat, const mglDataA &xdat, const mglDataA &ydat, const mglDataA &zdat, const mglDataA &vdat, const char *opt="")\r
+       {       mgl_datac_refill_gr(gr,&dat,&xdat,&ydat,&zdat,&vdat,-1,opt);    }\r
+\r
+       /// Set the data by triangulated surface values assuming x,y,z in range axis range\r
        inline void DataGrid(mglData &d, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *opt="")\r
        {       mgl_data_grid(gr,&d,&x,&y,&z,opt);      }\r
 \r
        /// Make histogram (distribution) of data. This function do not plot data.\r
+       /** Option "value" sets the size of output array (default is mglFitPnts=100). */\r
        inline mglData Hist(const mglDataA &x, const mglDataA &a, const char *opt="")\r
        {       return mglData(true, mgl_hist_x(gr, &x, &a, opt));      }\r
+       /// Make histogram (distribution) of data. This function do not plot data.\r
+       /** Option "value" sets the size of output array (default is mglFitPnts=100). */\r
        inline mglData Hist(const mglDataA &x, const mglDataA &y, const mglDataA &a, const char *opt="")\r
        {       return mglData(true, mgl_hist_xy(gr, &x, &y, &a, opt)); }\r
+       /// Make histogram (distribution) of data. This function do not plot data.\r
+       /** Option "value" sets the size of output array (default is mglFitPnts=100). */\r
        inline mglData Hist(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *opt="")\r
        {       return mglData(true, mgl_hist_xyz(gr, &x, &y, &z, &a, opt));    }\r
 \r
@@ -1333,6 +2148,11 @@ public:
        /// Load new commands from external dynamic Library (must have "const mglCommand *mgl_cmd_extra" variable)\r
        inline void LoadDLL(const char *fname)\r
        {       mgl_parser_load(pr, fname);     }\r
+       /// Apply one step for equation d vars[i]/dt = eqs[i] using Runge-Kutta method\r
+       inline void RK_Step(const char *eqs, const char *vars, mreal dt=1)\r
+       {       mgl_rk_step(pr, eqs, vars, dt); }\r
+       inline void RK_Step(const wchar_t *eqs, const wchar_t *vars, mreal dt=1)\r
+       {       mgl_rk_step_w(pr, eqs, vars, dt);       }\r
 \r
        /// Set value for parameter $N\r
        inline void AddParam(int id, const char *str)\r
@@ -1356,11 +2176,17 @@ public:
        inline mglData Calc(const wchar_t *formula)\r
        {       return mglData(true,mgl_parser_calcw(pr,formula));      }\r
 \r
+       /// Return result of formula evaluation as complex data\r
+       inline mglDataC CalcComplex(const char *formula)\r
+       {       return mglDataC(true,mgl_parser_calc_complex(pr,formula));      }\r
+       inline mglDataC CalcComplex(const wchar_t *formula)\r
+       {       return mglDataC(true,mgl_parser_calc_complexw(pr,formula));     }\r
+\r
        /// Find variable with given name or add a new one\r
        /// NOTE !!! You must not delete obtained data arrays !!!\r
-       inline mglData *AddVar(const char *name)\r
+       inline mglDataA *AddVar(const char *name)\r
        {       return mgl_parser_add_var(pr, name);    }\r
-       inline mglData *AddVar(const wchar_t *name)\r
+       inline mglDataA *AddVar(const wchar_t *name)\r
        {       return mgl_parser_add_varw(pr, name);   }\r
        /// Find variable with given name or return NULL if no one\r
        /// NOTE !!! You must not delete obtained data arrays !!!\r
index 85d594a3c9eed8c0df1684b4e197e80b3e4e92f8..5de4b9c57043dd874ee6c3e178228426f02866a6 100644 (file)
@@ -132,9 +132,13 @@ procedure mgl_qt_run(); cdecl; external libmglqt;
 {== ../../include/mgl2/abstract.h ==}
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
+/// Set seed for random numbers
+procedure  mgl_srnd(seed: integer); cdecl; external libmgl;
+/// Get random number
+function  mgl_rnd(): double; cdecl; external libmgl;
 /// Set name for data variable (can be used in mgl_formula_calc() or in MGL scripts)
-procedure  mgl_data_set_name( !!! mglDataA *dat;const name: PChar); cdecl; external libmgl;
-procedure  mgl_data_set_name_w( !!! mglDataA *dat;const name: PWideChar); cdecl; external libmgl;
+procedure  mgl_data_set_name(dat: HMDT;const name: PChar); cdecl; external libmgl;
+procedure  mgl_data_set_name_w(dat: HMDT;const name: PWideChar); cdecl; external libmgl;
 /// Set callback function which is called at deleting variable
 /// Save whole data array (for ns=-1) or only ns-th slice to text file
 procedure  mgl_data_save(const dat: HMDT;const fname: PChar;ns: integer); cdecl; external libmgl;
@@ -184,7 +188,7 @@ function  mgl_data_momentum_val(const d: HMDT;dir: char;m: Pmreal;w: Pmreal;s: P
 //-----------------------------------------------------------------------------
 {== ../../include/mgl2/base_cf.h ==}
 //-----------------------------------------------------------------------------
-/// Check if MathGL version is valid
+/// Check if MathGL version is valid (return 0) or not (return 1)
 function  mgl_check_version(const ver: PChar): integer; cdecl; external libmgl;
 /// Suppress printing warnings to stderr
 procedure  mgl_suppress_warn(on: integer); cdecl; external libmgl;
@@ -192,7 +196,7 @@ procedure  mgl_suppress_warn(on: integer); cdecl; external libmgl;
 function  mgl_get_warn(gr: HMGL): integer; cdecl; external libmgl;
 /// Set warning code ant fill message
 procedure  mgl_set_warn(gr: HMGL;code: integer;const text: PChar); cdecl; external libmgl;
-/// Set buffer for warning messages
+/// Get text of warning message(s)
 function mgl_get_mess(gr: HMGL): PChar; cdecl; external libmgl;
 /// Set name of plot for saving filename
 procedure  mgl_set_plotid(gr: HMGL;const id: PChar); cdecl; external libmgl;
@@ -277,7 +281,7 @@ procedure  mgl_set_func(gr: HMGL;const EqX: PChar;const EqY: PChar;const EqZ: PC
 /// Set one of predefined transformation rule
 procedure  mgl_set_coor(gr: HMGL;how: integer); cdecl; external libmgl;
 /// Set to draw Ternary axis (triangle like axis, grid and so on)
-procedure  mgl_set_ternary(gr: HMGL;enable: integer); cdecl; external libmgl;
+procedure  mgl_set_ternary(gr: HMGL;kind: integer); cdecl; external libmgl;
 /// Set to use or not tick labels rotation
 procedure  mgl_set_tick_rotate(gr: HMGL;enable: integer); cdecl; external libmgl;
 /// Set to use or not tick labels skipping
@@ -305,10 +309,6 @@ procedure  mgl_restore_font(gr: HMGL); cdecl; external libmgl;
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
-/// Set seed for random numbers
-procedure  mgl_srnd(seed: integer); cdecl; external libmgl;
-/// Get random number
-function  mgl_rnd(): double; cdecl; external libmgl;
 /// Get integer power of x
 function  mgl_ipow(x: double;n: integer): double; cdecl; external libmgl;
 /// Get number of seconds since 1970 for given string
@@ -555,10 +555,6 @@ function  mgl_expr_diff_v(ex: HMEX;dir: char;vars: Pmreal): double; cdecl; exter
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
-/// Set seed for random numbers
-procedure  mgl_srnd(seed: integer); cdecl; external libmgl;
-/// Get random number
-function  mgl_rnd(): double; cdecl; external libmgl;
 /// Get integer power of x
 function  mgl_ipowc(x: dual;n: integer): dual; cdecl; external libmgl;
 /// Get exp(i*a)
@@ -819,6 +815,7 @@ function  mgl_hist_x(gr: HMGL;const x: HMDT;const a: HMDT;const opt: PChar): HMD
 function  mgl_hist_xy(gr: HMGL;const x: HMDT;const y: HMDT;const a: HMDT;const opt: PChar): HMDT; cdecl; external libmgl;
 function  mgl_hist_xyz(gr: HMGL;const x: HMDT;const y: HMDT;const z: HMDT;const a: HMDT;const opt: PChar): HMDT; cdecl; external libmgl;
 procedure  mgl_puts_fit(gr: HMGL;x: double;y: double;z: double;const prefix: PChar;const font: PChar;size: double); cdecl; external libmgl;
+function  mgl_get_fit_chi(): mreal; cdecl; external libmgl;
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
@@ -1102,8 +1099,8 @@ procedure  mgl_ellipse(gr: HMGL;x1: double;y1: double;z1: double;x2: double;y2:
 procedure  mgl_rhomb(gr: HMGL;x1: double;y1: double;z1: double;x2: double;y2: double;z2: double;r: double;const stl: PChar); cdecl; external libmgl;
 /// Draws the polygon based on points p1,p2 with color stl
 procedure  mgl_polygon(gr: HMGL;x1: double;y1: double;z1: double;x2: double;y2: double;z2: double;n: integer;const stl: PChar); cdecl; external libmgl;
-procedure  mgl_arc_ext(gr: HMGL;x0: double;y0: double;z0: double;xr: double;yr: double;zr: double;x1: double;y1: double;z1: double;a: double; !!! const char* stl); cdecl; external libmgl;
-procedure  mgl_arc(gr: HMGL;x0: double;y0: double;x1: double;y1: double;a: double; !!! const char* stl); cdecl; external libmgl;
+procedure  mgl_arc_ext(gr: HMGL;x0: double;y0: double;z0: double;xr: double;yr: double;zr: double;x1: double;y1: double;z1: double;a: double;const stl: PChar); cdecl; external libmgl;
+procedure  mgl_arc(gr: HMGL;x0: double;y0: double;x1: double;y1: double;a: double;const stl: PChar); cdecl; external libmgl;
 /// Draw cones from points {x,y,z} to axis plane
 procedure  mgl_cones_xyz(graph: HMGL;const x: HMDT;const y: HMDT;const z: HMDT;const pen: PChar;const opt: PChar); cdecl; external libmgl;
 /// Draw cones from points {x,z} to axis plane
@@ -1141,6 +1138,9 @@ procedure  mgl_labelw_y(graph: HMGL;const y: HMDT;const text: PWideChar;const fn
 /// Draw table for values val along given direction with row labels text at position {x,y}
 procedure  mgl_table(gr: HMGL;x: double;y: double;const val: HMDT;const text: PChar;const fnt: PChar;const opt: PChar); cdecl; external libmgl;
 procedure  mgl_tablew(gr: HMGL;x: double;y: double;const val: HMDT;const text: PWideChar;const fnt: PChar;const opt: PChar); cdecl; external libmgl;
+/// Draws bitmap (logo) which is stretched along whole axis range
+procedure  mgl_logo(gr: HMGL;w: integer;h: integer;const rgba: PByte;smooth: integer;const opt: PChar); cdecl; external libmgl;
+procedure  mgl_logo_file(gr: HMGL;const fname: PChar;smooth: integer;const opt: PChar); cdecl; external libmgl;
 //-----------------------------------------------------------------------------
 {== ../../include/mgl2/other.h ==}
 //-----------------------------------------------------------------------------
@@ -1374,6 +1374,8 @@ procedure  mgl_set_frame(gr: HMGL;i: integer); cdecl; external libmgl;
 procedure  mgl_show_frame(gr: HMGL;i: integer); cdecl; external libmgl;
 /// Delete primitives for i-th frame (work if MGL_VECT_FRAME is set on)
 procedure  mgl_del_frame(gr: HMGL;i: integer); cdecl; external libmgl;
+/// Clear list of primitives for current drawing
+procedure  mgl_clear_frame(gr: HMGL); cdecl; external libmgl;
 /// Set the transparency type (0 - usual, 1 - glass, 2 - lamp)
 procedure  mgl_set_transp_type(gr: HMGL;kind: integer); cdecl; external libmgl;
 /// Set the transparency on/off.
@@ -1396,6 +1398,8 @@ procedure  mgl_mat_pop(gr: HMGL); cdecl; external libmgl;
 procedure  mgl_mat_push(gr: HMGL); cdecl; external libmgl;
 /// Clear up the frame
 procedure  mgl_clf(gr: HMGL); cdecl; external libmgl;
+/// Clear up the frame but keep fog settings
+procedure  mgl_clf_nfog(gr: HMGL); cdecl; external libmgl;
 /// Clear up the frame and fill background by specified color
 procedure  mgl_clf_rgb(gr: HMGL;r: double;g: double;b: double); cdecl; external libmgl;
 /// Clear up the frame and fill background by specified color
@@ -1441,6 +1445,7 @@ procedure  mgl_view(gr: HMGL;TetX: double;TetZ: double;TetY: double); cdecl; ext
 procedure  mgl_zoom(gr: HMGL;x1: double;y1: double;x2: double;y2: double); cdecl; external libmgl;
 //-----------------------------------------------------------------------------
 /// Callback function for mouse click
+/// Set callback functions for drawing and data reloading
 /// Set delay for animation in seconds
 procedure  mgl_wnd_set_delay(gr: HMGL;dt: double); cdecl; external libmgl;
 /// Get delay for animation in seconds
@@ -1496,6 +1501,8 @@ procedure  mgl_parser_del_var(p: HMPR;const name: PChar); cdecl; external libmgl
 procedure  mgl_parser_del_varw(p: HMPR;const name: PWideChar); cdecl; external libmgl;
 /// Delete all data variables
 procedure  mgl_parser_del_all(p: HMPR); cdecl; external libmgl;
+/// Load new commands from external dynamic Library (must have "const mglCommand *mgl_cmd_extra" variable)
+procedure  mgl_parser_load(pr: HMPR;const dll_name: PChar); cdecl; external libmgl;
 /// Parse and draw single line of the MGL script
 function  mgl_parse_line(gr: HMGL;p: HMPR;const str: PChar;pos: integer): integer; cdecl; external libmgl;
 function  mgl_parse_linew(gr: HMGL;p: HMPR;const str: PWideChar;pos: integer): integer; cdecl; external libmgl;
@@ -1509,6 +1516,8 @@ procedure  mgl_parser_restore_once(p: HMPR); cdecl; external libmgl;
 procedure  mgl_parser_allow_setsize(p: HMPR;a: integer); cdecl; external libmgl;
 /// Allow reading/saving files
 procedure  mgl_parser_allow_file_io(p: HMPR;a: integer); cdecl; external libmgl;
+/// Allow loading commands from external libraries
+procedure  mgl_parser_allow_dll_call(p: HMPR;a: integer); cdecl; external libmgl;
 /// Set flag to stop script parsing
 procedure  mgl_parser_stop(p: HMPR); cdecl; external libmgl;
 /// Return type of command: 0 - not found, 1 - data plot, 2 - other plot,
index a8590435e091a32cd555f86dbb3b7ce82b627f47..beae2f6f5f66443ad9cd57a02afff2b9ac6dc487 100644 (file)
@@ -59,7 +59,6 @@ protected:
 \r
        unsigned char **GetRGBLines(long &w, long &h, unsigned char *&f, bool solid=true);\r
        void LightScale(const mglMatrix *M);\r
-       void set_pen(unsigned style,mreal width);\r
 \r
        void gl_clf(mglColor Back=WC);\r
 };\r
index 277b1ce6c12c549aa89298abb0ecbdfb4a3cb8a7..4d1675cc8acceee234a45a56e2f3002ddcdd1541 100644 (file)
@@ -26,49 +26,74 @@ extern "C" {
 #endif\r
 \r
 /// Draw triangle mesh for points in arrays {x,y,z} with specified color c.\r
+/** Style ‘#’ produce wire plot. If id.ny=c.nx then c set the triangle colors, else vertex colors. */\r
 void MGL_EXPORT mgl_triplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_triplot_xyzc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int);\r
 /// Draw triangle mesh for points in arrays {x,y,z} with color proportional to z.\r
+/** Style ‘#’ produce wire plot. */\r
 void MGL_EXPORT mgl_triplot_xyz(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_triplot_xyz_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 /// Draw triangle mesh for points in arrays {x,y}\r
+/** Style ‘#’ produce wire plot. */\r
 void MGL_EXPORT mgl_triplot_xy(HMGL gr, HCDT nums, HCDT x, HCDT y, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_triplot_xy_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, const char *sch, const char *opt,int,int);\r
 \r
 /// Draw quad mesh for points in arrays {x,y,z} with specified color c.\r
+/** Style ‘#’ produce wire plot. If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */\r
 void MGL_EXPORT mgl_quadplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_quadplot_xyzc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int);\r
 /// Draw quad mesh for points in arrays {x,y,z} with color proportional to z.\r
+/** Style ‘#’ produce wire plot. */\r
 void MGL_EXPORT mgl_quadplot_xyz(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_quadplot_xyz_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 /// Draw quad mesh for points in arrays {x,y}.\r
+/** Style ‘#’ produce wire plot. */\r
 void MGL_EXPORT mgl_quadplot_xy(HMGL gr, HCDT nums, HCDT x, HCDT y, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_quadplot_xy_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, const char *sch, const char *opt,int,int);\r
 \r
 /// Draw manual contour lines for triangle mesh for points in arrays {x,y,z} with specified color c.\r
+/** Style ‘_’ to draw contours at bottom of axis box.\r
+ * Style ‘t’/‘T’ draw contour labels below/above contours.\r
+ * If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */\r
 void MGL_EXPORT mgl_tricont_xyzcv(HMGL gr, HCDT v, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_tricont_xyzcv_(uintptr_t *gr, uintptr_t *v, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int);\r
 /// Draw manual contour lines for triangle mesh for points in arrays {x,y,z}.\r
+/** Style ‘_’ to draw contours at bottom of axis box.\r
+ * Style ‘t’/‘T’ draw contour labels below/above contours.\r
+ * If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */\r
 void MGL_EXPORT mgl_tricont_xycv(HMGL gr, HCDT v, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_tricont_xycv_(uintptr_t *gr, uintptr_t *v, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 /// Draw contour lines for triangle mesh for points in arrays {x,y,z} with specified color c.\r
+/** Style ‘_’ to draw contours at bottom of axis box.\r
+ * Style ‘t’/‘T’ draw contour labels below/above contours.\r
+ * If id.ny=c.nx then c set the quadrangle colors, else vertex colors.\r
+ * Option "value" set the number of contour levels (default is 7). */\r
 void MGL_EXPORT mgl_tricont_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_tricont_xyzc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int, int);\r
 /// Draw contour lines for triangle mesh for points in arrays {x,y,z}.\r
+/** Style ‘_’ to draw contours at bottom of axis box.\r
+ * Style ‘t’/‘T’ draw contour labels below/above contours.\r
+ * If id.ny=c.nx then c set the quadrangle colors, else vertex colors.\r
+ * Option "value" set the number of contour levels (default is 7). */\r
 void MGL_EXPORT mgl_tricont_xyc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_tricont_xyc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int, int);\r
 \r
-\r
 /// Draw manual contour tubes for triangle mesh for points in arrays {x,y,z} with specified color c.\r
+/** If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */\r
 void MGL_EXPORT mgl_tricontv_xyzcv(HMGL gr, HCDT v, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_tricontv_xyzcv_(uintptr_t *gr, uintptr_t *v, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int);\r
 /// Draw manual contour tubes for triangle mesh for points in arrays {x,y,z}.\r
+/** If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */\r
 void MGL_EXPORT mgl_tricontv_xycv(HMGL gr, HCDT v, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_tricontv_xycv_(uintptr_t *gr, uintptr_t *v, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 /// Draw contour tubes for triangle mesh for points in arrays {x,y,z} with specified color c.\r
+/** If id.ny=c.nx then c set the quadrangle colors, else vertex colors.\r
+ * Option "value" set the number of contour levels (default is 7). */\r
 void MGL_EXPORT mgl_tricontv_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_tricontv_xyzc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int, int);\r
 /// Draw contour tubes for triangle mesh for points in arrays {x,y,z}.\r
+/** If id.ny=c.nx then c set the quadrangle colors, else vertex colors.\r
+ * Option "value" set the number of contour levels (default is 7). */\r
 void MGL_EXPORT mgl_tricontv_xyc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_tricontv_xyc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int, int);\r
 \r
@@ -83,46 +108,62 @@ void MGL_EXPORT mgl_dots_ca(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, HCDT a, con
 void MGL_EXPORT mgl_dots_ca_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, uintptr_t *a, const char *sch, const char *opt,int,int);\r
 \r
 /// Draw surface reconstructed for points in arrays {x,y,z}.\r
+/** Style ‘#’ produce wired plot. */\r
 void MGL_EXPORT mgl_crust(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_crust_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 \r
 /// Draw density plot for data at x = sVal\r
+/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
 void MGL_EXPORT mgl_dens_x(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_dens_x_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int);\r
 /// Draw density plot for data at y = sVal\r
+/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
 void MGL_EXPORT mgl_dens_y(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_dens_y_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int);\r
 /// Draw density plot for data at z = sVal\r
+/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
 void MGL_EXPORT mgl_dens_z(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_dens_z_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int);\r
 \r
 /// Draw contour lines for data at x = sVal\r
+/** Style ‘t’/‘T’ draw contour labels below/above contours.\r
+ * Option "value" set the number of contour levels (default is 7). */\r
 void MGL_EXPORT mgl_cont_x(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_cont_x_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int);\r
 /// Draw contour lines for data at y = sVal\r
+/** Style ‘t’/‘T’ draw contour labels below/above contours.\r
+ * Option "value" set the number of contour levels (default is 7). */\r
 void MGL_EXPORT mgl_cont_y(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_cont_y_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int);\r
 /// Draw contour lines for data at z = sVal\r
+/** Style ‘t’/‘T’ draw contour labels below/above contours.\r
+ * Option "value" set the number of contour levels (default is 7). */\r
 void MGL_EXPORT mgl_cont_z(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_cont_z_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int);\r
 \r
 /// Draw manual contour lines for data at x = sVal\r
+/** Style ‘t’/‘T’ draw contour labels below/above contours. */\r
 void MGL_EXPORT mgl_cont_x_val(HMGL graph, HCDT v, HCDT a, const char *stl, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_cont_x_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int);\r
 /// Draw manual contour lines for data at y = sVal\r
+/** Style ‘t’/‘T’ draw contour labels below/above contours. */\r
 void MGL_EXPORT mgl_cont_y_val(HMGL graph, HCDT v, HCDT a, const char *stl, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_cont_y_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int);\r
 /// Draw manual contour lines for data at z = sVal\r
+/** Style ‘t’/‘T’ draw contour labels below/above contours. */\r
 void MGL_EXPORT mgl_cont_z_val(HMGL graph, HCDT v, HCDT a, const char *stl, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_cont_z_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int);\r
 \r
 /// Draw solid contours for data at x = sVal\r
+/** Option "value" set the number of contour levels (default is 7). */\r
 void MGL_EXPORT mgl_contf_x(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_contf_x_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int);\r
 /// Draw solid contours for data at y = sVal\r
+/** Option "value" set the number of contour levels (default is 7). */\r
 void MGL_EXPORT mgl_contf_y(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_contf_y_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int);\r
 /// Draw solid contours for data at z = sVal\r
+/** Option "value" set the number of contour levels (default is 7). */\r
 void MGL_EXPORT mgl_contf_z(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_contf_z_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int);\r
 \r
index 3ff6fa43e735c09b1bd0f1702dc0beb4caf1a6a6..f952074c2f090e7a3d84dbdaf6df74bc9bb8b001 100644 (file)
@@ -35,7 +35,8 @@ struct mglArg
        std::wstring w; ///< String with parameters\r
        std::string s;  ///< String with parameters\r
        mreal v;                ///< Numerical value (used if type==2)\r
-       mglArg():type(-1),d(0),v(0)     {}\r
+       dual c;                 ///< Numerical complex value (used if type==2)\r
+       mglArg():type(-1),d(0),v(0),c(0.)       {}\r
 };\r
 //-----------------------------------------------------------------------------\r
 /// Structure for MGL command\r
@@ -58,8 +59,9 @@ extern mglCommand mgls_base_cmd[];
 struct mglNum\r
 {\r
        mreal d;                ///< Number itself\r
+       dual c;\r
        std::wstring s; ///< Number name\r
-       mglNum(mreal val=0):d(val)      {}\r
+       mglNum(mreal val=0):d(val),c(val)       {}\r
 };\r
 //-----------------------------------------------------------------------------\r
 /// Structure for function name and position.\r
@@ -97,7 +99,7 @@ public:
        bool AllowDllCall;      ///< Allow calls from external dynamic libraries\r
        bool AllowSetSize;      ///< Allow using setsize command\r
        bool AllowFileIO;       ///< Allow reading/saving files\r
-       bool Stop;                      ///< Stop command was. Flag prevent further execution\r
+       volatile bool Stop;     ///< Stop command was. Flag prevent further execution\r
        mglCommand *Cmd;        ///< Table of MGL commands (can be changed by user). It MUST be sorted by 'name'!!!\r
        long InUse;                     ///< Smart pointer (number of users)\r
        const mglBase *curGr;   ///< Current grapher\r
@@ -139,8 +141,8 @@ public:
        mglDataA *FindVar(const char *name) MGL_FUNC_PURE;\r
        mglDataA *FindVar(const wchar_t *name) MGL_FUNC_PURE;\r
        /// Find variable or create it if absent\r
-       mglData *AddVar(const char *name);\r
-       mglData *AddVar(const wchar_t *name);\r
+       mglDataA *AddVar(const char *name);\r
+       mglDataA *AddVar(const wchar_t *name);\r
        /// Find number or return 0 if absent\r
        mglNum *FindNum(const char *name) MGL_FUNC_PURE;\r
        mglNum *FindNum(const wchar_t *name) MGL_FUNC_PURE;\r
@@ -192,6 +194,7 @@ private:
        /// In skip mode\r
        bool inline ifskip()    {       return (if_pos>0 && !(if_stack[if_pos-1]&1));   }\r
        bool inline skip()              {       return (Skip || ifskip() || for_br);    }\r
+       bool CheckForName(const std::wstring &s);       // check if name is valid for new data\r
 };\r
 //-----------------------------------------------------------------------------\r
 #endif\r
index 2494ae2fc3847dd30bcf8d261bdd37947671d054..cd7d708aa266daf10fe1693f809257108e1de550 100644 (file)
@@ -26,13 +26,16 @@ extern "C" {
 #endif\r
 \r
 /// Draw curve for formula with x in x-axis range\r
+/** Option "value" set initial number of points. */\r
 void MGL_EXPORT mgl_fplot(HMGL gr, const char *eqY, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_fplot_(uintptr_t *gr, const char *fy, const char *stl, const char *opt, int ly, int ls, int lo);\r
 /// Draw curve for formulas parametrically depended on t in range [0,1]\r
+/** Option "value" set initial number of points. */\r
 void MGL_EXPORT mgl_fplot_xyz(HMGL gr, const char *eqX, const char *eqY, const char *eqZ, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_fplot_xyz_(uintptr_t *gr, const char *fx, const char *fy, const char *fz, const char *stl, const char *opt, int lx, int ly, int lz, int ls, int lo);\r
 \r
 /// Draw radar chart (plot in curved coordinates)\r
+/** Option "value" set the additional shift of data (i.e. the data a+value is used instead of a).*/\r
 void MGL_EXPORT mgl_radar(HMGL graph, HCDT a, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_radar_(uintptr_t *gr, uintptr_t *a, const char *pen, const char *opt, int l,int lo);\r
 \r
@@ -56,40 +59,53 @@ void MGL_EXPORT mgl_tens_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintp
 void MGL_EXPORT mgl_tens(HMGL graph, HCDT y, HCDT c, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_tens_(uintptr_t *graph, uintptr_t *y, uintptr_t *c, const char *pen, const char *opt,int,int);\r
 \r
-/// Draw tape(s) which rotates as (bi-)normales of curve {x,y,z}\r
+/// Draw tapes which rotates as (bi-)normales of curve {x,y,z}\r
+/** The width of tape is proportional to barwidth and can be changed by option "value".*/\r
 void MGL_EXPORT mgl_tape_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_tape_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int);\r
-/// Draw tape(s) which rotates as (bi-)normales of curve {x,y}\r
+/// Draw tapes which rotates as (bi-)normales of curve {x,y}\r
+/** The width of tape is proportional to barwidth and can be changed by option "value".*/\r
 void MGL_EXPORT mgl_tape_xy(HMGL graph, HCDT x, HCDT y, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_tape_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int);\r
-/// Draw tape(s) which rotates as (bi-)normales of curve {x,y} with x in x-axis range\r
+/// Draw tapes which rotates as (bi-)normales of curve {x,y} with x in x-axis range\r
+/** The width of tape is proportional to barwidth and can be changed by option "value".*/\r
 void MGL_EXPORT mgl_tape(HMGL graph, HCDT y, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_tape_(uintptr_t *graph, uintptr_t *y,      const char *pen, const char *opt,int,int);\r
 \r
 /// Draw box-plot (special 5-value plot used in statistic) for data specified parametrically\r
+/** String \a pen may contain ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right.*/\r
 void MGL_EXPORT mgl_boxplot_xy(HMGL graph, HCDT x, HCDT a, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_boxplot_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int);\r
 /// Draw box-plot (special 5-value plot used in statistic)\r
+/** String \a pen may contain ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right.*/\r
 void MGL_EXPORT mgl_boxplot(HMGL graph, HCDT a, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_boxplot_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int);\r
 \r
 /// Fill area between curve {x,y,z} and axis plane\r
+/** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
 void MGL_EXPORT mgl_area_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_area_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int);\r
 /// Fill area between curve {x,y} and axis plane\r
+/** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
 void MGL_EXPORT mgl_area_xy(HMGL graph, HCDT x, HCDT y, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_area_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int);\r
 /// Fill area between curve {x,y} with x in x-axis range and axis plane\r
+/** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
 void MGL_EXPORT mgl_area(HMGL graph, HCDT y, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_area_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int);\r
 \r
 /// Fill area (draw ribbon) between curves {x1,y1,z1} and {x2,y2,z2}\r
+/** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
 void MGL_EXPORT mgl_region_3d(HMGL graph, HCDT x1, HCDT y1, HCDT z1, HCDT x2, HCDT y2, HCDT z2, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_region_3d_(uintptr_t *graph, uintptr_t *x1, uintptr_t *y1, uintptr_t *z1, uintptr_t *x2, uintptr_t *y2, uintptr_t *z2, const char *pen, const char *opt,int,int);\r
 /// Fill area between curves {x,y1} and {x,y2}\r
+/** Style 'i' will fill area only if y1 < y2.\r
+  * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
 void MGL_EXPORT mgl_region_xy(HMGL graph, HCDT x, HCDT y1, HCDT y2, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_region_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt,int, int);\r
 /// Fill area between curves {x,y1} and {x,y2} with x in x-axis range\r
+/** Style 'i' will fill area only if y1 < y2.\r
+  * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
 void MGL_EXPORT mgl_region(HMGL graph, HCDT y1, HCDT y2, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_region_(uintptr_t *graph, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt,int, int);\r
 \r
@@ -114,40 +130,71 @@ void MGL_EXPORT mgl_step(HMGL graph, HCDT y,      const char *pen, const char *opt);
 void MGL_EXPORT mgl_step_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int);\r
 \r
 /// Draw vertical bars from points {x,y,z} to axis plane\r
+/** String \a pen may contain:\r
+ * ‘a’ for drawing boxes one above another (like summation);\r
+ * ‘f’ for waterfall chart;\r
+ * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right.\r
+ * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
 void MGL_EXPORT mgl_bars_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_bars_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int);\r
 /// Draw vertical bars from points {x,y} to axis plane\r
+/** String \a pen may contain:\r
+ * ‘a’ for drawing boxes one above another (like summation);\r
+ * ‘f’ for waterfall chart;\r
+ * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right.\r
+ * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
 void MGL_EXPORT mgl_bars_xy(HMGL graph, HCDT x, HCDT y, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_bars_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int);\r
 /// Draw vertical bars from points {x,y} with x in x-axis range to axis plane\r
+/** String \a pen may contain:\r
+ * ‘a’ for drawing boxes one above another (like summation);\r
+ * ‘f’ for waterfall chart;\r
+ * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right.\r
+ * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
 void MGL_EXPORT mgl_bars(HMGL graph, HCDT y,   const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_bars_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int);\r
 \r
 /// Draw horizontal bars from points {v,y} to axis plane\r
+/** String \a pen may contain:\r
+ * ‘a’ for drawing boxes one above another (like summation);\r
+ * ‘f’ for waterfall chart;\r
+ * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right.\r
+ * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
 void MGL_EXPORT mgl_barh_yx(HMGL graph, HCDT y, HCDT v, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_barh_yx_(uintptr_t *graph, uintptr_t *y, uintptr_t *v, const char *pen, const char *opt,int,int);\r
 /// Draw horizontal bars from points {v,y} with y in y-axis range to axis plane\r
+/** String \a pen may contain:\r
+ * ‘a’ for drawing boxes one above another (like summation);\r
+ * ‘f’ for waterfall chart;\r
+ * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right.\r
+ * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
 void MGL_EXPORT mgl_barh(HMGL graph, HCDT v,   const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_barh_(uintptr_t *graph, uintptr_t *v, const char *pen, const char *opt,int,int);\r
 \r
 /// Draw Open-High-Low-Close (OHLC) diagram\r
+/**  Different colors for up and down values are used if number of specified colors is equal to 2*number of curves. */\r
 void MGL_EXPORT mgl_ohlc_x(HMGL graph, HCDT x, HCDT open, HCDT high, HCDT low, HCDT close, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_ohlc_x_(uintptr_t *graph, uintptr_t *x, uintptr_t *open, uintptr_t *high, uintptr_t *low, uintptr_t *close, const char *pen, const char *opt,int,int);\r
 /// Draw Open-High-Low-Close (OHLC) diagram with x in x-axis range\r
+/**  Different colors for up and down values are used if number of specified colors is equal to 2*number of curves. */\r
 void MGL_EXPORT mgl_ohlc(HMGL graph, HCDT open, HCDT high, HCDT low, HCDT close, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_ohlc_(uintptr_t *graph, uintptr_t *open, uintptr_t *high, uintptr_t *low, uintptr_t *close, const char *pen, const char *opt,int,int);\r
 \r
 /// Draw chart for data a\r
+/** Space denote transparent color. Style '#' draw black borders. */\r
 void MGL_EXPORT mgl_chart(HMGL graph, HCDT a, const char *col, const char *opt);\r
 void MGL_EXPORT mgl_chart_(uintptr_t *graph, uintptr_t *a, const char *col, const char *opt,int,int);\r
 \r
 /// Draw error boxes {ex,ey} at points {x,y}\r
+/** Style ‘@’ set to draw large semitransparent mark instead of error box.*/\r
 void MGL_EXPORT mgl_error_exy(HMGL graph, HCDT x, HCDT y, HCDT ex, HCDT ey, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_error_exy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *ex, uintptr_t *ey, const char *pen, const char *opt,int,int);\r
 /// Draw error boxes {ey} at points {x,y}\r
+/** Style ‘@’ set to draw large semitransparent mark instead of error box.*/\r
 void MGL_EXPORT mgl_error_xy(HMGL graph, HCDT x, HCDT y, HCDT ey, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_error_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *ey, const char *pen, const char *opt,int,int);\r
 /// Draw error boxes {ey} at points {x,y} with x in x-axis range\r
+/** Style ‘@’ set to draw large semitransparent mark instead of error box.*/\r
 void MGL_EXPORT mgl_error(HMGL graph, HCDT y, HCDT ey, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_error_(uintptr_t *graph, uintptr_t *y, uintptr_t *ey, const char *pen, const char *opt,int,int);\r
 \r
@@ -181,12 +228,18 @@ void MGL_EXPORT mgl_tube(HMGL graph, HCDT y, double r, const char *pen, const ch
 void MGL_EXPORT mgl_tube_(uintptr_t *graph, uintptr_t *y, mreal *r, const char *pen, const char *opt,int,int);\r
 \r
 /// Draw candle plot for data specified parametrically\r
+/** Different colors are used for up and down values if 2 colors are specified.\r
+ *  Style ‘#’ force drawing wire candle even for 2-color scheme. */\r
 void MGL_EXPORT mgl_candle_xyv(HMGL gr, HCDT x, HCDT v1, HCDT v2, HCDT y1, HCDT y2, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_candle_xyv_(uintptr_t *gr, uintptr_t *x, uintptr_t *v1, uintptr_t *v2, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt,int,int);\r
 /// Draw candle plot\r
+/** Different colors are used for up and down values if 2 colors are specified.\r
+ *  Style ‘#’ force drawing wire candle even for 2-color scheme. */\r
 void MGL_EXPORT mgl_candle_yv(HMGL gr, HCDT v1, HCDT v2, HCDT y1, HCDT y2, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_candle_yv_(uintptr_t *gr, uintptr_t *v1, uintptr_t *v2, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt,int,int);\r
 /// Draw candle plot with v1=v[i], v2=v[i+1]\r
+/** Different colors are used for up and down values if 2 colors are specified.\r
+ *  Style ‘#’ force drawing wire candle even for 2-color scheme. */\r
 void MGL_EXPORT mgl_candle(HMGL gr, HCDT v, HCDT y1, HCDT y2, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_candle_(uintptr_t *gr, uintptr_t *y, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt,int,int);\r
 \r
index 582d4a7e82bbb0d9a68a74e6fefd539815431a78..18f7e556c1d21ddbb4bd8443f08614cb0c73a1f1 100644 (file)
@@ -33,6 +33,7 @@ void MGL_EXPORT mgl_ball(HMGL gr, double x,double y,double z);
 void MGL_EXPORT mgl_ball_(uintptr_t *gr, mreal *x, mreal *y, mreal *z);\r
 \r
 /// Draws the line between 2 points by specified pen\r
+/** Large \a n (for example, n=100) should be used for geodesic line in curvilinear coordinates */\r
 void MGL_EXPORT mgl_line(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, const char *pen,int n);\r
 void MGL_EXPORT mgl_line_(uintptr_t *gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, const char *pen,int *n,int);\r
 /// Draws the spline curve between 2 points by specified pen\r
@@ -60,35 +61,71 @@ void MGL_EXPORT mgl_facez_(uintptr_t* gr, mreal *x0, mreal *y0, mreal *z0, mreal
 void MGL_EXPORT mgl_sphere(HMGL gr, double x, double y, double z, double r, const char *stl);\r
 void MGL_EXPORT mgl_sphere_(uintptr_t* gr, mreal *x, mreal *y, mreal *z, mreal *r, const char *stl, int);\r
 /// Draws the drop at point {x,y,z} in direction {dx,dy,dz} with color stl and radius r\r
+/** Parameter \a shift set the degree of drop oblongness: ‘0’ is sphere, ‘1’ is maximally oblongness drop. Parameter \a ap set relative width of the drop (this is analogue of “ellipticity” for the sphere).*/\r
 void MGL_EXPORT mgl_drop(HMGL gr, double x, double y, double z, double dx, double dy, double dz, double r, const char *stl, double shift, double ap);\r
 void MGL_EXPORT mgl_drop_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, mreal *r, const char *stl, mreal *shift, mreal *ap, int);\r
 /// Draws the cone between points p1,p2 with radius r1,r2 and with style stl\r
+/** Parameter \a stl can contain:\r
+ * ‘@’ for drawing edges;\r
+ * ‘#’ for wired cones;\r
+ * ‘t’ for drawing tubes/cylinder instead of cones/prisms;\r
+ * ‘4’, ‘6’, ‘8’ for drawing square, hex- or octo-prism instead of cones.*/\r
 void MGL_EXPORT mgl_cone(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, double r1, double r2, const char *stl);\r
 void MGL_EXPORT mgl_cone_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, mreal *r1, mreal *r2, const char *stl, int);\r
 /// Draws the ellipse between points p1,p2 with color stl and width r\r
+/** Parameter \a stl can contain:\r
+ * ‘#’ for wired figure (boundary only);\r
+ * ‘@’ for filled figure and with boundary (second color or black one is used for boundary).*/\r
 void MGL_EXPORT mgl_ellipse(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, double r, const char *stl);\r
 void MGL_EXPORT mgl_ellipse_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, mreal *r, const char *stl, int);\r
 /// Draws the rhomb between points p1,p2 with color stl and width r\r
+/** Parameter \a stl can contain:\r
+ * ‘#’ for wired figure (boundary only);\r
+ * ‘@’ for filled figure and with boundary (second color or black one is used for boundary).*/\r
 void MGL_EXPORT mgl_rhomb(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, double r, const char *stl);\r
 void MGL_EXPORT mgl_rhomb_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, mreal *r, const char *stl, int);\r
 /// Draws the polygon based on points p1,p2 with color stl\r
+/** Parameter \a stl can contain:\r
+ * ‘#’ for wired figure (boundary only);\r
+ * ‘@’ for filled figure and with boundary (second color or black one is used for boundary).*/\r
 void MGL_EXPORT mgl_polygon(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, int n, const char *stl);\r
 void MGL_EXPORT mgl_polygon_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, int *n, const char *stl, int);\r
        /// Draws the arc around axis pr with center at p0 and starting from p1, by color stl and angle a (in degrees)\r
-void MGL_EXPORT mgl_arc_ext(HMGL gr, double x0, double y0, double z0, double xr, double yr, double zr, double x1, double y1, double z1, double a, const charstl);\r
+void MGL_EXPORT mgl_arc_ext(HMGL gr, double x0, double y0, double z0, double xr, double yr, double zr, double x1, double y1, double z1, double a, const char *stl);\r
 void MGL_EXPORT mgl_arc_ext_(uintptr_t* gr, mreal *x0, mreal *y0, mreal *z0, mreal *xr, mreal *yr, mreal *zr, mreal *x1, mreal *y1, mreal *z1, mreal *a, const char *stl, int);\r
        /// Draws the arc around axis 'z' with center at p0 and starting from p1, by color stl and angle a (in degrees)\r
-void MGL_EXPORT mgl_arc(HMGL gr, double x0, double y0, double x1, double y1, double a, const charstl);\r
+void MGL_EXPORT mgl_arc(HMGL gr, double x0, double y0, double x1, double y1, double a, const char *stl);\r
 void MGL_EXPORT mgl_arc_(uintptr_t* gr, mreal *x0, mreal *y0, mreal *x1, mreal *y1, mreal *a, const char *stl,int l);\r
 \r
 \r
 /// Draw cones from points {x,y,z} to axis plane\r
+/** String \a pen may contain:\r
+ * ‘@’ for drawing edges;\r
+ * ‘#’ for wired cones;\r
+ * ‘t’ for drawing tubes/cylinders instead of cones/prisms;\r
+ * ‘4’, ‘6’, ‘8’ for drawing square, hex- or octo-prism instead of cones;\r
+ * ‘<’, ‘^’ or ‘>’ for aligning cones left, right or centering them at its x-coordinates.\r
+ * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
 void MGL_EXPORT mgl_cones_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_cones_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int);\r
 /// Draw cones from points {x,z} to axis plane\r
+/** String \a pen may contain:\r
+ * ‘@’ for drawing edges;\r
+ * ‘#’ for wired cones;\r
+ * ‘t’ for drawing tubes/cylinders instead of cones/prisms;\r
+ * ‘4’, ‘6’, ‘8’ for drawing square, hex- or octo-prism instead of cones;\r
+ * ‘<’, ‘^’ or ‘>’ for aligning cones left, right or centering them at its x-coordinates.\r
+ * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
 void MGL_EXPORT mgl_cones_xz(HMGL graph, HCDT x, HCDT z, const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_cones_xz_(uintptr_t *graph, uintptr_t *x, uintptr_t *z, const char *pen, const char *opt,int,int);\r
 /// Draw cones from points {x,z} with x in x-axis range to axis plane\r
+/** String \a pen may contain:\r
+ * ‘@’ for drawing edges;\r
+ * ‘#’ for wired cones;\r
+ * ‘t’ for drawing tubes/cylinders instead of cones/prisms;\r
+ * ‘4’, ‘6’, ‘8’ for drawing square, hex- or octo-prism instead of cones;\r
+ * ‘<’, ‘^’ or ‘>’ for aligning cones left, right or centering them at its x-coordinates.\r
+ * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/\r
 void MGL_EXPORT mgl_cones(HMGL graph, HCDT z,  const char *pen, const char *opt);\r
 void MGL_EXPORT mgl_cones_(uintptr_t *graph, uintptr_t *z,     const char *pen, const char *opt,int,int);\r
 \r
@@ -129,19 +166,51 @@ void MGL_EXPORT mgl_textmarkw(HMGL graph, HCDT y, const wchar_t *text, const cha
 void MGL_EXPORT mgl_textmark_(uintptr_t *graph, uintptr_t *y, const char *text, const char *fnt, const char *opt,int,int,int);\r
 \r
 /// Draw labels for points coordinate(s) at points {x,y,z}\r
+/** String \a fnt may contain:\r
+ *      ‘f’ for fixed format of printed numbers;\r
+ *      ‘E’ for using ‘E’ instead of ‘e’;\r
+ *      ‘F’ for printing in LaTeX format;\r
+ *      ‘+’ for printing ‘+’ for positive numbers;\r
+ *      ‘-’ for printing usual ‘-’;\r
+ *      ‘0123456789’ for precision at printing numbers.*/\r
 void MGL_EXPORT mgl_label_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *text, const char *fnt, const char *opt);\r
 void MGL_EXPORT mgl_label_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *text, const char *fnt, const char *opt,int,int,int);\r
 void MGL_EXPORT mgl_labelw_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const wchar_t *text, const char *fnt, const char *opt);\r
 /// Draw labels for points coordinate(s) at points {x,y}\r
+/** String \a fnt may contain:\r
+ *      ‘f’ for fixed format of printed numbers;\r
+ *      ‘E’ for using ‘E’ instead of ‘e’;\r
+ *      ‘F’ for printing in LaTeX format;\r
+ *      ‘+’ for printing ‘+’ for positive numbers;\r
+ *      ‘-’ for printing usual ‘-’;\r
+ *      ‘0123456789’ for precision at printing numbers.*/\r
 void MGL_EXPORT mgl_label_xy(HMGL graph, HCDT x, HCDT y, const char *text, const char *fnt, const char *opt);\r
 void MGL_EXPORT mgl_label_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *text, const char *fnt, const char *opt,int,int,int);\r
 void MGL_EXPORT mgl_labelw_xy(HMGL graph, HCDT x, HCDT y, const wchar_t *text, const char *fnt, const char *opt);\r
 /// Draw labels for points coordinate(s) at points {x,y} with x in x-axis range\r
+/** String \a fnt may contain:\r
+ *      ‘f’ for fixed format of printed numbers;\r
+ *      ‘E’ for using ‘E’ instead of ‘e’;\r
+ *      ‘F’ for printing in LaTeX format;\r
+ *      ‘+’ for printing ‘+’ for positive numbers;\r
+ *      ‘-’ for printing usual ‘-’;\r
+ *      ‘0123456789’ for precision at printing numbers.*/\r
 void MGL_EXPORT mgl_label_y(HMGL graph, HCDT y, const char *text, const char *fnt, const char *opt);\r
 void MGL_EXPORT mgl_labelw_y(HMGL graph, HCDT y, const wchar_t *text, const char *fnt, const char *opt);\r
 void MGL_EXPORT mgl_label_y_(uintptr_t *graph, uintptr_t *y, const char *text, const char *fnt, const char *opt,int,int,int);\r
 \r
 /// Draw table for values val along given direction with row labels text at position {x,y}\r
+/** String \a fnt may contain:\r
+ *      ‘#’ for drawing cell borders;\r
+ *      ‘|’ for limiting table widh by subplot one (equal to option ‘value 1’);\r
+ *      ‘=’ for equal width of all cells;\r
+ *      ‘f’ for fixed format of printed numbers;\r
+ *      ‘E’ for using ‘E’ instead of ‘e’;\r
+ *      ‘F’ for printing in LaTeX format;\r
+ *      ‘+’ for printing ‘+’ for positive numbers;\r
+ *      ‘-’ for printing usual ‘-’;\r
+ *      ‘0123456789’ for precision at printing numbers.\r
+ * Option value set the width of the table (default is 1).*/\r
 void MGL_EXPORT mgl_table(HMGL gr, double x, double y, HCDT val, const char *text, const char *fnt, const char *opt);\r
 void MGL_EXPORT mgl_table_(uintptr_t *gr, mreal *x, mreal *y, uintptr_t *val, const char *text, const char *fnt, const char *opt,int,int,int);\r
 void MGL_EXPORT mgl_tablew(HMGL gr, double x, double y, HCDT val, const wchar_t *text, const char *fnt, const char *opt);\r
index 53241dfe1097bdcc75eee06724f15754ad3a2778..0e6334cfea0c0fcf45d1a444cde4547897af90ff 100644 (file)
@@ -97,6 +97,8 @@ public slots:
        void zoomIn();                  ///< Zoom in graphics\r
        void zoomOut();                 ///< Zoom out graphics\r
        void restore();                 ///< Restore zoom and rotation to default values\r
+       void setZoomScl(double s=0.5);          ///< Set factor for zooming (must be s>0)\r
+       void setShiftScl(double s=0.25);        ///< Set factor for shifting (must be s!=0)\r
        //      void reload();                  ///< Reload data and execute script\r
 \r
        void shiftLeft();               ///< Shift graphics to left direction\r
@@ -203,6 +205,8 @@ private slots:
        void afterPlot();       ///< minor tuning after plot was done\r
 private:\r
        int x0, y0, xe, ye;             ///< Temporary variables for mouse\r
+       double sclZ;                    ///< Scale factor for zooming\r
+       double sclS;                    ///< Scale factor for shifting\r
        uchar *grBuf;\r
        void drawPrim();\r
        int prevQuality;\r
index b1fe54eaa4bc58524158ca7cc69b60eb4db1e813..43f35b45f9eb1947ddb43a4054643161ef8cc9b0 100644 (file)
@@ -26,9 +26,11 @@ extern "C" {
 #endif\r
 \r
 /// Draw surface by formula with x,y in axis range\r
+/** Option "value" set initial number of points. */\r
 void MGL_EXPORT mgl_fsurf(HMGL graph, const char *fz, const char *stl, const char *opt);\r
 void MGL_EXPORT mgl_fsurf_(uintptr_t *graph, const char *fz, const char *stl, const char *opt,int,int,int);\r
 /// Draw surface by formulas parametrically depended on u,v in range [0,1]\r
+/** Option "value" set initial number of points. */\r
 void MGL_EXPORT mgl_fsurf_xyz(HMGL graph, const char *fx, const char *fy, const char *fz, const char *stl, const char *opt);\r
 void MGL_EXPORT mgl_fsurf_xyz_(uintptr_t *graph, const char *fx, const char *fy, const char *fz, const char *stl, const char *opt, int, int, int, int, int);\r
 \r
@@ -46,38 +48,48 @@ void MGL_EXPORT mgl_mesh_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintp
 void MGL_EXPORT mgl_mesh(HMGL graph, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_mesh_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 \r
-/// Draw mesh lines for 2d data specified parametrically\r
+/// Draw waterfall plot for 2d data specified parametrically\r
+/** Style 'x' draw lines in x-direction. */\r
 void MGL_EXPORT mgl_fall_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_fall_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int);\r
-/// Draw mesh lines for 2d data\r
+/// Draw waterfall plot for 2d data\r
+/** Style 'x' draw lines in x-direction. */\r
 void MGL_EXPORT mgl_fall(HMGL graph, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_fall_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 \r
 /// Draw belts for 2d data specified parametrically\r
+/** Style 'x' draw belts in x-direction. */\r
 void MGL_EXPORT mgl_belt_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_belt_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 /// Draw belts for 2d data\r
+/** Style 'x' draw belts in x-direction. */\r
 void MGL_EXPORT mgl_belt(HMGL graph, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_belt_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 \r
 /// Draw surface for 2d data specified parametrically with color proportional to z\r
+/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
 void MGL_EXPORT mgl_surf_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_surf_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 /// Draw surface for 2d data with color proportional to z\r
+/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
 void MGL_EXPORT mgl_surf(HMGL graph, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_surf_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 \r
 /// Draw density plot for 2d data specified parametrically\r
-void MGL_EXPORT mgl_dens_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt);\r
-void MGL_EXPORT mgl_dens_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int);\r
+/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
+void MGL_EXPORT mgl_dens_xy(HMGL graph, HCDT x, HCDT y, HCDT c, const char *sch, const char *opt);\r
+void MGL_EXPORT mgl_dens_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *c, const char *sch, const char *opt,int,int);\r
 /// Draw density plot for 2d data\r
-void MGL_EXPORT mgl_dens(HMGL graph, HCDT z, const char *sch, const char *opt);\r
-void MGL_EXPORT mgl_dens_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int);\r
+/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
+void MGL_EXPORT mgl_dens(HMGL graph, HCDT c, const char *sch, const char *opt);\r
+void MGL_EXPORT mgl_dens_(uintptr_t *graph, uintptr_t *c, const char *sch, const char *opt,int,int);\r
 \r
 /// Draw vertical boxes for 2d data specified parametrically\r
+/** Style ‘#’ draw filled boxes. */\r
 void MGL_EXPORT mgl_boxs_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_boxs_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 /// Draw vertical boxes for 2d data\r
+/** Style ‘#’ draw filled boxes. */\r
 void MGL_EXPORT mgl_boxs(HMGL graph, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_boxs_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 \r
@@ -96,30 +108,47 @@ void MGL_EXPORT mgl_tiles(HMGL graph, HCDT z, HCDT r, const char *sch, const cha
 void MGL_EXPORT mgl_tiles_(uintptr_t *graph, uintptr_t *z, uintptr_t *r, const char *sch, const char *opt,int,int);\r
 \r
 /// Draw surface for 2d data specified parametrically with color proportional to c\r
+/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
 void MGL_EXPORT mgl_surfc_xy(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_surfc_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int);\r
 /// Draw surface for 2d data with color proportional to c\r
+/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
 void MGL_EXPORT mgl_surfc(HMGL graph, HCDT z, HCDT c, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_surfc_(uintptr_t *graph, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int);\r
 \r
 /// Draw surface for 2d data specified parametrically with alpha proportional to c\r
+/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
 void MGL_EXPORT mgl_surfa_xy(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_surfa_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int);\r
 /// Draw surface for 2d data with alpha proportional to c\r
+/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
 void MGL_EXPORT mgl_surfa(HMGL graph, HCDT z, HCDT c, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_surfa_(uintptr_t *graph, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int);\r
 \r
+/// Draw surface for 2d data specified parametrically with  color proportional to c and alpha proportional to a\r
+/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
+void MGL_EXPORT mgl_surfca_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, HCDT a, const char *sch, const char *opt);\r
+void MGL_EXPORT mgl_surfca_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, uintptr_t *a, const char *sch, const char *opt,int,int);\r
+/// Draw surface for 2d data with  color proportional to c and alpha proportional to a\r
+/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
+void MGL_EXPORT mgl_surfca(HMGL gr, HCDT z, HCDT c, HCDT a, const char *sch, const char *opt);\r
+void MGL_EXPORT mgl_surfca_(uintptr_t *graph, uintptr_t *z, uintptr_t *c, uintptr_t *a, const char *sch, const char *opt,int,int);\r
+\r
 /// Draw density plot for spectra-gramm specified parametrically\r
+/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
 void MGL_EXPORT mgl_stfa_xy(HMGL graph, HCDT x, HCDT y, HCDT re, HCDT im, int dn, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_stfa_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *re, uintptr_t *im, int *dn, const char *sch, const char *opt,int, int);\r
 /// Draw density plot for spectra-gramm\r
+/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
 void MGL_EXPORT mgl_stfa(HMGL graph, HCDT re, HCDT im, int dn, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_stfa_(uintptr_t *graph, uintptr_t *re, uintptr_t *im, int *dn, const char *sch, const char *opt,int, int);\r
 \r
 /// Color map of matrix a to matrix b, both matrix can parametrically depend on coordinates\r
+/** Style ‘.’ produce plot by dots. */\r
 void MGL_EXPORT mgl_map_xy(HMGL graph, HCDT x, HCDT y, HCDT a, HCDT b, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_map_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *a, uintptr_t *b, const char *sch, const char *opt,int,int);\r
 /// Color map of matrix a to matrix b\r
+/** Style ‘.’ produce plot by dots. */\r
 void MGL_EXPORT mgl_map(HMGL graph, HCDT a, HCDT b, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_map_(uintptr_t *graph, uintptr_t *a, uintptr_t *b, const char *sch, const char *opt,int,int);\r
 \r
index 3a97b801cc3b43f3c59e9ad455b4827c7a0aad75..8450f76d1a2f3fefacbba1b1fccddea9f14e106f 100644 (file)
@@ -41,6 +41,7 @@ struct MGL_EXPORT mglPoint
 #if MGL_HAVE_RVAL
        mglPoint(mglPoint &&d):x(d.x),y(d.y),z(d.z),c(d.c)      {}
 #endif
+       inline void Set(mreal X=0,mreal Y=0,mreal Z=0,mreal C=0)        {x=X;y=Y;z=Z;c=C;}
        inline bool IsNAN()             {       return (x!=x || y!=y || z!=z || c!=c);  }
        inline mreal val(int i) {       return (i<2 ? (i==0 ? x:y) : (i==2 ? z:c));     }
        inline mreal norm()             {       return sqrt(x*x+y*y+z*z);       }
index ce1f33f5056cf4ba57fe8dc42184e5c20b46a46a..388c0e077c851a2821db6f8b25cfa1d3b489fa74 100644 (file)
@@ -26,78 +26,192 @@ extern "C" {
 #endif\r
 //-----------------------------------------------------------------------------\r
 /// Plot vectors at position {x,y} along {ax,ay} with length/color proportional to |a|\r
+/** Option value set the vector length factor (if non-zero) or vector length to be proportional the distance between curve points (if value=0). */\r
 void MGL_EXPORT mgl_traj_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_traj_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int);\r
 /// Plot vectors at position {x,y,z} along {ax,ay,az} with length/color proportional to |a|\r
+/** Option value set the vector length factor (if non-zero) or vector length to be proportional the distance between curve points (if value=0). */\r
 void MGL_EXPORT mgl_traj_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_traj_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int);\r
 \r
 /// Plot vector field {ax,ay} parametrically depended on coordinate {x,y} with length/color proportional to |a|\r
+/** String \a sch may contain:\r
+ * ‘f’ for drawing arrows with fixed lengths,\r
+ * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering),\r
+ * ‘.’ for drawing hachures with dots instead of arrows,\r
+ * ‘=’ for enabling color gradient along arrows. */\r
 void MGL_EXPORT mgl_vect_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_vect_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int);\r
 /// Plot vector field {ax,ay} with length/color proportional to |a|\r
+/** String \a sch may contain:\r
+ * ‘f’ for drawing arrows with fixed lengths,\r
+ * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering),\r
+ * ‘.’ for drawing hachures with dots instead of arrows,\r
+ * ‘=’ for enabling color gradient along arrows. */\r
 void MGL_EXPORT mgl_vect_2d(HMGL gr, HCDT ax, HCDT ay, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_vect_2d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int);\r
 /// Plot vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with length/color proportional to |a|\r
+/** String \a sch may contain:\r
+ * ‘f’ for drawing arrows with fixed lengths,\r
+ * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering),\r
+ * ‘.’ for drawing hachures with dots instead of arrows,\r
+ * ‘=’ for enabling color gradient along arrows. */\r
 void MGL_EXPORT mgl_vect_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_vect_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int);\r
 /// Plot vector field {ax,ay,az} with length/color proportional to |a|\r
+/** String \a sch may contain:\r
+ * ‘f’ for drawing arrows with fixed lengths,\r
+ * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering),\r
+ * ‘.’ for drawing hachures with dots instead of arrows,\r
+ * ‘=’ for enabling color gradient along arrows. */\r
 void MGL_EXPORT mgl_vect_3d(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_vect_3d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int);\r
 \r
 /// Plot flows for vector field {ax,ay} parametrically depended on coordinate {x,y} with color proportional to |a|\r
+/** String \a sch may contain:\r
+ * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+ * ‘#’ for starting threads from edges only;\r
+ * ‘v’ for drawing arrows on the threads.\r
+ * Option "value" sets the number of threads (default is 5). */\r
 void MGL_EXPORT mgl_flow_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_flow_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int);\r
 /// Plot flows for vector field {ax,ay} with color proportional to |a|\r
+/** String \a sch may contain:\r
+ * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+ * ‘#’ for starting threads from edges only;\r
+ * ‘v’ for drawing arrows on the threads.\r
+ * Option "value" sets the number of threads (default is 5). */\r
 void MGL_EXPORT mgl_flow_2d(HMGL gr, HCDT ax, HCDT ay, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_flow_2d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int);\r
 /// Plot flows for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a|\r
+/** String \a sch may contain:\r
+ * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+ * ‘#’ for starting threads from edges only;\r
+ * ‘v’ for drawing arrows on the threads;\r
+ * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly.\r
+ * Option "value" sets the number of threads (default is 5). */\r
 void MGL_EXPORT mgl_flow_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_flow_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int);\r
 /// Plot flows for vector field {ax,ay,az} with color proportional to |a|\r
+/** String \a sch may contain:\r
+ * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+ * ‘#’ for starting threads from edges only;\r
+ * ‘v’ for drawing arrows on the threads;\r
+ * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly.\r
+ * Option "value" sets the number of threads (default is 5). */\r
 void MGL_EXPORT mgl_flow_3d(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_flow_3d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int);\r
 \r
 /// Plot flow from point p for vector field {ax,ay} parametrically depended on coordinate {x,y} with color proportional to |a|\r
+/** String \a sch may contain:\r
+ * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+ * ‘#’ for starting threads from edges only;\r
+ * ‘v’ for drawing arrows on the threads. */\r
 void MGL_EXPORT mgl_flowp_xy(HMGL gr, double x0, double y0, double z0, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_flowp_xy_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0, uintptr_t *x, uintptr_t *y, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int, int);\r
 /// Plot flow from point p for vector field {ax,ay} with color proportional to |a|\r
+/** String \a sch may contain:\r
+ * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+ * ‘#’ for starting threads from edges only;\r
+ * ‘v’ for drawing arrows on the threads. */\r
 void MGL_EXPORT mgl_flowp_2d(HMGL gr, double x0, double y0, double z0, HCDT ax, HCDT ay, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_flowp_2d_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int, int);\r
 /// Plot flow from point p for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a|\r
+/** String \a sch may contain:\r
+ * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+ * ‘#’ for starting threads from edges only;\r
+ * ‘v’ for drawing arrows on the threads;\r
+ * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. */\r
 void MGL_EXPORT mgl_flowp_xyz(HMGL gr, double x0, double y0, double z0, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_flowp_xyz_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int, int);\r
 /// Plot flow from point p for vector field {ax,ay,az} with color proportional to |a|\r
+/** String \a sch may contain:\r
+ * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+ * ‘#’ for starting threads from edges only;\r
+ * ‘v’ for drawing arrows on the threads;\r
+ * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. */\r
 void MGL_EXPORT mgl_flowp_3d(HMGL gr, double x0, double y0, double z0, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_flowp_3d_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int);\r
 \r
 /// Plot flow pipes for vector field {ax,ay} parametrically depended on coordinate {x,y} with color and radius proportional to |a|\r
+/** String \a sch may contain:\r
+ * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+ * ‘#’ for starting threads from edges only;\r
+ * ‘i’ for pipe radius to be inverse proportional to amplitude.\r
+ * Option "value" sets the number of threads (default is 5). */\r
 void MGL_EXPORT mgl_pipe_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, double r0, const char *opt);\r
 void MGL_EXPORT mgl_pipe_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *ax, uintptr_t *ay, const char *sch, mreal *r0, const char *opt,int,int);\r
 /// Plot flow pipes for vector field {ax,ay} with color and radius proportional to |a|\r
+/** String \a sch may contain:\r
+ * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+ * ‘#’ for starting threads from edges only;\r
+ * ‘i’ for pipe radius to be inverse proportional to amplitude.\r
+ * Option "value" sets the number of threads (default is 5). */\r
 void MGL_EXPORT mgl_pipe_2d(HMGL gr, HCDT ax, HCDT ay, const char *sch, double r0, const char *opt);\r
 void MGL_EXPORT mgl_pipe_2d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, const char *sch, mreal *r0, const char *opt,int,int);\r
 /// Plot flow pipes for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color and radius proportional to |a|\r
+/** String \a sch may contain:\r
+ * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+ * ‘#’ for starting threads from edges only;\r
+ * ‘i’ for pipe radius to be inverse proportional to amplitude;\r
+ * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly.\r
+ * Option "value" sets the number of threads (default is 5). */\r
 void MGL_EXPORT mgl_pipe_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, double r0, const char *opt);\r
 void MGL_EXPORT mgl_pipe_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, mreal *r0, const char *opt,int,int);\r
 /// Plot flow pipes for vector field {ax,ay,az} with color and radius proportional to |a|\r
+/** String \a sch may contain:\r
+ * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+ * ‘#’ for starting threads from edges only;\r
+ * ‘i’ for pipe radius to be inverse proportional to amplitude;\r
+ * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly.\r
+ * Option "value" sets the number of threads (default is 5). */\r
 void MGL_EXPORT mgl_pipe_3d(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, double r0, const char *opt);\r
 void MGL_EXPORT mgl_pipe_3d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, mreal *r0, const char *opt,int,int);\r
 \r
 /// Plot flows for gradient of scalar field phi parametrically depended on coordinate {x,y,z}\r
+       /** String \a sch may contain:\r
+        * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+        * ‘#’ for starting threads from edges only;\r
+        * ‘v’ for drawing arrows on the threads;\r
+        * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly.\r
+        * Option "value" sets the number of threads (default is 5). */\r
 void MGL_EXPORT mgl_grad_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ph, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_grad_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ph, const char *sch, const char *opt,int, int);\r
 /// Plot flows for gradient of scalar field phi parametrically depended on coordinate {x,y}\r
+       /** String \a sch may contain:\r
+        * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+        * ‘#’ for starting threads from edges only;\r
+        * ‘v’ for drawing arrows on the threads;\r
+        * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly.\r
+        * Option "value" sets the number of threads (default is 5). */\r
 void MGL_EXPORT mgl_grad_xy(HMGL gr, HCDT x, HCDT y, HCDT ph, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_grad_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *ph, const char *sch, const char *opt,int,int);\r
 /// Plot flows for gradient of scalar field phi\r
+       /** String \a sch may contain:\r
+        * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+        * ‘#’ for starting threads from edges only;\r
+        * ‘v’ for drawing arrows on the threads;\r
+        * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly.\r
+        * Option "value" sets the number of threads (default is 5). */\r
 void MGL_EXPORT mgl_grad(HMGL gr, HCDT ph, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_grad_(uintptr_t *gr, uintptr_t *ph, const char *sch, const char *opt,int,int);\r
 \r
-/// Draw vector plot at slice for 3d data specified parametrically\r
+/// Draw vector plot along slice for 3d data specified parametrically\r
+/** String \a sch may contain:\r
+ * ‘f’ for drawing arrows with fixed lengths,\r
+ * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering),\r
+ * ‘.’ for drawing hachures with dots instead of arrows,\r
+ * ‘=’ for enabling color gradient along arrows,\r
+ * ‘ x’, ‘z’ for producing plot perpendicular to x- or z-direction correspondingly. */\r
 void MGL_EXPORT mgl_vect3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_vect3_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, mreal *sVal, const char *opt,int,int);\r
-/// Draw vector plot at slice for 3d data\r
+/// Draw vector plot along slice for 3d data\r
+/** String \a sch may contain:\r
+ * ‘f’ for drawing arrows with fixed lengths,\r
+ * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering),\r
+ * ‘.’ for drawing hachures with dots instead of arrows,\r
+ * ‘=’ for enabling color gradient along arrows,\r
+ * ‘ x’, ‘z’ for producing plot perpendicular to x- or z-direction correspondingly. */\r
 void MGL_EXPORT mgl_vect3(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, double sVal, const char *opt);\r
 void MGL_EXPORT mgl_vect3_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, mreal *sVal, const char *opt,int,int);\r
 //-----------------------------------------------------------------------------\r
index 9ec34aeb6148d2c3e8796b24b50db96af2881dd8..d5ee4bc695993a64a77d29480361dd0107222c48 100644 (file)
@@ -26,55 +26,105 @@ extern "C" {
 #endif\r
 //-----------------------------------------------------------------------------\r
 /// Draw isosurface for 3d data specified parametrically\r
+/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.*/\r
 void MGL_EXPORT mgl_surf3_xyz_val(HMGL graph, double Val, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, const char *opt);\r
 void MGL_EXPORT mgl_surf3_xyz_val_(uintptr_t *graph, mreal *Val, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *stl, const char *opt,int,int);\r
 /// Draw isosurface for 3d data\r
+/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.*/\r
 void MGL_EXPORT mgl_surf3_val(HMGL graph, double Val, HCDT a, const char *stl, const char *opt);\r
 void MGL_EXPORT mgl_surf3_val_(uintptr_t *graph, mreal *Val, uintptr_t *a, const char *stl, const char *opt,int,int);\r
 /// Draw isosurfaces for 3d data specified parametrically\r
+/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.\r
+ * Option "value" set the number of isosurfaces (default is 3). */\r
 void MGL_EXPORT mgl_surf3_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, const char *opt);\r
 void MGL_EXPORT mgl_surf3_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *stl, const char *opt,int,int);\r
 /// Draw isosurfaces for 3d data\r
+/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.\r
+ * Option "value" set the number of isosurfaces (default is 3). */\r
 void MGL_EXPORT mgl_surf3(HMGL graph, HCDT a, const char *stl, const char *opt);\r
 void MGL_EXPORT mgl_surf3_(uintptr_t *graph, uintptr_t *a, const char *stl, const char *opt,int,int);\r
 \r
 /// Draw isosurface for 3d data specified parametrically with alpha proportional to b\r
+/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */\r
 void MGL_EXPORT mgl_surf3a_xyz_val(HMGL graph, double Val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *stl, const char *opt);\r
 void MGL_EXPORT mgl_surf3a_xyz_val_(uintptr_t *graph, mreal *Val, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int);\r
 /// Draw isosurface for 3d data with alpha proportional to b\r
+/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */\r
 void MGL_EXPORT mgl_surf3a_val(HMGL graph, double Val, HCDT a, HCDT b, const char *stl, const char *opt);\r
 void MGL_EXPORT mgl_surf3a_val_(uintptr_t *graph, mreal *Val, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int);\r
 /// Draw isosurfaces for 3d data specified parametrically with alpha proportional to b\r
+/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.\r
+ * Option "value" set the number of isosurfaces (default is 3). */\r
 void MGL_EXPORT mgl_surf3a_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *stl, const char *opt);\r
 void MGL_EXPORT mgl_surf3a_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int);\r
 /// Draw isosurfaces for 3d data with alpha proportional to b\r
+/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.\r
+ * Option "value" set the number of isosurfaces (default is 3). */\r
 void MGL_EXPORT mgl_surf3a(HMGL graph, HCDT a, HCDT b, const char *stl, const char *opt);\r
 void MGL_EXPORT mgl_surf3a_(uintptr_t *graph, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int);\r
 \r
 /// Draw isosurface for 3d data specified parametrically with color proportional to b\r
+/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */\r
 void MGL_EXPORT mgl_surf3c_xyz_val(HMGL graph, double Val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *stl, const char *opt);\r
 void MGL_EXPORT mgl_surf3c_xyz_val_(uintptr_t *graph, mreal *Val, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int);\r
 /// Draw isosurface for 3d data with color proportional to b\r
+/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */\r
 void MGL_EXPORT mgl_surf3c_val(HMGL graph, double Val, HCDT a, HCDT b, const char *stl, const char *opt);\r
 void MGL_EXPORT mgl_surf3c_val_(uintptr_t *graph, mreal *Val, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int);\r
 /// Draw isosurfaces for 3d data specified parametrically with color proportional to b\r
+/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.\r
+ * Option "value" set the number of isosurfaces (default is 3). */\r
 void MGL_EXPORT mgl_surf3c_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *stl, const char *opt);\r
 void MGL_EXPORT mgl_surf3c_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int);\r
 /// Draw isosurfaces for 3d data with color proportional to b\r
+/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.\r
+ * Option "value" set the number of isosurfaces (default is 3). */\r
 void MGL_EXPORT mgl_surf3c(HMGL graph, HCDT a, HCDT b, const char *stl, const char *opt);\r
 void MGL_EXPORT mgl_surf3c_(uintptr_t *graph, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int);\r
 \r
+/// Draw isosurface for 3d data specified parametrically with color proportional to c and alpha proportional to b\r
+/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */\r
+void MGL_EXPORT mgl_surf3ca_xyz_val(HMGL graph, double Val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT c, HCDT b, const char *stl, const char *opt);\r
+void MGL_EXPORT mgl_surf3ca_xyz_val_(uintptr_t *graph, mreal *Val, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *c, uintptr_t *b, const char *stl, const char *opt,int,int);\r
+/// Draw isosurface for 3d data with color proportional to c and alpha proportional to b\r
+/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */\r
+void MGL_EXPORT mgl_surf3ca_val(HMGL graph, double Val, HCDT a, HCDT c, HCDT b, const char *stl, const char *opt);\r
+void MGL_EXPORT mgl_surf3ca_val_(uintptr_t *graph, mreal *Val, uintptr_t *a, uintptr_t *c, uintptr_t *b, const char *stl, const char *opt,int,int);\r
+/// Draw isosurfaces for 3d data specified parametrically with color proportional to c and alpha proportional to b\r
+/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.\r
+ * Option "value" set the number of isosurfaces (default is 3). */\r
+void MGL_EXPORT mgl_surf3ca_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, HCDT c, HCDT b, const char *stl, const char *opt);\r
+void MGL_EXPORT mgl_surf3ca_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *c, uintptr_t *b, const char *stl, const char *opt,int,int);\r
+/// Draw isosurfaces for 3d data with color proportional to c and alpha proportional to b\r
+/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.\r
+ * Option "value" set the number of isosurfaces (default is 3). */\r
+void MGL_EXPORT mgl_surf3ca(HMGL graph, HCDT a, HCDT c, HCDT b, const char *stl, const char *opt);\r
+void MGL_EXPORT mgl_surf3ca_(uintptr_t *graph, uintptr_t *a, uintptr_t *c, uintptr_t *b, const char *stl, const char *opt,int,int);\r
+\r
 /// Draw a semi-transparent cloud for 3d data specified parametrically\r
+/** Style ‘.’ produce plot by dots. Style ‘i’ use inverted values for transparency. */\r
 void MGL_EXPORT mgl_cloud_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, const char *opt);\r
 void MGL_EXPORT mgl_cloud_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *stl, const char *opt,int,int);\r
 /// Draw a semi-transparent cloud for 3d data\r
+/** Style ‘.’ produce plot by dots. Style ‘i’ use inverted values for transparency. */\r
 void MGL_EXPORT mgl_cloud(HMGL graph, HCDT a, const char *stl, const char *opt);\r
 void MGL_EXPORT mgl_cloud_(uintptr_t *graph, uintptr_t *a, const char *stl, const char *opt,int,int);\r
 \r
 /// Draw isosurface for 3d beam in curvilinear coordinates\r
+/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.\r
+ *  Variable \a flag is bitwise:\r
+ * ‘0x1’ - draw in accompanied (not laboratory) coordinates;\r
+ * ‘0x2’ - draw projection to \rho-z plane;\r
+ * ‘0x4’ - draw normalized in each slice field.*/\r
 void MGL_EXPORT mgl_beam_val(HMGL graph, double Val, HCDT tr, HCDT g1, HCDT g2, HCDT a, double r, const char *stl, int norm);\r
 void MGL_EXPORT mgl_beam_val_(uintptr_t *gr, mreal *val, uintptr_t *tr, uintptr_t *g1, uintptr_t *g2, uintptr_t *a, mreal *r, const char *sch, int *norm,int l);\r
 /// Draw several isosurfaces for 3d beam in curvilinear coordinates\r
+/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.\r
+ * Option "value" set the number of isosurfaces (default is 3).\r
+ *  Variable \a flag is bitwise:\r
+ * ‘0x1’ - draw in accompanied (not laboratory) coordinates;\r
+ * ‘0x2’ - draw projection to \rho-z plane;\r
+ * ‘0x4’ - draw normalized in each slice field.*/\r
 void MGL_EXPORT mgl_beam(HMGL graph, HCDT tr, HCDT g1, HCDT g2, HCDT a, double r, const char *stl, int norm, int num);\r
 void MGL_EXPORT mgl_beam_(uintptr_t *gr, uintptr_t *tr, uintptr_t *g1, uintptr_t *g2, uintptr_t *a, mreal *r, const char *sch, int *norm, int *num,int l);\r
 //-----------------------------------------------------------------------------\r
index 4e88df662bc10f69d707d0b627ad7484f7d18c24..3c78b78db887a7c4fd3ba552cb100955850790f1 100644 (file)
@@ -15,7 +15,8 @@ var main = function() {
   graph = new mathgl.Graph(canvas, backend);
   graph.setBackgroundFillStyle("#F0F0F0");
   // initialize it by some sample MGL script
-  graph.init(makeSampleScript());
+  graph.loadGeometry(makeSampleScript(),null);
+  graph.setPerspective(0.5);
 }
 
 
@@ -29,7 +30,8 @@ var makeSampleScript = function() {
        var mgl = "origintick off\n";
        mgl += "title 'qqq' '@k':ranges -2 2 -2 2 -2 2:colorbar '>'\n"   // NOTE: Ranges MUST BE specified for correctly work of zoomaxis feature
        mgl += "facenum 50:";
-       mgl += "origin 0 0 0:axis :xlabel 'x':ylabel 'y':zlabel 'z':"
+//     mgl += "origin 0 0 0:axis :xlabel 'xxxx':ylabel 'yyyy':zlabel 'zzzz':"
+       mgl += "axis :xlabel 'xxxx':ylabel 'yyyy':zlabel 'zzzz':"
        mgl += "box:fplot 'sin(x^2)'\n";   // This is just for testing zoomaxis features
        mgl += "text 0 0 'aaa'";
        return mgl;
index 6c1ec745a7bc58315b2ee37579f72da208c19a7e..69ace4e61f48b1acffe858fff61a588c38702489 100644 (file)
@@ -7,7 +7,7 @@ mathgl.Backend = function() {}
 
 /**
  * Request for geometry data for given MGL script.
- * @param mgl {String} MGL script containing all the information neede to build geometry
- * @return {Object} geometry data gathered from server-side
+ * @param mgl {String} MGL script to build geometry
+ * @param callback {Function} receiver of geometry must be a function(error, result)
  */
-mathgl.Backend.prototype.geometry = function(mgl) { throw new Error("abstract method invoked"); }
+mathgl.Backend.prototype.geometry = function(mgl, callback) { throw new Error("abstract method invoked"); }
index d505b47934ba3798864ea944f561a91a608ad82c..22c86608ba183a9740980be252495a401f775a99 100644 (file)
@@ -26,26 +26,17 @@ mathgl.Graph = function(canvas, backend) {
        this.__x1 = 0;  this.__y1 = 0;  this.__z1 = 0;
        this.__x2 = 1;  this.__y2 = 1;  this.__z2 = 1;
        this.__activeTimeoutHandlers = [];
+
+  // create view
+  this.__view = new mathgl.View();
+  // connect method which starts rendering to view object
+  this.__view.setRenderLauncher(mathgl.bind(this.__renderStart, this));
+  // connect pick point handler
+  this.__view.setPickPointHandler(mathgl.bind(this.__pickPointHandler, this));
+  // attach canvas to view
+  this.__view.attachCanvas(this.__canvas);
 };
 
-/**
- * Initialize current view by given MGL script.
- * @param mgl {String} MGL script
- */
-mathgl.Graph.prototype.init = function(mgl) {
-       // request backend for geometry object
-       this.__geometry = this.__backend.geometry(mgl);
-       this.__geometry.mgl = mgl;
-       // construct view according the view type recieved from backend (within geometry object) and initialize it
-
-       this.__view = new mathgl.View();
-       // connect method which starts rendering to view object
-       this.__view.setRenderLauncher(mathgl.bind(this.__renderStart, this));
-       // connect pick point handler
-       this.__view.setPickPointHandler(mathgl.bind(this.__pickPointHandler, this));
-       // attach canvas to view
-       this.__view.attachCanvas(this.__canvas);
-}
 
 /**
  * Method uses to wrap native JS setTimeout function to make possible deactivate active callbacks in destroy method
@@ -125,11 +116,8 @@ mathgl.Graph.prototype.shiftAxis = function(x, y, z) {
        this.__z1 += dz; this.__z2 += dz;
        // introduce zoomaxis coomand for server side
        var zoom = "zoomaxis "+this.__x1+" "+this.__y1+" "+this.__z1+" "+this.__x2+" "+this.__y2+" "+this.__z2+"\n";
-       var mgl = this.__geometry.mgl;
-       // now ask server side for proper coordinates
-       this.__geometry = this.__backend.geometry(zoom+mgl);
-       this.__geometry.mgl = mgl;
-       this.__renderStart();
+
+  this.loadGeometry(zoom + this.__geometry.mgl);
 }
 
 
@@ -144,18 +132,15 @@ mathgl.Graph.prototype.zoomAxis = function(factor) {
        this.__z1 = c-d; this.__z2 = c+d;
        // introduce zoomaxis coomand for server side
        var zoom = "zoomaxis "+this.__x1+" "+this.__y1+" "+this.__z1+" "+this.__x2+" "+this.__y2+" "+this.__z2+"\n";
-       var mgl = this.__geometry.mgl;
-       // now ask server side for proper coordinates
-       this.__geometry = this.__backend.geometry(zoom+this.__geometry.mgl);
-       this.__geometry.mgl = mgl;
-       this.__renderStart();
+
+  this.loadGeometry(zoom + this.__geometry.mgl);
 }
 
 
 /** initiate the chains of rendering the geometry to the canvas */
 mathgl.Graph.prototype.__renderStart = function() {
-       // do nothing if processing is already started
-       if (!this.__isDraftRenderingInScheduled) {
+       // do nothing if processing is already started or no geometry
+       if (!this.__isDraftRenderingInScheduled && this.__geometry) {
                // enqueue draft rendering step
                this.__isDraftRenderingInScheduled = true;
                this.__setTimeout(mathgl.bind(this.__renderDraft, this), 0);
@@ -279,11 +264,19 @@ mathgl.Graph.prototype.__mgl_draw_good = function(obj, ctx, skip) {
        {
                var prim = obj.prim[i];
                var scl = s1*this.__mgl_pf(obj, prim[9]);
-               if(obj.pnts[prim[1]][3])        scl = s2;
+               if(obj.pnts[prim[1]][3]<0)      scl = s2;
                this.__mgl_draw_prim(obj,ctx,prim,scl);
        }
 }
 
+
+mathgl.Graph.prototype.__mgl_pf = function(obj, z) {
+       //      return 1/obj.pf;
+       return (1-this.__fov/1.37)/obj.pf/(1-this.__fov*z/obj.depth);   // TODO: check calc coordinates!!!
+       //      return 1/(1+obj.pf*(1-z/obj.depth));
+}
+
+
 /** perform high-quality drawing */
 mathgl.Graph.prototype.__mgl_draw_prim = function(obj, ctx, prim, scl) {
        var n1 = prim[1], n2 = prim[2];
@@ -328,7 +321,13 @@ mathgl.Graph.prototype.__mgl_draw_prim = function(obj, ctx, prim, scl) {
                var xx=obj.coor[n2][2]/100,yy=-obj.coor[n2][3]/100,zz=obj.coor[n2][4]/100;
                var xc = obj.b[0]*xx + obj.b[1]*yy + obj.b[2]*zz;
                var yc = obj.b[3]*xx + obj.b[4]*yy + obj.b[5]*zz;
-//             var zc = obj.b[6]*xx + obj.b[7]*yy + obj.b[8]*zz;
+               var zc = obj.b[6]*xx + obj.b[7]*yy + obj.b[8]*zz;
+
+               var dv = this.__mgl_pf(obj, pp[n1][2]);
+               var cv = this.__fov*obj.pf/(1-this.__fov/1.37)/obj.depth;
+               xc += (pp[n1][0]-obj.b[9])*zc*cv;//*dv;
+               yc += (pp[n1][1]-obj.b[10])*zc*cv;//*dv;
+
                if(obj.pnts[n1][3]<0)   {       xc=xx;  yc=yy;  }
                var ll = xc*xc+yc*yc;
                if(ll < 1e-10)  break;
@@ -356,13 +355,6 @@ mathgl.Graph.prototype.__mgl_draw_prim = function(obj, ctx, prim, scl) {
        }
 }
 
-mathgl.Graph.prototype.__mgl_pf = function(obj, z) {
-//     return 1/obj.pf;
-       return (1-this.__fov/1.37)/obj.pf/(1-this.__fov*z/obj.depth);   // TODO: check calc coordinates!!!
-//     return 1/(1+obj.pf*(1-z/obj.depth));
-}
-
-
 /** change coordinates according current transformations, usually called internally by draw() */
 mathgl.Graph.prototype.__mgl_prepare = function(obj, skip) {
        // fill transformation matrix
@@ -381,12 +373,13 @@ mathgl.Graph.prototype.__mgl_prepare = function(obj, skip) {
        }
        // now transform points for found transformation matrix
        var b = obj.b, i;
+       obj.pp = [];
        for(i=0;i<obj.npnts;i++)
        {
                var x = obj.pnts[i][0]-obj.width/2;
                var y = obj.pnts[i][1]-obj.height/2;
                var z = obj.pnts[i][2]-obj.depth/2;
-               if(obj.pnts[i][3]==0)   // TODO: check later when mglInPlot will be ready
+               if(obj.pnts[i][3]>=0)   // TODO: check later when mglInPlot will be ready
                        obj.pp[i] = [b[9]  + b[0]*x + b[1]*y + b[2]*z,
                                                b[10] + b[3]*x + b[4]*y + b[5]*z,
                                                b[11] + b[6]*x + b[7]*y + b[8]*z];
@@ -396,7 +389,7 @@ mathgl.Graph.prototype.__mgl_prepare = function(obj, skip) {
        if(obj.pf || this.__fov)        for(var i=0;i<obj.npnts;i++)    // perspective
        {       // NOTE: it is not supported for coordinate determining now
                var d = this.__mgl_pf(obj, obj.pp[i][2]);
-               if(obj.pnts[i][3]==0)   // TODO: check later when mglInPlot will be ready
+               if(obj.pnts[i][3]>=0)   // TODO: check later when mglInPlot will be ready
                {
                        obj.pp[i][0] = d*obj.pp[i][0] + (1-d)*obj.b[9];
                        obj.pp[i][1] = d*obj.pp[i][1] + (1-d)*obj.b[10];
@@ -601,52 +594,112 @@ mathgl.Graph.prototype.__mgl_line_glyph = function(ctx, x,y, f,solid,b) {
 }
 
 
+/**
+ * Move Left using MGL 'zoomaxis' with geometry reload
+ */
 mathgl.Graph.prototype.moveLeft = function() {
        var b = this.__geometry.b;
        var f = 0.1/Math.sqrt(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]);
        this.shiftAxis(f*b[0],f*b[1],f*b[2]);
 }
 
+
+/**
+ * Move Right using MGL 'zoomaxis' with geometry reload
+ */
 mathgl.Graph.prototype.moveRight = function() {
        var b = this.__geometry.b;
        var f = -0.1/Math.sqrt(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]);
        this.shiftAxis(f*b[0],f*b[1],f*b[2]);
 }
 
+
+/**
+ * Move Up using MGL 'zoomaxis' with geometry reload
+ */
 mathgl.Graph.prototype.moveUp = function() {
        var b = this.__geometry.b;
        var f = -0.1/Math.sqrt(b[3]*b[3]+b[4]*b[4]+b[5]*b[5]);
        this.shiftAxis(-f*b[3],f*b[4],-f*b[5]);
 }
 
+
+/**
+ * Move Down using MGL 'zoomaxis' with geometry reload
+ */
 mathgl.Graph.prototype.moveDown = function() {
        var b = this.__geometry.b;
        var f = 0.1/Math.sqrt(b[3]*b[3]+b[4]*b[4]+b[5]*b[5]);
        this.shiftAxis(-f*b[3],f*b[4],-f*b[5]);
 }
 
+
+/**
+ * Zoom In using MGL 'zoomaxis' with geometry reload
+ */
 mathgl.Graph.prototype.zoomIn = function() {
        this.zoomAxis(1.1);
 }
 
+
+/**
+ * Zoom Out using MGL 'zoomaxis' with geometry reload
+ */
 mathgl.Graph.prototype.zoomOut = function() {
        this.zoomAxis(1./1.1);
 }
 
-mathgl.Graph.prototype.getView = function(mgl) {
+
+/**
+ * @return mathgl.View instance
+ */
+mathgl.Graph.prototype.getView = function() {
        return this.__view;
 }
 
-mathgl.Graph.prototype.reloadGeometry = function() {
-       var mgl = this.__geometry.mgl;
-       this.__geometry = this.__backend.geometry(mgl);
-       this.__geometry.mgl = mgl;
+
+/**
+ * Build and load geometry into View
+ * @param mgl {String} MGL script
+ * @param completeCallback {Function|null} optional callback to notify completion
+ */
+mathgl.Graph.prototype.loadGeometry = function(mgl, completeCallback) {
+  this.__backend.geometry(mgl, mathgl.bind(function(error, result) {
+    if (!error) {
+      this.__geometry = result;
+      this.__geometry.mgl = mgl;
+      this.redraw();
+
+      if (typeof completeCallback === "function") {
+        completeCallback();
+      }
+    }
+  }, this));
 }
 
+
+/**
+ * Force reload geometry
+ * @param completeCallback {Function|null} optional callback to notify completion
+ */
+mathgl.Graph.prototype.reloadGeometry = function(completeCallback) {
+  var mgl = (this.__geometry && this.__geometry.mgl) ? this.__geometry.mgl : "";
+  this.loadGeometry(mgl, completeCallback);
+}
+
+
+/**
+ * Force redraw view from current geometry
+ */
 mathgl.Graph.prototype.redraw = function() {
        this.__renderStart();
 }
 
+
+/**
+ * Shutdown graph instance
+ * Destroy view, cleanup all timers and references
+ */
 mathgl.Graph.prototype.destroy = function() {
        // clear active timeouts
        for (var i = 0, l = this.__activeTimeoutHandlers.length; i<l; i++) {
@@ -660,21 +713,38 @@ mathgl.Graph.prototype.destroy = function() {
        this.__geometry = null;
 }
 
-/** @param type {String} data url type (e.g. "image/png") */
+
+/**
+ * Export image
+ * @param type {String} data url type (e.g. "image/png")
+ * @return {String} HTML Data URL containing graph image
+ **/
 mathgl.Graph.prototype.toDataURL = function(type) {
-       this.__canvas.toDataURL(type);
+       return this.__canvas.toDataURL(type);
 }
 
-/** Set perspective angle of view: @param val - degree of perspective in range 0...1 (0 - use default orthogonal projection)  */
+
+/**
+ * Set perspective angle of view
+ * @param val {Number} degree of perspective in range 0...1 (0 - use default orthogonal projection)
+ **/
 mathgl.Graph.prototype.setPerspective = function(val) {
        this.__fov = val;
 }
 
-/** Set maximal number of drawable points in draft mode */
+
+/**
+ * Set maximal number of drawable points in draft mode
+ **/
 mathgl.Graph.prototype.setMaxDraftPoints = function(count) {
        this.__maxDraftPoints = count;
 }
 
+
+/**
+ * Set delay between draft and precise rendering
+ * @param delayMillisec {Integer} delay in milliseconds
+ */
 mathgl.Graph.prototype.setPreciseRenderingDelay = function(delayMillisec) {
        this.__preciseRenderingDelay = delayMillisec;
 }
index e06cb4a90cd8a91f18edc496ed9daa2a58fd7cac..9291770f12b481b9eb44109f02958d8fbeabec92 100644 (file)
@@ -26,6 +26,8 @@ mathgl.View = function() {
        this.__pitch = 0;
        this.__yaw = 0;
        this.__theta = 0;
+       // by default pitch rotation is unlimited
+       this.__limitedPitchRotation = false;
 }
 
 
@@ -61,7 +63,12 @@ mathgl.View.prototype.attachCanvas = function(canvas) {
        this.__canvas.addEventListener("mouseup",   this.__onMouseUpFunc, false);
        this.__canvas.addEventListener("mouseout",  this.__onMouseOutFunc, false);
        this.__canvas.addEventListener("dblclick",  this.__onDblClickFunc, false);
-       this.__canvas.addEventListener("mousewheel",  this.__onMouseWheelFunc, false);
+//     this.__canvas.addEventListener("mousewheel",  this.__onMouseWheelFunc, false);
+       if ("onwheel" in document.createElement("div")) {
+               this.__canvas.addEventListener("wheel",  this.__onMouseWheelFunc, false);
+       } else {
+               this.__canvas.addEventListener("mousewheel",  this.__onMouseWheelFunc, false);
+       }
 
        // initiate redraw
        this.__renderLauncherFunc();
@@ -76,7 +83,12 @@ mathgl.View.prototype.detachCanvas = function() {
        this.__canvas.removeEventListener("mouseup", this.__onMouseUpFunc, false);
        this.__canvas.removeEventListener("mouseout", this.__onMouseOutFunc, false);
        this.__canvas.removeEventListener("dblclick", this.__onDblClickFunc, false);
-       this.__canvas.removeEventListener("mousewheel",  this.__onMouseWheelFunc, false);
+//     this.__canvas.removeEventListener("mousewheel",  this.__onMouseWheelFunc, false);
+       if ("onwheel" in document.createElement("div")) {
+               this.__canvas.removeEventListener("wheel",  this.__onMouseWheelFunc, false);
+       } else {
+               this.__canvas.removeEventListener("mousewheel",  this.__onMouseWheelFunc, false);
+       }
 
        // drop canvas
        this.__canvas = null;
@@ -145,34 +157,34 @@ mathgl.View.prototype.viewArea = function() {
 
 mathgl.View.prototype.__onMouseMove = function(e) {
        if (this.__isMouseDown) {
-               var x = e.offsetX;
-               var y = e.offsetY;
+               var x = e.layerX;
+               var y = e.layerY;
                this.__yaw += 0.5 * (this.__mouseX - x) * Math.PI / 180;
-//             if(Math.abs(Math.cos(this.__yaw))>0.3)
-                       this.__pitch += 0.5 * (y - this.__mouseY) * Math.PI / 180;
-//             else
-//                     this.__theta += 0.5 * (y - this.__mouseY) * Math.PI / 180;
+               this.__pitch += 0.5 * (y - this.__mouseY) * Math.PI / 180;
                this.__mouseX = x;
                this.__mouseY = y;
-               if(this.__pitch > 63)   this.__pitch -= 20*Math.PI;
-               if(this.__pitch < -63)  this.__pitch += 20*Math.PI;
+               if (this.__limitedPitchRotation) {
+                       this.__pitch = Math.min(this.__pitch, 0.999*Math.PI/2);
+                       this.__pitch = Math.max(this.__pitch, -0.999*Math.PI/2);
+               } else {
+                       if (this.__pitch > 63) this.__pitch -= 20*Math.PI;
+                       if (this.__pitch < -63) this.__pitch += 20*Math.PI;
+               }
+
                if(this.__yaw > 63)     this.__yaw -= 20*Math.PI;
                if(this.__yaw <-63)     this.__yaw += 20*Math.PI;
-//             this.__pitch = Math.min(this.__pitch, Math.PI / 2);
-//             this.__pitch = Math.max(this.__pitch, -Math.PI / 2);
 //             this.__yaw = Math.min(this.__yaw, Math.PI);
 //             this.__yaw = Math.max(this.__yaw, -Math.PI);
 
-               if(this.__onCameraChanged)
-                       this.__onCameraChanged(this.getViewpoint());
+    this.__notifyCameraChanged();
                this.__renderLauncherFunc();
        }
 }
 
 
 mathgl.View.prototype.__onMouseDown = function(e) {
-       this.__mouseX = e.offsetX;
-       this.__mouseY = e.offsetY;
+       this.__mouseX = e.layerX;
+       this.__mouseY = e.layerY;
        this.__isMouseDown = true;
 }
 
@@ -188,25 +200,37 @@ mathgl.View.prototype.__onMouseOut = function() {
 
 
 mathgl.View.prototype.__onDblClick = function(e) {
-       this.__pickPointHandlerFunc(e.offsetX, e.offsetY);
+       this.__pickPointHandlerFunc(e.layerX, e.layerY);
 }
 
 
 mathgl.View.prototype.__onMouseWheel = function(e) {
        this.__isMouseDown = false;
-       this.__distance -= 0.1 * e.wheelDelta / 120;
+//     this.__distance -= 0.1 * e.wheelDelta / 120;
+
+       var wheelSensivity = 0.1;
+       if (e.wheelDelta !== undefined) {
+               // handle deprecated 'mousewheel' event (old webkit in chrome and safari)
+               // wheelDelta is always 120 and inverted to standard deltaY
+               var direction = e.wheelDelta >= 0 ? -1 : 1;
+               this.__distance += -1. * wheelSensivity * direction;
+       } else if (e.deltaY !== undefined) {
+               // handle standard W3C DOM Level 3 'wheel' event
+               var direction = e.deltaY >= 0 ? -1 : 1;
+               this.__distance += wheelSensivity * direction;
+       }
+
        this.__distance = Math.min(this.__distance, 10.0);
        this.__distance = Math.max(this.__distance, 0.2);
-       if(this.__onCameraChanged)
-               this.__onCameraChanged(this.getViewpoint());
+  this.__notifyCameraChanged();
        this.__renderLauncherFunc();
 }
 
-mathgl.View.prototype.getViewpoint = function() { 
+mathgl.View.prototype.getViewpoint = function() {
        return { 
                distance : this.__distance, 
                pitch : this.__pitch, 
-               yaw : this.__yaw
+               yaw : this.__yaw
        }; 
 } 
 
@@ -227,5 +251,16 @@ mathgl.View.prototype.setCameraEventHandler = function(handler) {
        this.__onCameraChanged = handler; 
 }
 
+mathgl.View.prototype.__notifyCameraChanged = function() {
+       if(this.__onCameraChanged) {
+               this.__onCameraChanged(this.getViewpoint());
+       }
+}
 
-
+/**
+ * Limit the pitch control rotation to +-90 degrees
+ * @param limitedPitch {Boolean} enable or disable limit
+ */
+mathgl.View.prototype.setLimitedPitchRotation = function(limitedPitch) {
+       this.__limitedPitchRotation = limitedPitch;
+}
index fbc91a88a50beeee368e50fb5c998668cf0bad14..6b61570d214db57a8df82d8167da62e57876cfa6 100644 (file)
@@ -9,8 +9,12 @@ mathgl.WebkitBackend = function() {}
 mathgl.WebkitBackend.prototype = new mathgl.Backend();
 
 
-/** return geometry */
-mathgl.WebkitBackend.prototype.geometry = function(mgl) {
+/**
+ * Request for geometry data for given MGL script.
+ * @param mgl {String} MGL script to build geometry
+ * @param callback {Function} receiver of geometry must be a function(error, result)
+ */
+mathgl.WebkitBackend.prototype.geometry = function(mgl, callback) {
        var geometryData = globalBackend.geometry(mgl);
 
        /*
@@ -20,6 +24,9 @@ mathgl.WebkitBackend.prototype.geometry = function(mgl) {
         */
        
        var obj = JSON.parse(geometryData);
-       obj.pp = new Array();
-       return obj;
+
+  // simulate async reply
+  setTimeout(function() {
+    callback(null, obj);
+  }, 0);
 }
index 560e6566c44392fe50e8d5800149af577ef75093..cac7b7f21368f9b92bb27d7e2a36edbd11171a94 100644 (file)
@@ -20,35 +20,23 @@ if(NOT TEXMFLOCALDIR)
        message(SEND_ERROR "Couldn't find TEXMFLOCAL directory.")
 endif(NOT TEXMFLOCALDIR)
 
-set(extramgl Axis_projection Vectorial)
-
-add_custom_command(OUTPUT scripts
-    COMMAND ${CMAKE_COMMAND} -E make_directory ${MathGL_BINARY_DIR}/mgltex/scripts
-    COMMAND ${CMAKE_COMMAND} -E copy ${MathGL_SOURCE_DIR}/mgltex/sample.tex ${MathGL_BINARY_DIR}/mgltex/
-    COMMAND ${CMAKE_COMMAND} -E copy ${MathGL_SOURCE_DIR}/mgltex/mgltex.sty ${MathGL_BINARY_DIR}/mgltex/
-    COMMAND ${findpdflatex} -draftmode sample.tex
-)
-foreach(mglscr ${extramgl})
-       list(APPEND mglpng scripts/${mglscr}.png)
-       add_custom_command(OUTPUT scripts/${mglscr}.png
-               COMMAND mglconv -o ${mglscr}.png ${mglscr}.mgl
-               DEPENDS mglconv scripts
-               WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/mgltex/scripts/
-       )
-endforeach(mglscr)
-
-add_custom_command(OUTPUT scripts/sample.png
-       COMMAND mglconv -o scripts/sample.png scripts/sample.mgl
-       DEPENDS mglconv scripts
-)
+# set(extramgl Axis_projection Vectorial)
 
 add_custom_command(OUTPUT sample.pdf
-       COMMAND ${findpdflatex} sample.tex
-       DEPENDS mgltex.sty sample.tex ${mglpng} scripts/sample.png)
+       COMMAND ${CMAKE_COMMAND} -E make_directory ${MathGL_BINARY_DIR}/mgltex/MGL
+       COMMAND ${CMAKE_COMMAND} -E make_directory ${MathGL_BINARY_DIR}/mgltex/MGL/scripts
+       COMMAND ${CMAKE_COMMAND} -E make_directory ${MathGL_BINARY_DIR}/mgltex/MGL/backups
+       COMMAND ${CMAKE_COMMAND} -E make_directory ${MathGL_BINARY_DIR}/mgltex/MGL/graphics
+       COMMAND ${CMAKE_COMMAND} -E copy ${MathGL_SOURCE_DIR}/mgltex/sample.tex ${MathGL_BINARY_DIR}/mgltex/
+       COMMAND ${CMAKE_COMMAND} -E copy ${MathGL_SOURCE_DIR}/mgltex/mgltex.sty ${MathGL_BINARY_DIR}/mgltex/
+       COMMAND PATH=$<TARGET_FILE_DIR:mglconv> ${findpdflatex} --shell-escape -draftmode sample.tex
+       COMMAND PATH=$<TARGET_FILE_DIR:mglconv> ${findpdflatex} --shell-escape -draftmode sample.tex
+       COMMAND PATH=$<TARGET_FILE_DIR:mglconv> ${findpdflatex} --shell-escape sample.tex
+       DEPENDS mgltex.sty sample.tex )
 add_custom_target(pdf ALL DEPENDS sample.pdf)
 
 get_directory_property(mglconv_clean ADDITIONAL_MAKE_CLEAN_FILES)
-set(mglconv_clean ${mglconv_clean} scripts sample.sty sample.tex sample.aux sample.log)
+set(mglconv_clean ${mglconv_clean} scripts mgltex.sty sample.tex sample.aux sample.log)
 set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${mglconv_clean}")
 
 install(FILES mgltex.sty DESTINATION ${TEXMFLOCALDIR}/tex/latex/mgltex/)
index a4eb204aa67fd4dd7681a904dc6197f06a65cc38..642aa1e970325a033f2570cae4b8df8d73367e4d 100644 (file)
@@ -1,14 +1,6 @@
 %%
-%% This is file `mgltex.sty',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% mgltex.dtx  (with options: `package')
-%% 
-%% This is a generated file.
-%% 
-%% Copyright (C) 2014 by Diego Sejas <diego.mathematician@gmail.com>
+%% Copyright (C) 2015 by Diego Sejas Viscarra <diego.mathematician@gmail.com>
+%% Copyright (C) 2015 by Alexey Balakin <mathgl.abalakin@gmail.com>
 %% 
 %% This program is free software: you can redistribute it and/or modify it
 %% under the terms of the GNU General Public License as published by the
 %% 
 %% You should have received a copy of the GNU General Public License along
 %% with this program.  If not, see <http://www.gnu.org/licenses/>.
-%% 
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{mgltex}[/2014/11/22 v2.0 Embed MGL scripts in LaTeX documents]
+%%
 
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{mgltex}[/2015/03/29 v3.0 Embed MGL scripts in LaTeX documents]
 
 \RequirePackage{keyval}
 \RequirePackage{graphicx}
 
-
 \DeclareOption{draft}{%
   \PassOptionsToPackage{\CurrentOption}{graphicx}%
 }
 \DeclareOption{final}{%
   \PassOptionsToPackage{\CurrentOption}{graphicx}%
 }
-\newif\if@mgltex@on@
+
+\DeclareOption{epstopdf}{%
+  \DeclareGraphicsRule{.eps}{pdf}{.pdf}{`epstopdf #1}%
+}
+
 \DeclareOption{on}{%
-  \@mgltex@on@true%
-  \def\mgl@write#1#2{%
+  \def\MGL@openout#1#2{%
+    \immediate\openout#1="#2"%
+  }%
+  \def\MGL@write#1#2{%
     \immediate\write#1{#2}%
-  }
+  }%
+  \def\MGL@graph@not@found@text{MGL\\image\\not\\found}%
+  \def\MGL@graph@not@found@message{MGL image "\MGL@this@code@label" not found}%
 }
 \DeclareOption{off}{%
-  \@mgltex@on@false%
-  \def\mgl@write#1#2{}%
+  \def\MGL@openout#1#2{}%
+  \def\MGL@write#1#2{}%
+  \def\MGL@graph@not@found@text{\mglTeX\\is off,\\no image\\generated}%
+  \def\MGL@graph@not@found@message{mglTeX is off, MGL image "\MGL@this@code@label" not generated}%
 }
-\newif\if@mgl@comments@
+
+\newif\if@MGL@comments@
 \DeclareOption{comments}{%
-  \@mgl@comments@true%
+  \@MGL@comments@true%
 }
 \DeclareOption{nocomments}{%
-  \@mgl@comments@false%
+  \@MGL@comments@false%
 }
 
+\DeclareOption{1x}{\def\MGL@scale{1}}
+\DeclareOption{2x}{\def\MGL@scale{2}}
+\DeclareOption{3x}{\def\MGL@scale{3}}
+\DeclareOption{4x}{\def\MGL@scale{4}}
+\DeclareOption{5x}{\def\MGL@scale{5}}
+\DeclareOption{6x}{\def\MGL@scale{6}}
+\DeclareOption{7x}{\def\MGL@scale{7}}
+\DeclareOption{8x}{\def\MGL@scale{8}}
+\DeclareOption{9x}{\def\MGL@scale{9}}
+
 \DeclareGraphicsExtensions{%
   .png,.eps,.jpg,.jpeg,.bps,.pdf,.epsz,.eps.gz,.bpsz,.bps.gz,.gif%
 }
+\DeclareOption{jpg}{\def\MGL@graphics@ext{.jpg}}
+\DeclareOption{jpeg}{\def\MGL@graphics@ext{.jpeg}}
+\DeclareOption{pdf}{\def\MGL@graphics@ext{.pdf}}
+\DeclareOption{png}{\def\MGL@graphics@ext{.png}}
+\DeclareOption{eps}{\def\MGL@graphics@ext{.eps}}
+\DeclareOption{epsz}{\def\MGL@graphics@ext{.eps.gz}}
+\DeclareOption{bps}{\def\MGL@graphics@ext{.bps}}
+\DeclareOption{bpsz}{\def\MGL@graphics@ext{.bps.gz}}
+\DeclareOption{gif}{\def\MGL@graphics@ext{.gif}}
+\DeclareOption{tex}{\def\MGL@graphics@ext{.tex}}
 
-\DeclareOption{jpg}{\def\mgl@image@ext{.jpg}}
-\DeclareOption{jpeg}{\def\mgl@image@ext{.jpeg}}
-\DeclareOption{pdf}{\def\mgl@image@ext{.pdf}}
-\DeclareOption{png}{\def\mgl@image@ext{.png}}
-\DeclareOption{eps}{\def\mgl@image@ext{.eps}}
-\DeclareOption{epsz}{\def\mgl@image@ext{.eps.gz}}
-\DeclareOption{bps}{\def\mgl@image@ext{.bps}}
-\DeclareOption{bpsz}{\def\mgl@image@ext{.bps.gz}}
-\DeclareOption{gif}{\def\mgl@image@ext{.gif}}
-
-\DeclareOption{tex}{\def\mgl@image@ext{.tex}}
 \DeclareOption*{\@unknownoptionerror}
 
-\ExecuteOptions{final,on,nocomments,eps}
+\ExecuteOptions{final,on,nocomments,1x,eps}
 \ProcessOptions*
 
+\define@key{MGL@keys}{dir}{\def\MGL@dir{#1}}
+\define@key{MGL@keys}{scriptsdir}{\def\MGL@scripts@dir{#1}}
+\define@key{MGL@keys}{graphicsdir}{\def\MGL@graphics@dir{#1}}
+\define@key{MGL@keys}{backupsdir}{\def\MGL@backups@dir{#1}}
+\define@key{MGL@keys}{quality}{\def\MGL@quality{#1}}
+\define@key{MGL@keys}{width}{\def\MGL@width{#1}}
+\define@key{MGL@keys}{height}{\def\MGL@height{#1}}
+
 \define@key{mgl@keys}{bb}{\g@addto@macro{\graph@keys}{bb=#1,}}
 \define@key{mgl@keys}{bbllx}{\g@addto@macro{\graph@keys}{bbllx=#1,}}
 \define@key{mgl@keys}{bblly}{\g@addto@macro{\graph@keys}{bblly=#1,}}
 \define@key{mgl@keys}{ext}{\g@addto@macro{\graph@keys}{ext=#1,}}
 \define@key{mgl@keys}{read}{\g@addto@macro{\graph@keys}{read=#1,}}
 \define@key{mgl@keys}{command}{\g@addto@macro{\graph@keys}{command=#1,}}
-\define@key{mgl@keys}{imgext}{\def\mgl@image@ext{.#1}}
-
+\define@key{mgl@keys}{imgext}{\def\mgl@graphics@ext{.#1}}
 
 \define@key{mglplot@keys}{bb}{\g@addto@macro{\graph@keys}{bb=#1,}}
 \define@key{mglplot@keys}{bbllx}{\g@addto@macro{\graph@keys}{bbllx=#1,}}
 \define@key{mglplot@keys}{ext}{\g@addto@macro{\graph@keys}{ext=#1,}}
 \define@key{mglplot@keys}{read}{\g@addto@macro{\graph@keys}{read=#1,}}
 \define@key{mglplot@keys}{command}{\g@addto@macro{\graph@keys}{command=#1,}}
-\define@key{mglplot@keys}{imgext}{\def\mglplot@image@ext{.#1}}
+\define@key{mglplot@keys}{imgext}{\def\MGL@graphics@ext{.#1}}
 \define@key{mglplot@keys}{setup}{\def\mglplot@setup{#1}}
 
+\def\mglsettings#1{%
+  \setkeys{MGL@keys}{#1}%
+}
+\@onlypreamble\mglsettings
+
+\def\MGL@dir{}
+\def\mgldir#1{%
+  \def\MGL@dir{#1}%
+}
+\@onlypreamble\mgldir
+
+\def\MGL@scripts@dir{}
+\def\mglscriptsdir#1{%
+  \def\MGL@scripts@dir{#1}%
+}
+\@onlypreamble\mglscriptsdir
+
+\def\MGL@graphics@dir{}
+\def\mglgraphicsdir#1{%
+  \def\MGL@graphics@dir{#1}%
+}
+\@onlypreamble\mglscriptsdir
+
+\def\MGL@backups@dir{}
+\def\mglbackupsdir#1{%
+  \def\MGL@backups@dir{#1}%
+}
+\@onlypreamble\mglbackupsdir
 
 \def\TeX@ext{.tex}
-\def\mgl@include@image#1{%
-  \ifx\mgl@image@ext\TeX@ext%
-    \IfFileExists{#1.tex}{%
-      \include{#1}%
+\def\MGL@include@graphics{%
+  \ifx\MGL@graphics@ext\TeX@ext%
+    \IfFileExists{\MGL@this@code@label.tex}{%
+      \include{\MGL@dir\MGL@graphics@dir\MGL@this@code@label}%
     }{%
-      \mgl@img@not@found{#1}%
+      \MGL@graph@not@found%
     }%
   \else%
-  \def\next@action{\mgl@img@not@found{#1}}%
-    \@for\img@ext:=\Gin@extensions\do{%
-      \IfFileExists{#1\img@ext}{%
-        \def\next@action{%
-          \expandafter\includegraphics\expandafter[\graph@keys]{#1}%
+  \def\MGL@next@action{\MGL@graph@not@found}%
+    \@for\MGL@graph@ext:=\Gin@extensions\do{%b
+      \IfFileExists{\MGL@dir\MGL@graphics@dir\MGL@this@code@label\MGL@graph@ext}{%
+        \def\MGL@next@action{%
+          \expandafter\includegraphics\expandafter[\graph@keys]{\MGL@dir\MGL@graphics@dir\MGL@this@code@label}%
         }%
       }{}%
     }%
-    \next@action%
+    \MGL@next@action%
   \fi%
 }
-\def\mgl@img@not@found#1{%
-  \PackageWarning{mgltex}{MGL image "#1" not found}%
-  \framebox[10em]{%
+\def\MGL@graph@not@found{%
+  \PackageWarning{mgltex}{\MGL@graph@not@found@message}%
+  \fbox{%
     \centering%
     \bfseries\Huge%
-    \begin{tabular}{c}MGL\\image\\not\\found\end{tabular}%
+    \begin{tabular}{c}\MGL@graph@not@found@text\end{tabular}%
   }%
 }
 
-\newcounter{mgl@image@no}
-
-\newwrite\mgl@script
-\AtBeginDocument{%
-  \if@mgltex@on@%
-    \immediate\openout\mgl@script="\mgl@dir\jobname.mgl"%
-    \mglsignature@write\mgl@script%
+\def\MGL@openin#1#2{%
+  \immediate\openin#1="#2"%
+}
+\def\MGL@read#1#2{%
+  \def#2{}%
+  \ifeof#1\else%
+    \immediate\read#1 to #2%
   \fi%
 }
-\AtEndDocument{%
-  \mgl@write\mgl@script{}%
-  \mgl@write\mgl@script{stop}%
-  \mgl@func%
-  \immediate\closeout\mgl@script%
-  \mgl@write{18}{mglconv -n "\mgl@dir\jobname.mgl"}%
+\def\MGL@closein#1{%
+  \immediate\closein#1%
+}
+\def\MGL@closeout#1{%
+  \immediate\closeout#1%
 }
+\def\MGL@unchanged#1{%
+  \global\@namedef{MGL@@@#1}{}%
+}
+\def\MGL@scripts@written{}
+\def\MGL@funcs{}
 
+\newwrite\MGL@script
+\newread\MGL@in@stream
+\newwrite\MGL@out@stream
 
-\newcommand\mgl[1][]{%
+\AtBeginDocument{%
+  \MGL@openout{\MGL@script}{\MGL@dir\MGL@scripts@dir\jobname.mgl}%
+  \MGL@write\MGL@script{\MGL@signature}%
+}
+\AtEndDocument{%
+  \MGL@write\MGL@script{stop}%
+  \MGL@write\MGL@script{}%
+  \bgroup%
+    \endlinechar=-1\relax%
+    \MGL@funcs%
+  \egroup%
+  \MGL@closeout{\MGL@script}%
+  \MGL@write{18}{mglconv -n -q \MGL@quality\space -S \MGL@scale\space "\MGL@dir\MGL@scripts@dir\jobname.mgl"}%
+}
+
+%%%%% Anatomy of environments and commands %%%%%
+\def\MGL@setkeys#1#2{%
   \def\graph@keys{}%
-  \setkeys{mgl@keys}{#1}%
-  \let\do\@makeother \dospecials%
-  \endlinechar`\^^M \catcode`\^^M\active%
-  \catcode`\ =10%
-  \mgl@write\mgl@script{quality \mgl@quality}%
-  \expandafter\mgl@write@line%
+  \setkeys{#1}{#2}%
 }
-\begingroup%
-  \escapechar=-1 \relax%
-  \xdef\end@mgl{\string\\end\string\{mgl\string\}}%
-\endgroup
 
-\begingroup%
+\newcounter{MGL@script@no}
+\def\MGL@create@code@label{%
+  \stepcounter{MGL@script@no}%
+  \edef\MGL@this@code@label{\jobname-MGL-\arabic{MGL@script@no}}%
+  \xdef\MGL@scripts@written{\MGL@scripts@written\MGL@this@code@label,}%
+}
 
-  \catcode`\^^M\active%
-  \gdef\mgl@write@line#1^^M{%
-    \def\next@action{%
-      \mgl@write\mgl@script{#1}%
-      \mgl@write@line%
-    }%
-    \test@end@mgl{#1}%
-    \next@action%
+\def\MGL@test@code@label#1{%
+  \edef\MGL@this@code@label{#1}%
+  \@for\MGL@script@name:=\MGL@scripts@written\do{%
+    \ifx\MGL@this@code@label\MGL@script@name%
+      \PackageWarning{mgltex}{Overwriting MGL code labeled "\MGL@this@code@label"}%
+    \fi%
   }%
-\endgroup
+  \xdef\MGL@scripts@written{\MGL@scripts@written\MGL@this@code@label,}%
+}
 
-\def\test@end@mgl#1{%
-  \edef\this@line{#1}%
-  \ifx\this@line\end@mgl%
-    \def\next@action{\end{mgl}}%
+\def\MGL@codes{%
+  \let\do\@makeother\dospecials\relax%
+  \endlinechar`\^^M \catcode`\^^M\active\relax%
+  \catcode`\ =10\relax%
+}
+\def\MGL@verb@codes{%
+  \let\do\@makeother\dospecials\relax%
+  \endlinechar`\^^M\relax\catcode`\^^M\active\relax%
+}
+
+\def\MGL@test@end@env#1{%
+  \edef\MGL@this@line{#1}%
+  \ifx\MGL@this@line\MGL@end@env@cmd%
+    \def\MGL@next@action{\MGL@end@env}%
   \fi%
 }
-\def\endmgl{%
-  \stepcounter{mgl@image@no}%
-  \mgl@write\mgl@script{%
-    write '\mgl@dir\jobname-mgl-\arabic{mgl@image@no}\mgl@image@ext'%
+
+\def\MGL@def@end@env@cmd#1{%
+  \def\MGL@end@env{\end{#1}}%
+  \begingroup%
+    \escapechar=-1 \relax%
+    \xdef\MGL@end@env@cmd{\string\\end\string\{#1\string\}}%
+  \endgroup%
+}
+
+\def\MGL@set@write@script@out{%
+  \def\MGL@write@code@action##1{%
+    \MGL@write\MGL@script{##1}%
+    \MGL@write\MGL@out@stream{##1}%
+  }%
+}
+\def\MGL@set@write@script{%
+  \def\MGL@write@code@action##1{%
+    \MGL@write\MGL@script{##1}%
+  }%
+}
+\def\MGL@set@write@out{%
+  \def\MGL@write@code@action##1{%
+    \MGL@write\MGL@out@stream{##1}%
+  }%
+}
+\begingroup%
+  \catcode`\^^M\active\relax%
+  \gdef\MGL@ignore@line#1^^M{%
+    \expandafter\MGL@write@line%
   }%
-  \mgl@write\mgl@script{reset}%
-  \mgl@write\mgl@script{}%
-  \mgl@include@image{\mgl@dir\jobname-mgl-\arabic{mgl@image@no}}%
-}
-
-\bgroup%
-  \escapechar=-1\relax%
-  \xdef\end@mgladdon{\string\\end\string\{mgladdon\string\}}%
-\egroup%
-\newenvironment{mgladdon}{%
-  \def\test@end@mgl##1{%
-    \edef\this@line{##1}%
-    \ifx\this@line\end@mgladdon%
-      \def\next@action{\end{mgladdon}}%
+  \gdef\MGL@write@line#1^^M{%
+    \def\MGL@next@action{%
+      \MGL@write@code@action{#1}%
+      \MGL@write@line%
+    }%
+    \MGL@test@end@env{#1}%
+    \MGL@next@action%
+  }%
+  \gdef\MGL@compare@line#1^^M{%
+    \def\MGL@next@action{%
+      \def\MGL@this@line{#1^^M}%
+      \MGL@read\MGL@in@stream{\MGL@this@code@line}%
+      \ifx\MGL@this@code@line\MGL@this@line\else%
+        \def\MGL@future@action{}%
+      \fi%
+      \MGL@compare@line%
+    }%
+    \edef\MGL@this@line{#1}%
+    \ifx\MGL@this@line\MGL@end@env@cmd%
+      \def\MGL@next@action{\MGL@end@env}%
+      \MGL@read\MGL@in@stream{\MGL@this@code@line}%
+      \ifeof\MGL@in@stream\else%
+        \def\MGL@future@action{}%
+      \fi%
     \fi%
+    \MGL@next@action%
   }%
-  \mgl[]%
-}{}
+\endgroup
 
-\def\mgl@script@written{}
-\newwrite\mgl@out@stream
-\newcommand\mglcode[2][]{%
-  \def\graph@keys{}%
-  \setkeys{mgl@keys}{#1}%
-  \test@mgl@script@written{#2}%
-  \xdef\mgl@script@written{\mgl@script@written#2,}%
-  \def\this@script{#2}%
-  \if@mgltex@on@%
-    \immediate\openout\mgl@out@stream=\mgl@dir\this@script.mgl%
-    \mglsignature@write\mgl@out@stream%
-  \fi%
-  \let\do\@makeother \dospecials%
-  \endlinechar`\^^M \catcode`\^^M\active%
-  \obeyspaces%
-  \expandafter\mglcode@write@line%
+\def\MGL@set@write@verb@out{%
+  \def\MGL@write@verb@code@action{%
+    \MGL@write\MGL@out@stream{\the\MGL@line}%
+  }%
 }
-\def\test@mgl@script@written#1{%
-  \edef\this@script{#1}%
-  \@for\mgl@script@name:=\mgl@script@written\do{%
-    \ifx\this@script\mgl@script@name%
-      \PackageWarning{mgltex}{Overwriting MGL script "\this@script.mgl"}%
-    \fi%
+\def\MGL@set@write@verb@to@doc{%
+  \def\MGL@write@verb@code@action{%
+    \stepcounter{MGL@verb@line@no}%
+    \item\mbox{\the\MGL@line}%
   }%
 }
-\newtoks\mgl@word
-\newtoks\mgl@line
-\def\mglcode@write@line#1{%
-  \let\next@action\mglcode@write@line%
+\begingroup%
+  \catcode`\^^M\active\relax%
+  \gdef\MGL@ignore@verb@line#1^^M{%
+    \expandafter\MGL@write@verb@line%
+  }
+\endgroup%
+\newtoks\MGL@word
+\newtoks\MGL@line
+\def\MGL@write@verb@line#1{%
+  \let\MGL@next@action\MGL@write@verb@line%
   \expandafter\if#1\^^M%
-    \mgl@write\mgl@out@stream{\the\mgl@line}%
-    \mgl@word{}%
-    \mgl@line{}%
+    \MGL@write@verb@code@action%
+    \MGL@word{}%
+    \MGL@line{}%
   \else\expandafter\if#1\space%
-    \mgl@word{}%
-    \mgl@line\expandafter{\the\mgl@line#1}%
+    \MGL@word{}%
+    \MGL@line\expandafter{\the\MGL@line#1}%
   \else%
-    \mgl@word\expandafter{\the\mgl@word#1}%
-    \mgl@line\expandafter{\the\mgl@line#1}%
-    \test@end@mglcode{\the\mgl@word}%
+    \MGL@word\expandafter{\the\MGL@word#1}%
+    \MGL@line\expandafter{\the\MGL@line#1}%
+    \MGL@test@end@env{\the\MGL@word}%
   \fi\fi%
-  \next@action%
+  \MGL@next@action%
 }
-\begingroup%
-  \escapechar=-1\relax%
-  \xdef\end@mglcode{\string\\end\string\{mglcode\string\}}%
-\endgroup%
-\def\test@end@mglcode#1{%
-  \edef\this@word{#1}%
-  \ifx\this@word\end@mglcode%
-    \def\next@action{\end{mglcode}}%
+\def\MGL@rewrite@code#1{%
+  \MGL@read\MGL@in@stream{\MGL@this@code@line}%
+  \ifeof\MGL@in@stream%
+    \MGL@closein{\MGL@in@stream}%
+  \else%
+    \MGL@write#1{\MGL@this@code@line}%
+    \MGL@rewrite@code{#1}%
   \fi%
 }
-\def\endmglcode{%
-  \immediate\closeout\mgl@out@stream%
-  \mgl@write{18}{%
-    mglconv "\mgl@dir\this@script.mgl" -s "\mgl@dir\mglcommonscript.mgl" -o "\mgl@dir\this@script\mgl@image@ext"%
+\begingroup%
+  \catcode`\^^M\active\relax%  
+  \gdef\MGL@compare@next@verb@line#1^^M{%
+    \expandafter\MGL@compare@verb@line%
   }%
-  \mgl@include@image{\mgl@dir\this@script}%
-}
-
-\bgroup%
-  \escapechar=-1\relax%
-  \xdef\end@mglscript{\string\\end\string\{mglscript\string\}}%
-\egroup%
-\newenvironment{mglscript}[1]{%
-  \def\test@end@mglcode##1{%
-    \edef\this@word{##1}%
-    \ifx\this@word\end@mglscript%
-      \def\next@action{\end{mglscript}}%
+\endgroup
+\def\MGL@compare@verb@line#1{%
+  \let\MGL@next@action\MGL@compare@verb@line%
+  \expandafter\if#1\^^M%
+    \MGL@line\expandafter{\the\MGL@line#1}%
+    \MGL@read\MGL@in@stream{\MGL@this@code@line}%
+    \edef\MGL@this@line{\the\MGL@line}%
+    \ifx\MGL@this@line\MGL@this@code@line\else%
+      \def\MGL@future@action{}%
     \fi%
-  }%
-  \mglcode{#1}%
-}{%
-  \immediate\closeout\mgl@out@stream%
+    \MGL@word{}%
+    \MGL@line{}%
+  \else\expandafter\if#1\space%
+    \MGL@word{}%
+    \MGL@line\expandafter{\the\MGL@line#1}%
+  \else%
+    \MGL@word\expandafter{\the\MGL@word#1}%
+    \MGL@line\expandafter{\the\MGL@line#1}%
+    \edef\MGL@this@line{\the\MGL@word}%
+    \ifx\MGL@this@line\MGL@end@env@cmd%
+      \def\MGL@next@action{\MGL@end@env}%
+      \MGL@read\MGL@in@stream{\MGL@this@code@line}%
+      \ifeof\MGL@in@stream\else%
+        \def\MGL@future@action{}%
+      \fi%
+    \fi%
+  \fi\fi%
+  \MGL@next@action%
 }
+\newcounter{MGL@verb@line@no}
+\def\MGL@prepare@verb@env{%
+  \setcounter{MGL@verb@line@no}{0}%
+  \list{\itshape\footnotesize\arabic{MGL@verb@line@no}.}{}%
+  \setlength{\labelsep}{1em}%
+  \itemsep\z@skip%
+  \leftskip\z@skip\rightskip\z@skip%
+  \parindent\z@\parfillskip\@flushglue\parskip\z@skip%
+  \MGL@verb@codes%
+  \obeyspaces%
+  \verbatim@font%
+}
+\def\MGL@rewrite@code@verb{%
+  \stepcounter{MGL@verb@line@no}%
+  \MGL@read\MGL@in@stream{\MGL@this@code@line}%
+  \ifeof\MGL@in@stream%
+    \def\MGL@next@action{%
+      \MGL@closein{\MGL@in@stream}%
+      \endlist%
+    }%
+  \else%
+    \def\MGL@next@action{%
+      \item\mbox{\MGL@this@code@line}%
+      \MGL@rewrite@code@verb%
+    }%
+  \fi%
+  \MGL@next@action%
+}
+%%%%% Anatomy of environments and commands %%%%%
 
-\def\mglfunc@defined{}
-\def\mgl@func{}
-
-\newcommand\mglfunc[2][0]{%
-  \test@mglfunc@defined{#2}%
-  \g@addto@macro{\mglfunc@defined}{#2,}%
-  \let\do\@makeother \dospecials%
-  \endlinechar`\^^M \catcode`\^^M\active%
-  \catcode`\ =10%
-  \g@addto@macro{\mgl@func}{\mgl@write\mgl@script{}}%
-  \g@addto@macro{\mgl@func}{\mgl@write\mgl@script{func '#2' #1}}%
-  \expandafter\mglfunc@write@line%
-}
-\def\test@mglfunc@defined#1{%
-  \def\this@func{#1}%
-  \@for\mglfunc@name:=\mglfunc@defined\do{%
-    \ifx\this@func\mglfunc@name%
-      \PackageWarning{\mgl@name}{MGL function "#1" has multiple definitions}%
-    \fi%
+\newcommand\mgl[1][]{%
+  \MGL@setkeys{mgl@keys}{#1}%
+  \MGL@create@code@label%
+  \MGL@codes%
+  \MGL@def@end@env@cmd{mgl}%
+  \def\MGL@future@action{%
+    \MGL@write\@auxout{\string\MGL@unchanged{\MGL@this@code@label}}%
+  }%
+  \MGL@set@write@script@out%
+  \@ifundefined{MGL@@@\MGL@this@code@label}{%
+    \MGL@write\MGL@script{quality \MGL@quality}%
+    \MGL@write\MGL@script{setsize \MGL@width\space\MGL@height}%
+    \MGL@openout{\MGL@out@stream}{\MGL@dir\MGL@backups@dir\MGL@this@code@label.mgl.backup}%
+    \def\MGL@save@action{%
+      \MGL@write\MGL@script{write '\MGL@dir\MGL@graphics@dir\MGL@this@code@label\MGL@graphics@ext'}%
+      \MGL@write\MGL@script{reset}%
+      \MGL@write\MGL@script{}%
+    }
+    \expandafter\MGL@write@line%
+  }{%
+    \def\MGL@save@action{}%
+    \MGL@openin{\MGL@in@stream}{\MGL@dir\MGL@backups@dir\MGL@this@code@label.mgl.backup}%
+    \expandafter\MGL@compare@line%
   }%
 }
-\begingroup%
-  \catcode`\^^M\active%
-  \gdef\mglfunc@write@line#1^^M{%
-    \def\next@action{%
-      \g@addto@macro{\mgl@func}{\mgl@write\mgl@script{#1}}%
-      \expandafter\mglfunc@write@line%
+\def\endmgl{%
+  \MGL@closeout{\MGL@out@stream}%
+  \MGL@closein{\MGL@in@stream}%
+  \MGL@save@action%
+  \MGL@future@action%
+  \MGL@include@graphics%
+}
+
+\def\mgladdon{%
+  \MGL@codes%
+  \MGL@def@end@env@cmd{mgladdon}%
+  \MGL@set@write@out%
+  \MGL@set@write@script%
+  \expandafter\MGL@write@line%
+}
+\def\endmgladdon{%
+  \MGL@write\MGL@script{}%
+}
+
+\newcommand\mglcode[2][]{%
+  \MGL@setkeys{mgl@keys}{#1}%
+  \MGL@test@code@label{#2}%
+  \MGL@verb@codes%
+  \MGL@def@end@env@cmd{mglcode}%
+  \@ifundefined{MGL@@@\MGL@this@code@label}{%
+    \def\MGL@future@action{%
+      \MGL@write{18}{%
+        mglconv -q \MGL@quality\space -S \MGL@scale\space -s "\MGL@dir\MGL@scripts@dir\mglcommonscript.mgl" -o "\MGL@dir\MGL@graphics@dir\MGL@this@code@label\MGL@graphics@ext" "\MGL@dir\MGL@scripts@dir\MGL@this@code@label.mgl"%
+      }%
+      \MGL@write\@auxout{\string\MGL@unchanged{\MGL@this@code@label}}%
+    }%
+    \MGL@set@write@verb@out%
+    \MGL@openout{\MGL@out@stream}{\MGL@dir\MGL@backups@dir\MGL@this@code@label.mgl.backup}%
+    \expandafter\MGL@ignore@verb@line%
+  }{%
+    \def\MGL@future@action{%
+      \MGL@write\@auxout{\string\MGL@unchanged{\MGL@this@code@label}}%
     }%
-    \test@end@mglfunc{#1}%
-    \next@action%
+    \MGL@openin{\MGL@in@stream}{\MGL@dir\MGL@backups@dir\MGL@this@code@label.mgl.backup}%
+    \expandafter\MGL@compare@next@verb@line%
   }%
-\endgroup
-\begingroup%
-  \escapechar=-1 \relax%
-  \xdef\end@mglfunc{\string\\end\string\{mglfunc\string\}}%
-\endgroup
-\def\test@end@mglfunc#1{%
-  \edef\this@line{#1}%
-  \ifx\this@line\end@mglfunc%
-    \def\next@action{\end{mglfunc}}%
-  \fi%
+}
+\def\endmglcode{%
+  \MGL@closeout{\MGL@out@stream}%
+  \MGL@closein{\MGL@in@stream}%
+  \bgroup%
+    \endlinechar=-1\relax%
+    \MGL@openin{\MGL@in@stream}{\MGL@dir\MGL@backups@dir\MGL@this@code@label.mgl.backup}%
+    \MGL@openout{\MGL@out@stream}{\MGL@dir\MGL@scripts@dir\MGL@this@code@label.mgl}%
+    \MGL@write\MGL@out@stream{\MGL@signature}%
+    \MGL@rewrite@code{\MGL@out@stream}%
+    \MGL@closein{\MGL@in@stream}%
+    \MGL@closeout{\MGL@out@stream}%
+  \egroup%
+  \MGL@future@action%
+  \MGL@include@graphics%
+}
+
+\def\mglscript#1{%
+  \MGL@test@code@label{#1}%
+  \MGL@verb@codes%
+  \MGL@def@end@env@cmd{mglscript}%
+  \MGL@set@write@verb@out%
+  \MGL@openout{\MGL@out@stream}{\MGL@dir\MGL@scripts@dir\MGL@this@code@label.mgl}%
+  \MGL@write\MGL@out@stream{\MGL@signature}%
+  \expandafter\MGL@ignore@verb@line%
+}
+\def\endmglscript{%
+  \MGL@closeout{\MGL@out@stream}%
+}
+
+\newcommand\mglfunc[2][0]{%
+  \MGL@test@code@label{#2}%
+  \MGL@codes%
+  \MGL@def@end@env@cmd{mglfunc}%
+  \MGL@openout{\MGL@out@stream}{\MGL@dir\MGL@backups@dir\MGL@this@code@label.mgl.backup}%
+  \MGL@write\MGL@out@stream{func #2 #1}%
+  \g@addto@macro{\MGL@funcs}{\MGL@rewrite@func{#2}}%
+  \MGL@set@write@out%
+  \expandafter\MGL@ignore@line%
 }
 \def\endmglfunc{%
-  \g@addto@macro{\mgl@func}{\mgl@write\mgl@script{return}}%
+  \MGL@write\MGL@out@stream{return}%
+  \MGL@write\MGL@out@stream{}%
+  \MGL@closeout{\MGL@out@stream}%
+}
+\def\MGL@rewrite@func#1{%
+  \MGL@openin{\MGL@in@stream}{\MGL@dir\MGL@backups@dir#1.mgl.backup}%
+  \MGL@rewrite@code{\MGL@script}%
 }
 
+\def\mglverbatim{%
+  \MGL@def@end@env@cmd{mglverbatim}%
+  \MGL@prepare@verb@env%
+  \MGL@set@write@verb@to@doc
+  \expandafter\MGL@ignore@verb@line%
+}
+\def\endmglverbatim{\endlist}
 
-\def\mglcommonscript{mgl_common_script}
-\bgroup%
-  \escapechar=-1\relax%
-  \xdef\end@mglcommon{\string\\end\string\{mglcommon\string\}}%
-\egroup%
-\newenvironment{mglcommon}{%
-  \def\test@end@mglcode##1{%
-    \edef\this@word{##1}%
-    \ifx\this@word\end@mglcommon%
-      \def\next@action{\end{mglcommon}}%
-    \fi%
+\def\mglblock#1{%
+  \MGL@test@code@label{#1}%
+  \MGL@verb@codes%
+  \obeyspaces%
+  \MGL@def@end@env@cmd{mglblock}%
+  \MGL@set@write@verb@out%
+  \MGL@openout{\MGL@out@stream}{\MGL@dir\MGL@scripts@dir\MGL@this@code@label.mgl}%
+  \MGL@write\MGL@out@stream{\MGL@signature}%
+  \expandafter\MGL@ignore@verb@line%
+}
+\def\endmglblock{%
+  \MGL@closeout{\MGL@out@stream}%
+  \mglinclude{\MGL@this@code@label}%
+}
+
+\def\mglinclude#1{%
+  \bgroup%
+    \MGL@prepare@verb@env%
+    \MGL@openin{\MGL@in@stream}{\MGL@dir\MGL@scripts@dir#1.mgl}%
+    \MGL@rewrite@code@verb%
+  \egroup%
+}
+
+\newcommand\mglgraphics[2][]{%
+  \MGL@setkeys{mgl@keys}{#1}%
+  \edef\MGL@this@code@label{#2}%
+  \IfFileExists{\MGL@dir\MGL@graphics@dir\MGL@this@code@label\MGL@graphics@ext}{}{%
+    \MGL@write{18}{mglconv -q \MGL@quality\space -S \MGL@scale\space -s "\MGL@dir\MGL@scripts@dir\mglcommonscript.mgl" -o "\MGL@dir\MGL@graphics@dir\MGL@this@code@label\MGL@graphics@ext" "\MGL@dir\MGL@scripts@dir\MGL@this@code@label.mgl"}
   }%
-  \mglcode{\mglcommonscript}%
-}{%
-  \mgl@write\mgl@out@stream{quality \mgl@quality}%
-  \immediate\closeout\mgl@out@stream%
+  \MGL@write\@auxout{\string\MGL@unchanged{\MGL@this@code@label}}%
+  \MGL@include@graphics%
+}
+
+\def\mglcommonscript{common_script}
+\def\mglcommon{%
+  \MGL@test@code@label{\mglcommonscript}%
+  \MGL@codes%
+  \MGL@def@end@env@cmd{mglcommon}%
+  \MGL@set@write@out%
+  \MGL@openout{\MGL@out@stream}{\MGL@dir\MGL@scripts@dir\MGL@this@code@label.mgl}%
+  \MGL@write\MGL@out@stream{\MGL@signature}%
+  \MGL@write\MGL@out@stream{quality \MGL@quality}%
+  \MGL@write\MGL@out@stream{setsize \MGL@width\space\MGL@height}%
+  \expandafter\MGL@ignore@line%
 }
 \@onlypreamble\mglcommon
-\bgroup
-  \catcode`#=12
-  \gdef\mglcomm{#}
-\egroup
-\def\mgltexsignature{%
-  \mglcomm^^J%
-  \mglcomm\space This file was autogenerated from the document \jobname.tex on date \today^^J%
-  \mglcomm%
-}
-\newcommand\mglsignature{%
-  \def\mgltexsignature{}%
-  \let\do\@makeother \dospecials%
-  \endlinechar`\^^M \catcode`\^^M\active%
-  \@vobeyspaces%
-  \expandafter\mglsignature@write@line%
-}
-\begingroup%
-  \escapechar=-1 \relax%
-  \xdef\end@mglsignature{\string\\end\string\{mglsignature\string\}}%
-\endgroup
-\begingroup%
-  \catcode`\^^M\active%
-  \gdef\mglsignature@write@line#1^^M{%
-    \def\next@action{%
-      \g@addto@macro{\mgltexsignature}{\mglcomm\space#1^^J}
-      \mglsignature@write@line%
+\def\endmglcommon{%
+  \MGL@closeout\MGL@out@stream%
+  \bgroup%
+    \endlinechar=-1\relax%
+    \MGL@openin{\MGL@in@stream}{\MGL@dir\MGL@scripts@dir\MGL@this@code@label.mgl}%
+    \MGL@openout{\MGL@out@stream}{\MGL@dir\MGL@backups@dir\MGL@this@code@label.mgl.backup}%
+    \MGL@rewrite@code{\MGL@out@stream}%
+    \MGL@closein{\MGL@in@stream}%
+    \MGL@closeout{\MGL@out@stream}%
+  \egroup%
+}
+
+\def\MGL@setups@written{}
+\def\mglsetup#1{%
+  \MGL@test@code@label{#1}%
+  \xdef\MGL@setups@written{\MGL@setups@written\MGL@this@code@label,}
+  \g@addto@macro{\MGL@funcs}{\MGL@rewrite@func{#1}}%
+  \MGL@codes%
+  \MGL@def@end@env@cmd{mglsetup}%
+  \MGL@openout{\MGL@out@stream}{\MGL@dir\MGL@backups@dir\MGL@this@code@label.mgl.backup}%
+  \MGL@write\MGL@out@stream{func #1}%
+  \MGL@set@write@out%
+  \expandafter\MGL@ignore@line%
+}
+\def\endmglsetup{%
+  \MGL@write\MGL@out@stream{return}%
+  \MGL@write\MGL@out@stream{}%
+  \MGL@closeout{\MGL@out@stream}%
+}
+
+\def\mglplot@call@setup{%
+  \ifx\mglplot@setup\@empty\else%
+    \def\MGL@future@action{%
+      \PackageWarning{mgltex}{No "\mglplot@setup" setup for \string\mglplot}%
+    }%
+    \@for\MGL@setup:=\MGL@setups@written\do{%
+      \ifx\MGL@setup\mglplot@setup%
+        \MGL@write\MGL@script{call '\mglplot@setup'}%
+        \MGL@write\MGL@out@stream{\mglplot@setup}%
+        \def\MGL@future@action{}%
+      \fi%
     }%
-    \test@end@mglsignature{#1}%
-    \next@action%
-  }%
-\endgroup
-\def\test@end@mglsignature#1{%
-  \edef\this@line{#1}%
-  \ifx\this@line\end@mglsignature%
-    \def\next@action{\end{mglsignature}}%
   \fi%
 }
-\def\endmglsignature{%
-  \g@addto@macro{\mgltexsignature}{\mglcomm}
-}
-\def\mglsignature@write#1{\mgl@write#1{\mgltexsignature}}
+
+\newcommand\mglplot[2][]{%
+  \bgroup%
+    \def\mglplot@setup{}%
+    \MGL@setkeys{mglplot@keys}{#1}%
+    \MGL@create@code@label%
+    \@ifundefined{MGL@@@\MGL@this@code@label}{%
+      \MGL@write\MGL@script{quality \MGL@quality}%
+      \MGL@write\MGL@script{setsize \MGL@width\space\MGL@height}%
+      \MGL@openout{\MGL@out@stream}{\MGL@dir\MGL@backups@dir\MGL@this@code@label.mgl.backup}%
+      \mglplot@call@setup%
+      \MGL@write\MGL@script{#2}%
+      \MGL@write\MGL@out@stream{#2}%
+      \MGL@closeout{\MGL@out@stream}%
+      \MGL@write\MGL@script{write '\MGL@dir\MGL@graphics@dir\MGL@this@code@label\MGL@graphics@ext'}%
+      \MGL@write\MGL@script{reset}%
+      \MGL@write\MGL@script{}%
+      \MGL@write\@auxout{\string\MGL@unchanged{\MGL@this@code@label}}%
+    }{%
+      \endlinechar=-1\relax%
+      \MGL@openin{\MGL@in@stream}{\MGL@dir\MGL@backups@dir\MGL@this@code@label.mgl.backup}%
+      \ifx\mglplot@setup\@empty\else%
+        \MGL@read\MGL@in@stream{\MGL@this@code@line}%
+        \ifx\MGL@this@code@line\mglplot@setup%
+          \MGL@read\MGL@in@stream{\MGL@this@code@line}%
+          \edef\MGL@this@line{#2}%
+          \ifx\MGL@this@code@line\MGL@this@line%
+            \MGL@write\@auxout{\string\MGL@unchanged{\MGL@this@code@label}}%
+          \fi%
+        \fi%
+      \fi%
+      \MGL@closein{\MGL@in@stream}
+    }%
+  \egroup%
+}%
 
 \def\mglcomment{%
-  \let\do\@makeother\dospecials%
-  \obeylines%
-  \@vobeyspaces%
+  \MGL@codes%
   \verbatim@font%
   \small%
   \mgl@comment%
 \begingroup%
   \catcode`|=0\catcode`[= 1\catcode`]=2\catcode`\{=12\catcode`\}=12\catcode`\\=12%
   |gdef|mgl@comment#1\end{mglcomment}[%
-    |if@mgl@comments@%
+    |if@MGL@comments@%
       |begin[center]%
         <------------------ MGL comment ------------------>%
         #1%
 |endgroup%
 \def\endmglcomment{}
 
-
-\def\mglsetup@defined{}
-\newcommand\mglsetup[1][generic]{%
-  \test@mglsetup@defined{#1}%
-  \g@addto@macro{\mglsetup@defined}{#1,}%
-  \expandafter\def\csname mgl@setup@#1\endcsname{\mgl@write\mgl@script{}}%
-  \expandafter\def\csname mgl@setup@#1\endcsname{\mgl@write\mgl@script{quality \mgl@quality}}%
-  \let\do\@makeother \dospecials%
-  \endlinechar`\^^M \catcode`\^^M\active%
-  \catcode`\ =10%
-  \expandafter\mglsetup@write@line%
-}
-\def\test@mglsetup@defined#1{%
-  \def\this@setup{#1}%
-  \@for\mglsetup@name:=\mglsetup@defined\do{%
-    \ifx\this@mglsetup\mglsetup@name%
-      \PackageWarning{\mgl@name}{Redefining "#1" setup for \noexpand\mglplot}%
-    \fi%
-  }%
-}
+\def\MGL@signature{}
 \begingroup%
-  \catcode`\^^M\active%
-  \gdef\mglsetup@write@line#1^^M{%
-    \def\next@action{%
-      \expandafter\g@addto@macro\csname mgl@setup@\this@setup\endcsname{%
-        \mgl@write\mgl@script{#1}%
-      }%
-      \expandafter\mglsetup@write@line%
-    }%
-    \test@end@mglsetup{#1}%
-    \next@action%
-  }%
-\endgroup
-\begingroup%
-  \escapechar=-1 \relax%
-  \xdef\end@mglsetup{\string\\end\string\{mglsetup\string\}}%
+  \catcode`#=12\relax%
+  \gdef\MGL@comm@sym{#}
 \endgroup
-\def\test@end@mglsetup#1{%
-  \edef\this@line{#1}%
-  \ifx\this@line\end@mglsetup%
-    \def\next@action{\end{mglsetup}}%
-  \fi%
-}
-\def\endmglsetup{}
-
-
-\def\mglplot{%
-  \@ifnextchar[{\@mglplot}{\@mglplot[]}%
-}
-\def\@mglplot[#1]{%
-  \def\mglplot@setup{generic}%
-  \def\graph@keys{}%
-  \setkeys{mglplot@keys}{#1}%
-  \stepcounter{mgl@image@no}%
-  \ifx\csname mgl@setup@\mglplot@setup\endcsname\@undefined%
-    \PackageError{\mgl@name}{Setup "\mglplot@setup" undefined}{}%
-  \else%
-    \csname mgl@setup@\mglplot@setup\endcsname%
-  \fi%
-  \@@mglplot%
-}
-\long\def\@@mglplot#1{%
-  \mgl@write\mgl@script{\detokenize{#1}}%
-  \mgl@write\mgl@script{%
-    write '\mgl@dir\jobname-mgl-\arabic{mgl@image@no}\mgl@image@ext'%
-  }%
-  \mgl@write\mgl@script{reset}%
-  \mgl@include@image{\mgl@dir\jobname-mgl-\arabic{mgl@image@no}}%
-}
-
-\newcounter{mgl@verb@line@no}
-
-\def\mglverbatim{%
-  \setcounter{mgl@verb@line@no}{0}%
-  \list{\itshape\footnotesize\arabic{mgl@verb@line@no}.}{}%
-  \setlength{\labelsep}{1em}%
-  \itemsep\z@skip%
-  \leftskip\z@skip\rightskip\z@skip%
-  \parindent\z@\parfillskip\@flushglue\parskip\z@skip%
-  \let\do\@makeother \dospecials%
-  \endlinechar`\^^M \catcode`\^^M\active%
+\def\mglsignature{%
+  \MGL@verb@codes%
   \obeyspaces%
-  \verbatim@font%
-  \expandafter\mglverbatim@ignore@line%
+  \MGL@def@end@env@cmd{mglsignature}%
+  \def\MGL@write@code@action##1{\g@addto@macro{\MGL@signature}{\MGL@comm@sym\space##1^^J}}%
+  \catcode`|=0\relax\catcode`[=1\relax\catcode`]=2\relax%
+  \expandafter\MGL@ignore@line%
 }
-\def\mglverbatim@ignore@line#1{%
-  \expandafter\mglverbatim@write@line%
-}
-\def\mglverbatim@write@line#1{%
-  \let\next@action\mglverbatim@write@line%
-  \expandafter\if#1\^^M%
-    \stepcounter{mgl@verb@line@no}%
-    \item\mbox{\the\mgl@line}%
-    \mgl@word{}%
-    \mgl@line{}%
-  \else\expandafter\if#1\space%
-    \mgl@word{}%
-    \mgl@line\expandafter{\the\mgl@line#1}%
-  \else%
-    \mgl@word\expandafter{\the\mgl@word#1}%
-    \mgl@line\expandafter{\the\mgl@line#1}%
-    \test@end@mglverbatim{\the\mgl@word}%
-  \fi\fi%
-  \next@action%
-}
-\begingroup%
-  \escapechar=-1\relax%
-  \xdef\end@mglverbatim{\string\\end\string\{mglverbatim\string\}}%
-\endgroup%
-\def\test@end@mglverbatim#1{%
-  \edef\this@word{#1}%
-  \ifx\this@word\end@mglverbatim%
-    \def\next@action{\end{mglverbatim}}%
-  \fi%
-}
-\def\endmglverbatim{\endlist}
+\def\endmglsignature{}
 
-\def\mglblock#1{%
-  \test@mgl@script@written{#1}%
-  \xdef\mgl@script@written{\mgl@script@written#1,}%
-  \let\do\@makeother \dospecials%
-  \endlinechar`\^^M \catcode`\^^M\active%
-  \obeyspaces%
-  \def\this@script{#1}%
-  \if@mgltex@on@%
-    \immediate\openout\mgl@out@stream="\mgl@dir\this@script.mgl"%
-    \mglsignature@write\mgl@out@stream%
-  \fi%
-  \expandafter\mglblock@write@line%
-}
-\def\mglblock@write@line#1{%
-  \let\next@action\mglblock@write@line%
-  \expandafter\if#1\^^M%
-    \mgl@write\mgl@out@stream{\the\mgl@line}%
-    \mgl@word{}%
-    \mgl@line{}%
-  \else\expandafter\if#1\space%
-    \mgl@word{}%
-    \mgl@line\expandafter{\the\mgl@line#1}%
-  \else%
-    \mgl@word\expandafter{\the\mgl@word#1}%
-    \mgl@line\expandafter{\the\mgl@line#1}%
-    \test@end@mglblock{\the\mgl@word}%
-  \fi\fi%
-  \next@action%
-}
-\begingroup%
-  \escapechar=-1\relax%
-  \xdef\end@mglblock{\string\\end\string\{mglblock\string\}}%
-\endgroup%
-\def\test@end@mglblock#1{%
-  \edef\this@word{#1}%
-  \ifx\this@word\end@mglblock%
-    \def\next@action{\end{mglblock}}%
-  \fi%
-}
-\newread\mgl@in@stream
-\def\endmglblock{%
-  \immediate\closeout\mgl@out@stream%
-  \immediate\openin\mgl@in@stream="\mgl@dir\this@script.mgl"%
-  \begingroup%
-  \list{\itshape\footnotesize\arabic{mgl@verb@line@no}.}{}%
-  \setlength{\labelsep}{1em}%
-  \itemsep\z@skip%
-  \leftskip\z@skip\rightskip\z@skip%
-  \parindent\z@\parfillskip\@flushglue\parskip\z@skip%
-  \verbatim@font%
-  \@vobeyspaces%
-  \mglblock@read@line%
-}
-\def\mglblock@read@line{%
-  \stepcounter{mgl@verb@line@no}%
-  \read\mgl@in@stream to \this@line%
-  \ifeof\mgl@in@stream%
-    \def\next@action{%
-      \immediate\closein\mgl@in@stream%
-      \endlist%
-      \endgroup%
-    }%
+\def\MGL@quality{2}
+\def\mglquality#1{%
+  \def\MGL@quality{#1}%
+  \ifcase#1
+    \PackageInfo{mgltex}{Quality 0: No face drawing (fastest)}%
+  \or%
+    \PackageInfo{mgltex}{Quality 1: No color interpolation (fast)}%
+  \or%
+    \PackageInfo{mgltex}{Quality 2: High quality (normal)}%
+  \or%
+    \PackageInfo{mgltex}{Quality 3: High quality with 3d primitives (not implemented yet)}%
+  \or%
+    \PackageInfo{mgltex}{Quality 4: No face drawing, direct bitmap drawing (low memory usage)}%
+  \or%
+    \PackageInfo{mgltex}{Quality 5: No color interpolation, direct bitmap drawing (low memory usage)}%
+  \or%
+    \PackageInfo{mgltex}{Quality 6: High quality, direct bitmap drawing (low memory usage)}%
+  \or%
+    \PackageInfo{mgltex}{Quality 7: High quality with 3d primitives, direct bitmap drawing (not implemented yet)}%
+  \or%
+    \PackageInfo{mgltex}{Quality 8: Draw dots instead of primitives (extremely fast)}%
   \else%
-    \def\next@action{%
-      \item\mbox{\this@line}%
-      \mglblock@read@line%
-    }%
+    \PackageWarning{mgltex}{Quality #1 not available. Using default (2)}%
   \fi%
-  \next@action%
-}
-
-\newcommand\mglgraphics[2][]{%
-  \def\graph@keys{}%
-  \setkeys{mgl@keys}{#1}%
-  \mgl@write{18}{mglconv "\mgl@dir#2.mgl" -s "\mgl@dir\mglcommonscript.mgl" -o "\mgl@dir#2\mgl@image@ext"}
-  \mgl@include@image{\mgl@dir#2}%
-}
-
-\def\mglinclude#1{%
-  \setcounter{mgl@verb@line@no}{0}%
-  \immediate\openin\mgl@in@stream="\mgl@dir#1.mgl"%
-  \begingroup%
-  \list{\itshape\footnotesize\arabic{mgl@verb@line@no}.}{}%
-  \setlength{\labelsep}{1em}%
-  \itemsep\z@skip%
-  \leftskip\z@skip\rightskip\z@skip%
-  \parindent\z@\parfillskip\@flushglue\parskip\z@skip%
-  \let\do\@makeother \dospecials%
-  \endlinechar`\^^M \catcode`\^^M\active%
-  \@vobeyspaces%
-  \verbatim@font%
-  \mglblock@read@line%
 }
+\@onlypreamble\mglquality
 
-\def\mgl@dir{}
-\def\mgldir#1{%
-  \def\mgl@dir{#1}%
-}
-\@onlypreamble\mgldir
-\def\mgl@quality{2}
-\def\mglquality#1{%
-  \def\mgl@quality{#1}%
-  \if@mgltex@on@%
-    \immediate\openout\mgl@out@stream="\mgl@dir\mglcommonscript.mgl"%
-    \mgl@write\mgl@out@stream{quality #1}%
-    \immediate\closeout\mgl@out@stream%
-    \ifcase#1
-      \PackageInfo{mgltex}{Quality 0: No face drawing (fastest)}%
-    \or%
-      \PackageInfo{mgltex}{Quality 1: No color interpolation (fast)}%
-    \or%
-      \PackageInfo{mgltex}{Quality 2: High quality (normal)}%
-    \or%
-      \PackageInfo{mgltex}{Quality 3: High quality with 3d primitives (not implemented yet)}%
-    \or%
-      \PackageInfo{mgltex}{Quality 4: No face drawing, direct bitmap drawing (low memory usage)}%
-    \or%
-      \PackageInfo{mgltex}{Quality 5: No color interpolation, direct bitmap drawing (low memory usage)}%
-    \or%
-      \PackageInfo{mgltex}{Quality 6: High quality, direct bitmap drawing (low memory usage)}%
-    \or%
-      \PackageInfo{mgltex}{Quality 7: High quality with 3d primitives, direct bitmap drawing (not implemented yet)}%
-    \or%
-      \PackageInfo{mgltex}{Quality 8: Draw dots instead of primitives (extremely fast)}%
-    \else%
-      \PackageWarning{mgltex}{Quality #1 not available. Using default (2)}%
-    \fi%
-  \else%
-    \PackageWarning{mgltex}{mglTeX is off, quality changes won't have effect}%
-  \fi%
+\def\MGL@width{640}
+\def\MGL@height{480}
+\def\mglsetsize#1#2{%
+  \def\MGL@width{#1}%
+  \def\MGL@height{#2}%
 }
+\@onlypreamble\mglsetsize
 
 \def\mgltexon{
-  \@mgltex@on@true
-  \def\mgl@write##1##2{%
+  \def\MGL@openout##1##2{%
+    \immediate\openout##1="##2"%
+  }%
+  \def\MGL@write##1##2{%
     \immediate\write##1{##2}%
-  }
+  }%
+  \def\MGL@graph@not@found@text{MGL\\image\\not\\found}%
+  \def\MGL@graph@not@found@message{MGL image "\MGL@this@code@label" not found}%
 }
 \def\mgltexoff{%
-  \@mgltex@on@false
-  \def\mgl@write##1##2{}%
+  \def\MGL@openout##1##2{}%
+  \def\MGL@write##1##2{}%
+  \def\MGL@graph@not@found@text{\mglTeX\\is off,\\no image\\generated}%
+  \def\MGL@graph@not@found@message{mglTeX is off, MGL image "\MGL@this@code@label" not generated}%
 }
 
 \def\mglcomments{
-  \@mgl@comments@true
+  \@MGL@comments@true%
 }
 \def\mglnocomments{%
-  \@mgl@comments@false
+  \@MGL@comments@false%
 }
 
-\def\mglTeX{mgl\TeX}
-
-\endinput
-%%
-%% End of file `mgltex.sty'.
+\def\mglTeX{mgl\TeX}
\ No newline at end of file
index 5fe94f8e39a0eefc87619eb7b5f3e5ae55cd7e08..0fe9dc2a39575797138fe5169d7fe7a8a65936d1 100644 (file)
@@ -1,16 +1,25 @@
 \documentclass{article}
 
-\usepackage[png,comments]{mgltex}
+\usepackage[jpg,comments]{mgltex}
 
 \title{\mglTeX{} package example}
 \author{Diego Sejas Viscarra, Alexey Balakin}
 \date{\today}
-\mgldir{scripts/}
+
+\mgldir{MGL/}
+\mglscriptsdir{scripts/}
+\mglgraphicsdir{graphics/}
+\mglbackupsdir{backups/}
 
 \begin{mglcommon}
   define gravity 9.81
 \end{mglcommon}
 
+\begin{mglsignature}
+  This scripts was generated on date |today.
+\end{mglsignature}
+
+
 \begin{document}
   
 \maketitle
@@ -50,11 +59,13 @@ As an alternative to this method of declaring signatures, the user can manually
   \item Any \LaTeX{} command can be used in this case.
 \end{itemize}
   For example, the default signature:
+  \begin{mglcomment}
   \begin{quote}\small
     \mglcomm\\
     \mglcomm\ This script was generated from $<$document$>$.mgl on date $<$today$>$\\
     \mglcomm
   \end{quote}
+  \end{mglcomment}
   can be achieved with
   \begin{verbatim}
     \def\mgltexsignature{%
@@ -66,7 +77,7 @@ As an alternative to this method of declaring signatures, the user can manually
 \item[mglcomment]
   Used to contain multiline commentaries. This commentaries will be visible/invisible in the output document, depending on the use of the package options \texttt{comments} and \texttt{nocomments} (see above), or the \texttt{\mglcomments} and \texttt{\mglnocomments} commands (see bellow).
   
-  When, bisible, the comment will appear like this:
+  When, visible, the comment will appear like this:
   \begin{center}
     \makeatletter
     \verbatim@font
@@ -371,32 +382,31 @@ An example of usage of \texttt{\textbackslash{}mglplot} command would be:
 \end{figure}
 \end{verbatim}
 
-\begin{mglsetup}
+\begin{mglsetup}{generic}
   box '@{W9}' : axis
 \end{mglsetup}
-\begin{mglsetup}[2d]
+\begin{mglsetup}{2d}
   box : axis
   grid 'xy' ';k'
 \end{mglsetup}
-\begin{mglsetup}[3d]
+\begin{mglsetup}{3d}
   rotate 50 60
   box : axis : grid 'xyz' ';k'
 \end{mglsetup}
 \begin{figure}[!ht]
   \centering
-  \mglplot[scale=0.5]{new a 200 'sin(pi*x)':plot a '2B'}
+  \mglplot[scale=0.5,setup=generic]{new a 200 'x' : fplot 'sin(pi*x)' '2R' : plot a '2B'}
 \end{figure}
 \begin{figure}[!ht]
   \centering
-  \mglplot[scale=0.5,setup=2d]{
-    fplot 'sin(pi*x)' '2B' :
-    fplot 'cos(pi*x^2)' '2R'
+  \mglplot[scale=0.5,setup=2d]{%
+    fplot 'sin(pi*x)' '2B' :%
+    fplot 'cos(pi*x^2)' '2R'%
   }
 \end{figure}
 \begin{figure}[!ht]
   \centering
-  \mglplot[width=0.5 \textwidth, setup=3d]
-  {fsurf 'sin(pi*x)+cos(pi*y)'}
+  \mglplot[width=0.5\textwidth, setup=3d]{fsurf 'sin(pi*x)+cos(pi*y)'}
 \end{figure}
 
 As an additional feature, when an image is not found or cannot be included, instead of issuing an error, \texttt{mgltex} prints a box with the word \emph{'MGL image not found'} in the LaTeX document.
@@ -459,7 +469,4 @@ The result is:
   \end{mgl}
 \end{figure}
 \mgltexon
-
-
-
 \end{document}
\ No newline at end of file
index 484368a822f180a76c0d55229052d2f332523a66..504e7a8c11ba9fef6994aa2c868ef2f6b3cf5e76 100644 (file)
@@ -4,7 +4,7 @@ set(mgl_src
        data.cpp data_io.cpp data_ex.cpp data_png.cpp
        export_2d.cpp export_3d.cpp eval.cpp evalp.cpp exec.cpp export.cpp
        fit.cpp font.cpp obj.cpp other.cpp parser.cpp pde.cpp pixel.cpp
-       plot.cpp prim.cpp surf.cpp tex_table.cpp vect.cpp volume.cpp evalc.cpp
+       plot.cpp prim.cpp surf.cpp tex_table.cc vect.cpp volume.cpp evalc.cpp
        s_hull/s_hull_pro.cpp window.cpp
 )
 
index d1185f07cca2dc5910e80eab3e8bce302cafa5d6..9537f09a9ca3bef1d9a1ac575309aa434835c83f 100644 (file)
@@ -45,13 +45,13 @@ void MGL_EXPORT mgl_strcls(char *str)
        delete []tmp;
 }
 //-----------------------------------------------------------------------------
-long MGL_EXPORT_PURE mgl_strpos(const char *str,char *fnd)
+long MGL_EXPORT mgl_strpos(const char *str,char *fnd)
 {
        const char *p=strstr(str,fnd);
        return p?p-str:-1L;
 }
 //-----------------------------------------------------------------------------
-long MGL_EXPORT_PURE mgl_chrpos(const char *str,char ch)
+long MGL_EXPORT mgl_chrpos(const char *str,char ch)
 {
        const char *p=str?strchr(str,ch):0;
        return p?p-str:-1L;
index 30bc0892fad322990f3e1d1c34972ca54c193b6d..0bdacba278912d2521cc0e455f1cca07c1499151 100644 (file)
@@ -22,6 +22,7 @@
 #include "mgl2/data.h"
 #include "mgl2/canvas.h"
 #include "mgl2/prim.h"
+#include "mgl2/eval.h"
 std::wstring MGL_EXPORT mgl_ftoa(double v, const char *fmt);
 //-----------------------------------------------------------------------------
 MGL_NO_EXPORT inline struct tm *mgl_localtime (const time_t *clock, tm *result, bool use_utc)
@@ -29,7 +30,7 @@ MGL_NO_EXPORT inline struct tm *mgl_localtime (const time_t *clock, tm *result,
        const tm *res = use_utc?gmtime(clock):localtime(clock);
        memcpy(result,res,sizeof(tm));  return result;  }
 //-----------------------------------------------------------------------------
-long MGL_EXPORT_PURE mgl_have_color(const char *stl)
+long MGL_EXPORT mgl_have_color(const char *stl)
 {
        long j=0;
        if(stl) for(long i=0;stl[i];i++)
@@ -50,7 +51,7 @@ void MGL_EXPORT mgl_wcstrim(wchar_t *str)
        str[i-k]=0;
 }
 //-----------------------------------------------------------------------------
-size_t MGL_EXPORT_PURE mgl_wcslen(const wchar_t *str)
+size_t MGL_EXPORT mgl_wcslen(const wchar_t *str)
 {
        long i=0;
        if(str) while(str[i])   i++;
@@ -259,7 +260,7 @@ void mglCanvas::SetTickTime(char dir, mreal d, const char *t)
        MGL_TO_WCS(t,aa.t=wcs);
 
        if(strchr("xyztuvw",aa.ch))
-               aa.org = mglPoint(GetOrgX(aa.ch,aa.inv), GetOrgY(aa.ch,aa.inv), GetOrgZ(aa.ch,aa.inv));
+               aa.org.Set(GetOrgX(aa.ch,aa.inv), GetOrgY(aa.ch,aa.inv), GetOrgZ(aa.ch,aa.inv));
        if(aa.ch=='x')  aa.v0 = aa.org.x;
        if(aa.ch=='y')  aa.v0 = aa.org.y;
        if(aa.ch=='z')  aa.v0 = aa.org.z;
@@ -305,7 +306,7 @@ void mglCanvas::AdjustTicks(mglAxis &aa, bool ff)
        {
                d /= -aa.d;
                long n = floor(log10(d));
-               int k = int(d*pow(10.,-n)+0.5);
+               int k = mgl_int(d*pow(10.,-n));
                aa.dv = pow(10.,n)*k;
                aa.o=0; aa.ds = pow(10.,n);
        }
@@ -379,7 +380,7 @@ std::wstring MGL_NO_EXPORT mgl_tick_text(mreal z, mreal z0, mreal d, mreal v, in
 //     mglprintf(str,64,fmt.c_str(), u);
        if(ff)
        {
-               if(str==L"-1" || str==L"+1" || str==L"−1")    str = str[0] + fact;
+               if(str==L"-1" || str==L"+1" || str==L"\u22121") str = str[0] + fact;
                else if(str==L"1")      str = fact;
                else if(str!=L"0")      str += fact;
        }
@@ -389,7 +390,7 @@ std::wstring MGL_NO_EXPORT mgl_tick_text(mreal z, mreal z0, mreal d, mreal v, in
 void mglCanvas::LabelTicks(mglAxis &aa)
 {
        if(strchr("xyztuvw",aa.ch))
-               aa.org = mglPoint(GetOrgX(aa.ch,aa.inv), GetOrgY(aa.ch,aa.inv), GetOrgZ(aa.ch,aa.inv));
+               aa.org.Set(GetOrgX(aa.ch,aa.inv), GetOrgY(aa.ch,aa.inv), GetOrgZ(aa.ch,aa.inv));
        if(aa.ch=='x')  aa.v0 = aa.org.x;
        if(aa.ch=='y')  aa.v0 = aa.org.y;
        if(aa.ch=='z')  aa.v0 = aa.org.z;
@@ -410,7 +411,7 @@ void mglCanvas::LabelTicks(mglAxis &aa)
                        if(d==0)        wcscpy(buf,L"1");
                        else if(d==1)   wcscpy(buf,L"10");
                        else if(d>0)    mglprintf(buf,64,L"10^{%d}",d);
-                       else    mglprintf(buf,64,minus?L"10^{-%d}":L"10^{%d}",-d);
+                       else    mglprintf(buf,64,minus?L"10^{-%d}":L"10^{\u2212%d}",-d);
                        if(d%ds!=0)     *buf=0; //      remove too often log ticks
                        aa.AddLabel(buf,v);
                }
@@ -422,10 +423,10 @@ void mglCanvas::LabelTicks(mglAxis &aa)
                for(v=v0;v>=aa.v1*MGL_EPSILON;v*=10)    if(v*MGL_EPSILON<=aa.v2)
                {
                        d = int(floor(0.1+log10(-v)));
-                       if(d==0)        wcscpy(buf,minus?L"-1":L"1");
-                       else if(d==1)   wcscpy(buf,minus?L"-10":L"10");
-                       else if(d>0)    mglprintf(buf,64,minus?L"-10^{%d}":L"10^{%d}",d);
-                       else    mglprintf(buf,64,minus?L"-10^{-%d}":L"−10^{−%d}",-d);
+                       if(d==0)        wcscpy(buf,minus?L"-1":L"\u22121");
+                       else if(d==1)   wcscpy(buf,minus?L"-10":L"\u221210");
+                       else if(d>0)    mglprintf(buf,64,minus?L"-10^{%d}":L"\u221210^{%d}",d);
+                       else    mglprintf(buf,64,minus?L"-10^{-%d}":L"\u221210^{\u2212%d}",-d);
                        if(d%ds!=0)     *buf=0; //      remove too often log ticks
                        aa.AddLabel(buf,v);
                }
@@ -452,7 +453,8 @@ void mglCanvas::LabelTicks(mglAxis &aa)
                                aa.AddLabel(mgl_tick_text(v,v0,aa.dv/100,w,kind,aa.fact,aa.d,aa.stl.c_str()),v);
                        else    for(v=v0;v<=v1;v+=aa.dv)
                        {
-                               mglprintf(buf, 64, aa.t.c_str(), fabs(v)<aa.dv/100 ? 0 : v);
+                               if(aa.t[0]!='&')        mglprintf(buf, 64, aa.t.c_str(), fabs(v)<aa.dv/100 ? 0 : v);
+                               else    mglprintf(buf, 64, aa.t.c_str()+1, mgl_int(fabs(v)<aa.dv/100 ? 0 : v));
                                mgl_wcstrim(buf);       aa.AddLabel(buf,v);
                        }
                }
@@ -492,9 +494,9 @@ void mglCanvas::Axis(const char *dir, const char *stl, const char *opt)
        if((TernAxis&3))
        {
                mglAxis ty(ay);         ty.pos='t';     ty.ch='T';
-               ty.dir = mglPoint(-1,1);                ty.org = mglPoint(1,0,ay.org.z);
+               ty.dir.Set(-1,1);               ty.org.Set(1,0,ay.org.z);
                DrawAxis(ty, text, arr, stl, angl);     ty.ch='t';
-               ty.dir = mglPoint(0,-1);                ty.org = mglPoint(0,1,ay.org.z);
+               ty.dir.Set(0,-1);               ty.org.Set(0,1,ay.org.z);
                DrawAxis(ty, text, arr, stl, angl);
        }
        else if(strchr(dir,'Y') || strchr(dir,'y'))
@@ -506,17 +508,16 @@ void mglCanvas::DrawAxis(mglAxis &aa, bool text, char arr,const char *stl,mreal
 {
        aa.angl = angl;
        if(strchr("xyz",aa.ch))
-               aa.org = mglPoint(GetOrgX(aa.ch,aa.inv), GetOrgY(aa.ch,aa.inv), GetOrgZ(aa.ch,aa.inv));
+               aa.org.Set(GetOrgX(aa.ch,aa.inv), GetOrgY(aa.ch,aa.inv), GetOrgZ(aa.ch,aa.inv));
        if(aa.ch=='x')  aa.v0 = aa.org.x;
        if(aa.ch=='y')  aa.v0 = aa.org.y;
        if(aa.ch=='z')  aa.v0 = aa.org.z;
 
-       mglPoint d = aa.dir, o = aa.org, q(NAN);        // "transverse" org
+       mglPoint d(aa.dir), o(aa.org), q(NAN);  // "transverse" org
        if(strchr("xyz",aa.ch)) o -= d*(o*d);
        mglPoint av=(Min+Max)/2, dv,da,db, p;
-       dv = mglPoint(mgl_sign((av.x-o.x)*(Max.x-Min.x)), mgl_sign((av.y-o.y)*(Max.y-Min.y)), mgl_sign((av.z-o.z)*(Max.z-Min.z)));
+       dv.Set(mgl_sign(av.x-o.x), mgl_sign(av.y-o.y), mgl_sign(av.z-o.z));
        da = aa.a*(dv*aa.a);    db = aa.b*(dv*aa.b);
-       if(aa.v2<aa.v1) {       da *= -1;       db *= -1;       }
 
        long k1,k2;
        bool have_color=mgl_have_color(stl);
@@ -570,95 +571,95 @@ void mglCanvas::DrawAxis(mglAxis &aa, bool text, char arr,const char *stl,mreal
 //-----------------------------------------------------------------------------
 void mglCanvas::DrawLabels(mglAxis &aa, bool inv, const mglMatrix *M)
 {
+       if(M==0)        M=&B;
        if(strchr("xyz",aa.ch))
-               aa.org = mglPoint(GetOrgX(aa.ch,aa.inv), GetOrgY(aa.ch,aa.inv), GetOrgZ(aa.ch,aa.inv));
-       mglPoint d = aa.dir, o = aa.org;        // "transverse" org
+               aa.org.Set(GetOrgX(aa.ch,aa.inv), GetOrgY(aa.ch,aa.inv), GetOrgZ(aa.ch,aa.inv));
+       if(aa.ch=='x')  aa.v0 = aa.org.x;
+       if(aa.ch=='y')  aa.v0 = aa.org.y;
+       if(aa.ch=='z')  aa.v0 = aa.org.z;
+
+       mglPoint d(aa.dir), o(aa.org), q(NAN);  // "transverse" org
        if(strchr("xyz",aa.ch)) o -= d*(o*d);
-       mglPoint p,q, s=(Min+Max)/2, nn;
-       s = s - d*(s*d);
-       if(M==0)        M=&B;
+       mglPoint s=(Min+Max)/2, dv(mgl_sign(s.x-o.x), mgl_sign(s.y-o.y), mgl_sign(s.z-o.z));
+       mglPoint a = aa.a*(dv*aa.a) + aa.b*(dv*aa.b);
+       if(aa.ch=='c')  a = aa.a;
 
-       register long i,n = aa.txt.size();
-       char pos[4]="t:C";
-       if(aa.ch=='c')  pos[0]=(aa.ns==0 || aa.ns==3)?'t':'T';
-       if(aa.ch=='T')  pos[0]='T';
-       mreal *w=new mreal[n], h = TextHeight(FontDef,-1), c=NAN, l=NAN, tet=0, v, vv;  // find sizes
+       long n = aa.txt.size();
+       mreal *w=new mreal[n];
        long *kk=new long[n];
-       for(i=0;i<n;i++)
+       for(long i=0;i<n;i++)   // fill base label properties
        {
                w[i] = TextWidth(aa.txt[i].text.c_str(),FontDef,-1);
                kk[i] = AddPnt(M, o+d*aa.txt[i].val,-1,d,0,7);
-               if(kk[i]>=0)
-               {
-                       mglPnt &pp = Pnt[kk[i]];
-                       if(pp.u<0 || (pp.u==0 && pp.v<0))
-                       {       pp.u=-pp.u;     pp.v=-pp.v;     pp.w=-pp.w;     }
-               }
        }
-
-       for(l=0,c=INFINITY,i=0;i<n-1;i++)
+       mreal c=INFINITY, l=0, h = TextHeight(FontDef,-1);      // find sizes
+       for(long i=0;i<n-1;i++)
        {
                // exclude factors
                if(aa.ch!='c' && (aa.txt[i].val<aa.v1 || aa.txt[i+1].val<aa.v1 || aa.txt[i].val>aa.v2 || aa.txt[i+1].val>aa.v2))
                        continue;
                if(kk[i]<0 || kk[i+1]<0)        continue;
-               v = (GetPntP(kk[i+1])-GetPntP(kk[i])).norm();   // distance between ticks
-               vv = (w[i]+w[i+1])/2;   // length of labels
+               mreal v = (GetPntP(kk[i+1])-GetPntP(kk[i])).norm();     // distance between ticks
+               mreal vv = (w[i]+w[i+1])/2;     // length of labels
                if(v>0 && l < vv/v)     l = vv/v;
                if(c>v) c = v;
        }
-       if(mgl_isnum(aa.angl))  // manual rotation
+       h /= c;
+
+       mreal tet=0;
+       if(mgl_isnum(aa.angl))  tet = aa.angl*M_PI/180; // manual rotation
+       else if(get(MGL_ENABLE_RTEXT) && get(MGL_TICKS_ROTATE) && l>1)  // try rotate first
        {
-               tet = aa.angl*M_PI/180;
-               mreal s = sin(tet);
-               if(s>0)
-               {       pos[2]=(aa.ch=='c' && !inv)?'R':'L';    l=0.99*h/s/c;
-                       for(i=0;i<n;i++)        w[i]=l*c;       }
-               else if(s<0)
-               {       pos[2]=(aa.ch=='c' && !inv)?'L':'R';    l=-0.99*h/s/c;
-                       for(i=0;i<n;i++)        w[i]=l*c;       }
+               mreal t1 = 1.1*h<1 ? asin(1.1*h) : M_PI/2;
+               mreal r2 = l*l+h*h;
+               mreal t2 = r2*1.21>1 ? asin((l*sqrt(r2-1/1.21)+h/1.1)/r2):M_PI/2;
+               tet = t1<t2 ? t1:t2;
        }
-       else if(get(MGL_ENABLE_RTEXT) && get(MGL_TICKS_ROTATE) && l>1 && c>0)   // try rotate first
-       {       tet = c>1.1*h ? asin(1.1*h/c) : M_PI/2; pos[2]=(aa.ch=='c' && !inv)?'R':'L';
-               l=0.99*h/sin(tet)/c;    for(i=0;i<n;i++)        w[i]=l*c;       }
-       // TODO: do clever points exclusion (i.e. longest and so on)
-       long k = get(MGL_TICKS_SKIP) ? 1+l : 1;
-       if(n>0) for(i=0;i<n;i++)
+       mreal sn = sin(tet);
+       if(sn)
        {
-               if(kk[i]<0)     continue;
-               c = aa.txt[i].val;
-               if(get(MGL_NO_ORIGIN) && c==aa.v0)      continue;
-               if(c>aa.v1 && c<aa.v2 && i%k!=0)        continue;
-               p = o+d*c;      nn = (s-o)/(Max-Min);   ScalePoint(&B,p,nn);
-               mglPnt &qq = Pnt[kk[i]];
-               mreal ux=qq.u*cos(tet) + qq.v*sin(tet), uy=qq.v*cos(tet) - qq.u*sin(tet);
-               if(ux==0)       uy = fabs(uy);
-               qq.u = ux;      qq.v = uy;
-
-               if((!get(MGL_ENABLE_RTEXT) || tet) && nn.x!=0)
+               mreal l1=h/fabs(sn), l2=fabs(l*cos(tet)+h*sn);
+               l = l2>l1?l1:l2;
+       }
+       char *align=new char[n], *up=new char[n];
+       for(long i=0;i<n;i++)   if(kk[i]>=0)    // select proper align
+       {
+               mglPoint p(a),r(o+d*aa.txt[i].val);
+               ScalePoint(M, r, p, false);
+               mglPnt &pp = Pnt[kk[i]];
+               mreal ux=pp.u*cos(tet) + pp.v*sin(tet), uy=pp.v*cos(tet) - pp.u*sin(tet);
+               bool algn = tet!=0;
+               if(!get(MGL_ENABLE_RTEXT) || !get(MGL_TICKS_ROTATE))    {       ux=1;   uy=0;   algn=true;      }
+               if(ux<0 || (ux==0 && uy<0))     {       ux=-ux; uy=-uy; pp.w=-pp.w;     }
+               pp.u = ux;      pp.v = uy;
+               mreal pu = p.x*ux+p.y*uy, pv = p.y*ux-p.x*uy; /*, su = ps.x*ux+ps.y*uy;*/
+               if(aa.ch!='c')  up[i] = ((pv>0) ^ inv) ? 'T':'t'; 
+               else            up[i]=(aa.ns==0 || aa.ns==3)?'t':'T';
+               int t=0;
+               if(algn)
                {
-                       if(aa.ch!='c') pos[2] = nn.x<0 ? 'L':'R';
-                       else    pos[2] = aa.ns==1?'L':'R';//  nn.x<0 ? 'R':'L';
+                       if(aa.ch!='c')  t= (pu==0)?0:(pu<0? -1:1);
+                       else    t=inv?-1:1;
                }
-//             if((!get(MGL_ENABLE_RTEXT) || tet) && nn.x!=0 && aa.ch=='c')    pos[2] = nn.x<0 ? 'R':'L';
-//             if((!get(MGL_ENABLE_RTEXT) || tet) && nn.x!=0 && aa.ch!='c')    pos[2] = nn.x<0 ? 'L':'R';
-               if(aa.ch=='c' && aa.txt[i].text[0]==' ')        qq.u = qq.v = NAN;
-               int ts = 1;
-               if(!get(MGL_DISABLE_SCALE))     ts = mgl_sign(qq.v*nn.x-qq.u*nn.y)*mgl_sign(aa.v2-aa.v1);
-               if(aa.ch=='c')  ts=inv?-1:1;    // use manual settings by inv argument
-               if(aa.ch=='T')  ts *= -1;
-               if(aa.pos=='T') ts *= -1;
-               pos[0] = ts>0 ? 't':'T';
-               if(ts>0 && tet && nn.x==0)      pos[2]='R';
-               text_plot(kk[i], aa.txt[i].text.c_str(), pos, -1, aa.sh+0.1,CDef,tet?false:true);
+               char val[3]={'L','C','R'};      align[i] = val[t+1];
+       }
+       long k = get(MGL_TICKS_SKIP) ? 1+l : 1;
+
+       for(long i=0;i<n;i++)   if(kk[i]>=0)
+       {
+               mreal v = aa.txt[i].val;
+               if(get(MGL_NO_ORIGIN) && v==aa.v0)      continue;
+               if(v>aa.v1 && v<aa.v2 && i%k!=0)        continue;
+               char pos[4]={up[i],':',align[i],0};
+               text_plot(kk[i], aa.txt[i].text.c_str(), pos, -1, aa.sh+0.1,CDef);
        }
-       delete []w;     delete []kk;
+       delete []w;     delete []kk;    delete []align; delete []up;
 }
 //-----------------------------------------------------------------------------
 char mglCanvas::GetLabelPos(mreal c, long kk, mglAxis &aa)
 {
        if(strchr("xyz",aa.ch))
-               aa.org = mglPoint(GetOrgX(aa.ch,aa.inv), GetOrgY(aa.ch,aa.inv), GetOrgZ(aa.ch,aa.inv));
+               aa.org.Set(GetOrgX(aa.ch,aa.inv), GetOrgY(aa.ch,aa.inv), GetOrgZ(aa.ch,aa.inv));
        mglPoint d = aa.dir, o = aa.org;        // "transverse" org
        if(strchr("xyz",aa.ch)) o -= d*(o*d);
        mglPoint p,q, s=(Min+Max)/2, nn;
@@ -668,11 +669,11 @@ char mglCanvas::GetLabelPos(mreal c, long kk, mglAxis &aa)
        if(aa.ch=='c')  ts=(aa.ns==0 || aa.ns==3)?1:-1;
        if(aa.ch=='T')  ts=-1;
 
-       p = o+d*c;      nn = (s-o)/(Max-Min);   ScalePoint(&B,p,nn);
+       p = o+d*c;      nn = s-o;       ScalePoint(&B,p,nn);
        mglPnt &qq = Pnt[kk];
 
        if(aa.ch=='c')  qq.u = qq.v = NAN;
-       if(!get(MGL_DISABLE_SCALE))     ts = mgl_sign(qq.v*nn.x-qq.u*nn.y)*mgl_sign(aa.v2-aa.v1);
+       if(!get(MGL_DISABLE_SCALE))     ts = mgl_sign(qq.v*nn.x-qq.u*nn.y);
        if(aa.ch=='T')  ts *= -1;
        if(aa.pos=='T') ts *= -1;
        return ts>0 ? 't':'T';
@@ -735,7 +736,7 @@ void MGL_NO_EXPORT mgl_drw_grid(HMGL gr, double val, const mglPoint &d, const mg
 }
 void mglCanvas::DrawGrid(mglAxis &aa, bool at_tick)
 {
-       mglPoint pp[8]={Min,Min,Min,Min,Max,Max,Max,Max},nan=mglPoint(NAN), oo[8], org=Min;
+       mglPoint pp[8]={Min,Min,Min,Min,Max,Max,Max,Max},nan(NAN), oo[8], org=Min;
        pp[1].x=Max.x;  pp[2].y=Max.y;  pp[3].z=Max.z;
        pp[4].x=Min.x;  pp[5].y=Min.y;  pp[6].z=Min.z;
        mreal zm=INFINITY;
@@ -800,50 +801,50 @@ void mglCanvas::Labelw(char dir, const wchar_t *text, mreal pos, const char *opt
                AdjustTicks(ax,fx!=0);  aa = &ax;
                if(ax.dv)       t = (Min.x+Max.x+pos*(Max.x-Min.x))/2;
                else    t = Min.x*pow(Max.x/Min.x, (pos+1)/2);
-               p = mglPoint(t, GetOrgY(ax.ch,ax.inv), GetOrgZ(ax.ch,ax.inv));
-               q = mglPoint(1,0,0);    shift += ax.sh;
+               p.Set(t, GetOrgY(ax.ch,ax.inv), GetOrgZ(ax.ch,ax.inv));
+               q.Set(1,0,0);   shift += ax.sh;
        }
        if(dir=='y' && !(TernAxis&3))
        {
                AdjustTicks(ay,fy!=0);  aa = &ay;
                if(ay.dv)       t = (Min.y+Max.y+pos*(Max.y-Min.y))/2;
                else    t = Min.y*pow(Max.y/Min.y, (pos+1)/2);
-               p = mglPoint(GetOrgX(ay.ch,ay.inv), t, GetOrgZ(ay.ch,ay.inv));
-               q = mglPoint(0,1,0);    shift += ay.sh;
+               p.Set(GetOrgX(ay.ch,ay.inv), t, GetOrgZ(ay.ch,ay.inv));
+               q.Set(0,1,0);   shift += ay.sh;
                if(TernAxis&3)
                {
-                       q = mglPoint(-1,1,0);   pos=-pos;
+                       q.Set(-1,1,0);  pos=-pos;
                }
        }
        if(dir=='y' && (TernAxis&3))
        {
-               ty.ch='T';      ty.dir = mglPoint(-1,1);        ty.org = mglPoint(1,0,ay.org.z);
+               ty.ch='T';      ty.dir.Set(-1,1);       ty.org.Set(1,0,ay.org.z);
                AdjustTicks(ty,fy!=0);  aa = &ty;
                if(ty.dv)       t = (Min.y+Max.y+pos*(Max.y-Min.y))/2;
                else    t = Min.y*pow(Max.y/Min.y, (pos+1)/2);
-               p = mglPoint(GetOrgX(ty.ch,ty.inv), t, GetOrgZ(ty.ch,ty.inv));
-               q = mglPoint(0,1,0);    shift += ty.sh;
+               p.Set(GetOrgX(ty.ch,ty.inv), t, GetOrgZ(ty.ch,ty.inv));
+               q.Set(0,1,0);   shift += ty.sh;
                if(TernAxis&3)
                {
-                       q = mglPoint(-1,1,0);   pos=-pos;
+                       q.Set(-1,1,0);  pos=-pos;
                }
        }
        if(dir=='t' && (TernAxis&3))
        {
-               ty.ch='t';      ty.dir = mglPoint(0,-1);        ty.org = mglPoint(0,1,ay.org.z);
+               ty.ch='t';      ty.dir.Set(0,-1);       ty.org.Set(0,1,ay.org.z);
                AdjustTicks(ty,fy!=0);  pos = -pos;     aa = &ty;
                if(ty.dv)       t = (Min.y+Max.y+pos*(Max.y-Min.y))/2;
                else    t = Min.y*pow(Max.y/Min.y, (pos+1)/2);
-               p = mglPoint(GetOrgX(ty.ch,ty.inv), t, GetOrgZ(ty.ch,ty.inv));
-               q = mglPoint(0,1,0);    shift += ty.sh;
+               p.Set(GetOrgX(ty.ch,ty.inv), t, GetOrgZ(ty.ch,ty.inv));
+               q.Set(0,1,0);   shift += ty.sh;
        }
        if(dir=='z')
        {
                AdjustTicks(az,fz!=0);  aa = &az;
                if(az.dv)       t = (Min.z+Max.z+pos*(Max.z-Min.z))/2;
                else    t = Min.z*pow(Max.z/Min.z, (pos+1)/2);
-               p = mglPoint(GetOrgX(az.ch,az.inv), GetOrgY(az.ch,az.inv), t);
-               q = mglPoint(0,0,1);    shift += az.sh;
+               p.Set(GetOrgX(az.ch,az.inv), GetOrgY(az.ch,az.inv), t);
+               q.Set(0,0,1);   shift += az.sh;
        }
        if(aa)
        {
@@ -879,19 +880,19 @@ void mglCanvas::Box(const char *col, bool ticks)
                DrawAxis(az, false, 0,col);
 
                mglAxis ty(ay);                         ty.ch='T';
-               ty.dir = mglPoint(-1,1);        ty.org = mglPoint(1,0,Max.z);
+               ty.dir.Set(-1,1);       ty.org.Set(1,0,Max.z);
                DrawAxis(ty, false, 0,col);     ty.ch='t';
-               ty.dir = mglPoint(0,-1);        ty.org = mglPoint(0,1,Max.z);
+               ty.dir.Set(0,-1);       ty.org.Set(0,1,Max.z);
                DrawAxis(ty, false, 0,col);
        }
        else if(TernAxis&2)
        {
                mglAxis ty(az);
-               ty.ch='T';      ty.a=mglPoint(1,0);     ty.b=mglPoint(-1,1);
-               ty.dir = mglPoint(-1,0,1);      ty.org = mglPoint(1,0,0);
+               ty.ch='T';      ty.a.Set(1,0);  ty.b.Set(-1,1);
+               ty.dir.Set(-1,0,1);     ty.org.Set(1,0,0);
                DrawAxis(ty, false, 0,col);
-               ty.ch='t';      ty.a=mglPoint(0,1);     ty.b=mglPoint(-1,1);
-               ty.dir = mglPoint(0,-1,1);      ty.org = mglPoint(0,1,0);
+               ty.ch='t';      ty.a.Set(0,1);  ty.b.Set(-1,1);
+               ty.dir.Set(0,-1,1);     ty.org.Set(0,1,0);
                DrawAxis(ty, false, 0,col);
        }
        else
@@ -904,7 +905,7 @@ void mglCanvas::Box(const char *col, bool ticks)
                if(mglchr(col,'@'))
                {
                        // edge points
-                       mglPoint p[8]={Min,Min,Min,Min,Max,Max,Max,Max},nan=mglPoint(NAN),oo[8];
+                       mglPoint p[8]={Min,Min,Min,Min,Max,Max,Max,Max},nan(NAN),oo[8];
                        p[1].x=Max.x;   p[2].y=Max.y;   p[3].z=Max.z;
                        p[4].x=Min.x;   p[5].y=Min.y;   p[6].z=Min.z;
                        mreal zm=INFINITY;      int im=0;
@@ -1091,7 +1092,10 @@ void mglCanvas::colorbar(HCDT vv, const mreal *c, int where, mreal x, mreal y, m
        SetPenPal(TickStl);
        for(size_t i=0;i<ac.txt.size();i++)
        {
-               mreal d = ac.txt[i].val = GetA(ac.txt[i].val)*2-1;
+               mreal d = fa?fa->Calc(0,0,0,ac.txt[i].val):ac.txt[i].val;
+               ac.txt[i].val = d = 2*(d-FMin.c)/(FMax.c-FMin.c)-1;
+               if(fabs(d)>1)   continue;       // this is factor
+//             mreal d = ac.txt[i].val = GetA(ac.txt[i].val)*2-1;
                p1 = p2 = mglPoint((ss*d+1)*w+x, (ss*d+1)*h+y, s3);
                switch(where)
                {
@@ -1102,20 +1106,19 @@ void mglCanvas::colorbar(HCDT vv, const mreal *c, int where, mreal x, mreal y, m
                }
                line_plot(AddPnt(&M, p1), AddPnt(&M, p2));
        }
-       ac.dir = mglPoint(ss*w,ss*h,0);
-       ac.org = mglPoint(w+x,h+y,s3+1);
+       ac.dir.Set(ss*w,ss*h,0);        ac.a.Set(0,0,0);
+       ac.org.Set(w+x,h+y,s3+1);       ac.b.Set(0,0,0);
        switch(where)
        {
-               case 1: ac.dir.x = 0;   ac.org.x = x+0.1*w-(get(MGL_ENABLE_RTEXT)?0:0.06);      break;
-               case 2: ac.dir.y = 0;   ac.org.y = y-0.1*h;     break;
-               case 3: ac.dir.y = 0;   ac.org.y = y+0.1*h;     break;
-               default:ac.dir.x = 0;   ac.org.x = x-0.1*w;     break;
+               case 1: ac.dir.x = 0;   ac.a.x= 1;      ac.org.x = x+0.1*w-(get(MGL_ENABLE_RTEXT)?0:0.06);      break;
+               case 2: ac.dir.y = 0;   ac.a.y=-1;      ac.org.y = y-0.1*h;     break;
+               case 3: ac.dir.y = 0;   ac.a.y= 1;      ac.org.y = y+0.1*h;     break;
+               default:ac.dir.x = 0;   ac.a.x=-1;      ac.org.x = x-0.1*w;     break;
        }
        SetPenPal(AxisStl);
-//     bool out = fabs(x)>1 && fabs(y)>1;
        bool inv = where!=3 && where!=0;
-       ac.ns = where;  ac.angl=NAN;
-       if(text)        DrawLabels(ac,inv,&M);  // NOTE ns isn't used for colorbar
+       ac.ns = where;  ac.angl=NAN;    // NOTE ns isn't used for colorbar
+       if(text)        DrawLabels(ac,inv,&M);
        clr(MGL_DISABLE_SCALE); EndGroup();
 }
 //-----------------------------------------------------------------------------
index d54571d89512b0f57dbaca2fd971eb95f5a7507f..a502780a9c248b13a8c72897624f5dacaf4e66e6 100644 (file)
@@ -105,18 +105,16 @@ mglBase::mglBase()
        pthread_mutex_init(&mutexClf,0);\r
        Pnt.set_mutex(&mutexClf);\r
        Prm.set_mutex(&mutexClf);\r
-       Sub.set_mutex(&mutexClf);\r
        Txt.set_mutex(&mutexClf);\r
 #endif\r
 #if MGL_HAVE_OMP\r
        omp_init_lock(&lockClf);\r
        Pnt.set_mutex(&lockClf);\r
        Prm.set_mutex(&lockClf);\r
-       Sub.set_mutex(&lockClf);\r
        Txt.set_mutex(&lockClf);\r
 #endif\r
        fnt=0;  *FontDef=0;     fx=fy=fz=fa=fc=0;\r
-       AMin = mglPoint(0,0,0,0);       AMax = mglPoint(1,1,1,1);\r
+       AMin.Set(0,0,0,0);      AMax.Set(1,1,1,1);\r
 \r
        InUse = 1;      SetQuality();   FaceNum = 0;\r
        // Always create default palette txt[0] and default scheme txt[1]\r
@@ -126,14 +124,13 @@ mglBase::mglBase()
        MGL_PUSH(Txt,t2,mutexTxt);\r
 \r
        strcpy(last_style,"__1 {dFFFF}k\0");\r
-       MinS=mglPoint(-1,-1,-1);        MaxS=mglPoint(1,1,1);\r
+       MinS.Set(-1,-1,-1);     MaxS.Set(1,1,1);\r
        fnt = new mglFont;      fnt->gr = this; PrevState=NAN;\r
 }\r
 mglBase::~mglBase()\r
 {\r
        ClearEq();      ClearPrmInd();  delete fnt;\r
-       Pnt.set_mutex(0);       Prm.set_mutex(0);\r
-       Sub.set_mutex(0);       Txt.set_mutex(0);\r
+       Pnt.set_mutex(0);       Prm.set_mutex(0);       Txt.set_mutex(0);\r
 #if MGL_HAVE_OMP\r
        omp_destroy_lock(&lockClf);\r
 #endif\r
@@ -193,7 +190,8 @@ const char *mglWarn[mglWarnEnd] = {"data dimension(s) is incompatible",     //mglWar
                                                                "There are wrong argument(s) in script",//mglScrArg\r
                                                                "There are wrong command in script",    //mglScrCmd\r
                                                                "There are too long string in script",  //mglScrLong\r
-                                                               "There are unbalanced ' in script"};    //mglScrStr\r
+                                                               "There are unbalanced ' in script",             //mglScrStr\r
+                                                               "There are changing temporary data in script"}; //mglScrTemp\r
 //-----------------------------------------------------------------------------\r
 extern bool mglPrintWarn;\r
 void mglBase::SetWarn(int code, const char *who)\r
@@ -296,7 +294,7 @@ long mglBase::AddPnt(const mglMatrix *mat, mglPoint p, mreal c, mglPoint n, mrea
        if(!get(MGL_ENABLE_ALPHA))      {       q.a=1;  if(txt.Smooth!=2)       q.ta=1-gap;     }\r
        if(norefr)      q.v=0;\r
        if(!get(MGL_ENABLE_LIGHT) && !(scl&4))  q.u=q.v=NAN;\r
-       if(mat->norot)  q.sub=-1;       // NOTE: temporary -- later should be mglInPlot here\r
+       q.sub=mat->norot?-Sub.size():Sub.size()-1;\r
        long k;\r
 #pragma omp critical(pnt)\r
        {k=Pnt.size();  MGL_PUSH(Pnt,q,mutexPnt);}      return k;\r
@@ -364,8 +362,8 @@ void mglBase::RecalcBorder()
        {       FMin = Min;     FMax = Max;     }\r
        else\r
        {\r
-               FMin = mglPoint( INFINITY, INFINITY, INFINITY);\r
-               FMax = mglPoint(-INFINITY,-INFINITY,-INFINITY);\r
+               FMin.Set( INFINITY, INFINITY, INFINITY);\r
+               FMax.Set(-INFINITY,-INFINITY,-INFINITY);\r
                register int i,j;\r
                int n=30;\r
                for(i=0;i<=n;i++)       for(j=0;j<=n;j++)       // x range\r
@@ -444,12 +442,12 @@ bool mglBase::ScalePoint(const mglMatrix *, mglPoint &p, mglPoint &n, bool use_n
        }\r
        else\r
        {\r
-               if(x1<Min.x)    {x=Min.x;       n=mglPoint(1,0,0);}\r
-               if(x2>Max.x)    {x=Max.x;       n=mglPoint(1,0,0);}\r
-               if(y1<Min.y)    {y=Min.y;       n=mglPoint(0,1,0);}\r
-               if(y2>Max.y)    {y=Max.y;       n=mglPoint(0,1,0);}\r
-               if(z1<Min.z)    {z=Min.z;       n=mglPoint(0,0,1);}\r
-               if(z2>Max.z)    {z=Max.z;       n=mglPoint(0,0,1);}\r
+               if(x1<Min.x)    {x=Min.x;       n.Set(1,0,0);}\r
+               if(x2>Max.x)    {x=Max.x;       n.Set(1,0,0);}\r
+               if(y1<Min.y)    {y=Min.y;       n.Set(0,1,0);}\r
+               if(y2>Max.y)    {y=Max.y;       n.Set(0,1,0);}\r
+               if(z1<Min.z)    {z=Min.z;       n.Set(0,0,1);}\r
+               if(z2>Max.z)    {z=Max.z;       n.Set(0,0,1);}\r
        }\r
 \r
        x1=x;   y1=y;   z1=z;\r
@@ -512,7 +510,7 @@ void mglScaleAxis(mreal &v1, mreal &v2, mreal &v0, mreal x1, mreal x2)
 //-----------------------------------------------------------------------------\r
 void mglBase::SetOrigin(mreal x0, mreal y0, mreal z0, mreal c0)\r
 {\r
-       Org=mglPoint(x0,y0,z0,c0);\r
+       Org.Set(x0,y0,z0,c0);\r
        if((TernAxis&3)==0)\r
        {\r
                Min = OMin;     Max = OMax;\r
@@ -547,7 +545,7 @@ void mglBase::SetRanges(mglPoint m1, mglPoint m2)
                mglScaleAxis(Min.c, Max.c, Org.c, AMin.c, AMax.c);\r
        }\r
 \r
-       CutMin = mglPoint(0,0,0);       CutMax = mglPoint(0,0,0);\r
+       CutMin.Set(0,0,0);      CutMax.Set(0,0,0);\r
        RecalcBorder();\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -709,7 +707,7 @@ void mglBase::Ternary(int t)
        {\r
                if(c)   {       x1 = Min;       x2 = Max;       o = Org;        }\r
                SetRanges(mglPoint(0,0,0),mglPoint(1,1,(t&3)==1?0:1));\r
-               Org=mglPoint(0,0,(t&3)==1?NAN:0);       c = false;\r
+               Org.Set(0,0,(t&3)==1?NAN:0);    c = false;\r
        }\r
        else if(!c)     {       SetRanges(x1,x2);       Org=o;  c=true; }\r
 }\r
@@ -858,8 +856,8 @@ void mglTexture::Set(const char *s, int smooth, mreal alpha)
                if(strchr(MGL_COLORS,s[i]) && j<1 && (m==0 || s[i-1]=='{'))     // {CN,val} format, where val in [0,1]\r
                {\r
                        if(m>0 && s[i+1]>'0' && s[i+1]<='9')// ext color\r
-                       {       c[2*n] = mglColor(s[i],(s[i+1]-'0')/5.f);       i++;    }\r
-                       else    c[2*n] = mglColor(s[i]);        // usual color\r
+                       {       c[2*n].Set(s[i],(s[i+1]-'0')/5.f);      i++;    }\r
+                       else    c[2*n].Set(s[i]);       // usual color\r
                        val[n]=-1;      c[2*n].a = -1;  n++;\r
                }\r
                if(s[i]=='x' && i>0 && s[i-1]=='{' && j<1)      // {xRRGGBB,val} format, where val in [0,1]\r
@@ -885,7 +883,7 @@ void mglTexture::Set(const char *s, int smooth, mreal alpha)
                c[2*i+1]=c[2*i];\r
                if(man) c[2*i].a=0;\r
        }\r
-       if(map && sm)           // map texture\r
+       if(map && sm && n>1)            // map texture\r
        {\r
                if(n==2)\r
                {       c[1]=c[2];      c[2]=c[0];      c[0]=BC;        c[3]=c[1]+c[2]; }\r
@@ -1008,7 +1006,7 @@ mreal mglBase::NextColor(long id, long sh)
        return cc;\r
 }\r
 //-----------------------------------------------------------------------------\r
-MGL_EXPORT_PURE const char *mglchrs(const char *str, const char *chr)\r
+MGL_EXPORT const char *mglchrs(const char *str, const char *chr)\r
 {\r
        if(!str || !str[0] || !chr || !chr[0])  return NULL;\r
        size_t l=strlen(chr);\r
@@ -1020,7 +1018,7 @@ MGL_EXPORT_PURE const char *mglchrs(const char *str, const char *chr)
        return NULL;\r
 }\r
 //-----------------------------------------------------------------------------\r
-MGL_EXPORT_PURE const char *mglchr(const char *str, char ch)\r
+MGL_EXPORT const char *mglchr(const char *str, char ch)\r
 {\r
        if(!str || !str[0])     return NULL;\r
        size_t l=strlen(str),k=0;\r
@@ -1209,8 +1207,10 @@ int MGL_LOCAL_PURE mglFindArg(const char *str)
        return 0;\r
 }\r
 //-----------------------------------------------------------------------------\r
-void mglBase::SetAmbient(mreal bright) {       AmbBr = bright; }\r
-void mglBase::SetDiffuse(mreal bright) {       DifBr = bright; }\r
+void mglBase::SetAmbient(mreal bright)\r
+{      AmbBr=bright;   size_t n=Sub.size();    if(n>0) Sub[n-1].AmbBr=bright;  }\r
+void mglBase::SetDiffuse(mreal bright)\r
+{      DifBr=bright;   size_t n=Sub.size();    if(n>0) Sub[n-1].DifBr=bright;  }\r
 //-----------------------------------------------------------------------------\r
 mreal mglBase::SaveState(const char *opt)\r
 {\r
@@ -1363,10 +1363,10 @@ bool MGL_EXPORT mgl_check_dim3(HMGL gr, bool both, HCDT x, HCDT y, HCDT z, HCDT
 bool MGL_EXPORT mgl_check_trig(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const char *name, int d)\r
 {\r
 //     if(!gr || !x || !y || !z || !a || !nums)        return true;            // if data is absent then should be segfault!!!\r
-       long n = x->GetNx(), m = nums->GetNy();\r
+       long n = x->GetNN(), m = nums->GetNy();\r
        if(nums->GetNx()<d)     {       gr->SetWarn(mglWarnLow,name);   return true;    }\r
-       if(y->GetNx()!=n || z->GetNx()!=n)      {       gr->SetWarn(mglWarnDim,name);   return true;    }\r
-       if(a->GetNx()!=m && a->GetNx()!=n)      {       gr->SetWarn(mglWarnDim,name);   return true;    }\r
+       if(y->GetNN()!=n || z->GetNN()!=n)      {       gr->SetWarn(mglWarnDim,name);   return true;    }\r
+       if(a->GetNN()!=m && a->GetNN()!=n)      {       gr->SetWarn(mglWarnDim,name);   return true;    }\r
        return false;\r
 }\r
 //-----------------------------------------------------------------------------\r
index 98702b9923e5d352ddf0b417d6979e2749139bac..a8ec2730a6811f6dcc117a7d8dca562848022650 100644 (file)
@@ -30,15 +30,15 @@ void MGL_EXPORT mgl_suppress_warn(int on)   {       mglPrintWarn = !on;     }
 void MGL_EXPORT mgl_suppress_warn_(int *on)    {       mgl_suppress_warn(*on); }\r
 void MGL_EXPORT mgl_set_quality(HMGL gr, int qual)     {       gr->SetQuality(qual);   }\r
 void MGL_EXPORT mgl_set_quality_(uintptr_t *gr, int *qual)     {       _GR_->SetQuality(*qual);        }\r
-int MGL_EXPORT_PURE mgl_get_quality(HMGL gr)   {       return gr->GetQuality();        }\r
-int MGL_EXPORT_PURE mgl_get_quality_(uintptr_t *gr)    {       return _GR_->GetQuality();      }\r
-int MGL_EXPORT_PURE mgl_is_frames(HMGL gr)\r
+int MGL_EXPORT mgl_get_quality(HMGL gr)        {       return gr->GetQuality();        }\r
+int MGL_EXPORT mgl_get_quality_(uintptr_t *gr) {       return _GR_->GetQuality();      }\r
+int MGL_EXPORT mgl_is_frames(HMGL gr)\r
 {      return gr->get(MGL_VECT_FRAME) && !(gr->GetQuality()&MGL_DRAW_LMEM);    }\r
 void MGL_EXPORT mgl_set_draw_reg(HMGL gr, long nx, long ny, long m)    {       gr->SetDrawReg(nx,ny,m);        }\r
 void MGL_EXPORT mgl_set_draw_reg_(uintptr_t *gr, int *nx, int *ny, int *m)     {       _GR_->SetDrawReg(*nx,*ny,*m);   }\r
 //-----------------------------------------------------------------------------\r
-int MGL_EXPORT_PURE mgl_get_flag(HMGL gr, uint32_t flag)       {       return gr->get(flag);   }\r
-int MGL_EXPORT_PURE mgl_get_flag_(uintptr_t *gr, unsigned long *flag)  {       return _GR_->get(*flag);        }\r
+int MGL_EXPORT mgl_get_flag(HMGL gr, uint32_t flag)    {       return gr->get(flag);   }\r
+int MGL_EXPORT mgl_get_flag_(uintptr_t *gr, unsigned long *flag)       {       return _GR_->get(*flag);        }\r
 void MGL_EXPORT mgl_set_flag(HMGL gr, int val, uint32_t flag)          {       gr->set(val,flag);      }\r
 void MGL_EXPORT mgl_set_flag_(uintptr_t *gr, int *val, unsigned long *flag)    {       _GR_->set(*val,*flag);  }\r
 //-----------------------------------------------------------------------------\r
@@ -58,7 +58,7 @@ void MGL_EXPORT mgl_set_plotid(HMGL gr, const char *id)       {       gr->PlotId = id;        }
 void MGL_EXPORT mgl_set_plotid_(uintptr_t *gr, const char *id,int l)\r
 {      char *s=new char[l+1];  memcpy(s,id,l); s[l]=0;\r
        _GR_->PlotId = s;       delete []s;     }\r
-MGL_EXPORT_PURE const char *mgl_get_plotid(HMGL gr)    {       return gr->PlotId.c_str();      }\r
+MGL_EXPORT const char *mgl_get_plotid(HMGL gr) {       return gr->PlotId.c_str();      }\r
 int MGL_EXPORT mgl_get_plotid_(uintptr_t *gr, char *out, int len)\r
 {\r
        const char *res = mgl_get_plotid(_GR_);\r
@@ -66,14 +66,14 @@ int MGL_EXPORT mgl_get_plotid_(uintptr_t *gr, char *out, int len)
        return strlen(res);\r
 }\r
 //-----------------------------------------------------------------------------\r
-MGL_EXPORT_PURE const char *mgl_get_mess(HMGL gr)      {       return gr->Mess.c_str();        }\r
+MGL_EXPORT const char *mgl_get_mess(HMGL gr)   {       return gr->Mess.c_str();        }\r
 int MGL_EXPORT mgl_get_mess_(uintptr_t *gr, char *out, int len)\r
 {\r
        const char *res = mgl_get_mess(_GR_);\r
        if(out) strncpy(out,res,len);\r
        return strlen(res);\r
 }\r
-int MGL_EXPORT_PURE mgl_get_warn(HMGL gr)      {       return gr->GetWarn();   }\r
+int MGL_EXPORT mgl_get_warn(HMGL gr)   {       return gr->GetWarn();   }\r
 void MGL_EXPORT mgl_set_warn(HMGL gr, int code, const char *txt)\r
 {      gr->SetWarn(code,txt);  }\r
 extern bool mglPrintWarn;\r
@@ -87,7 +87,7 @@ void MGL_EXPORT mgl_set_global_warn(const char *txt)
 }\r
 void MGL_EXPORT mgl_set_global_warn_(const char *txt, int l)\r
 {      char *s=new char[l+1];  memcpy(s,txt,l);        s[l]=0; mgl_set_global_warn(s); delete []s;     }\r
-MGL_EXPORT_PURE const char *mgl_get_global_warn()      {       return mglGlobalMess.c_str();   }\r
+MGL_EXPORT const char *mgl_get_global_warn()   {       return mglGlobalMess.c_str();   }\r
 int MGL_EXPORT mgl_get_global_warn_(char *out, int len)\r
 {\r
        const char *res = mgl_get_global_warn();\r
@@ -153,7 +153,7 @@ void MGL_EXPORT mgl_set_rdc_acc_(uintptr_t *gr, int *reduce)
 void MGL_EXPORT mgl_highlight_(uintptr_t *gr, int *id) {       _GR_->Highlight(*id);   }\r
 void MGL_EXPORT mgl_set_origin_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0)\r
 {      _GR_->SetOrigin(*x0,*y0,*z0);   }\r
-int MGL_EXPORT_PURE mgl_get_warn_(uintptr_t *gr)       {       return _GR_->GetWarn(); }\r
+int MGL_EXPORT mgl_get_warn_(uintptr_t *gr)    {       return _GR_->GetWarn(); }\r
 void MGL_EXPORT mgl_set_warn_(uintptr_t *gr, int *code, const char *txt, int l)\r
 {      char *s=new char[l+1];  memcpy(s,txt,l);        s[l]=0;\r
        _GR_->SetWarn(*code, s);        delete []s;     }\r
index 9d4099ff559e5a2d5afe1544c0dc8c6cecaef595..c016c2d749b7203b5954f81e8f3fdb79e2a40f64 100644 (file)
@@ -34,9 +34,9 @@ mglCanvas::mglCanvas(int w, int h) : mglBase()
        pnt_col = 0;\r
 \r
        ac.ch='c';\r
-       ax.dir = mglPoint(1,0,0);       ax.a = mglPoint(0,1,0); ax.b = mglPoint(0,0,1); ax.ch='x';\r
-       ay.dir = mglPoint(0,1,0);       ay.a = mglPoint(1,0,0); ay.b = mglPoint(0,0,1); ay.ch='y';\r
-       az.dir = mglPoint(0,0,1);       az.a = mglPoint(0,1,0); az.b = mglPoint(1,0,0); az.ch='z';\r
+       ax.dir.Set(1,0,0);      ax.a.Set(0,1,0);        ax.b.Set(0,0,1);        ax.ch='x';\r
+       ay.dir.Set(0,1,0);      ay.a.Set(1,0,0);        ay.b.Set(0,0,1);        ay.ch='y';\r
+       az.dir.Set(0,0,1);      az.a.Set(0,1,0);        az.b.Set(1,0,0);        az.ch='z';\r
 \r
        SetSize(w,h);   SetQuality(MGL_DRAW_NORM);      DefaultPlotParam();\r
 }\r
@@ -50,7 +50,7 @@ mglCanvas::~mglCanvas()
 long mglCanvas::PushDrwDat()\r
 {\r
        mglDrawDat d;\r
-       d.Pnt=Pnt;      d.Prm=Prm;      d.Glf=Glf;      d.Ptx=Ptx;      d.Txt=Txt;\r
+       d.Pnt=Pnt;      d.Prm=Prm;      d.Sub=Sub;      d.Glf=Glf;      d.Ptx=Ptx;      d.Txt=Txt;\r
 #pragma omp critical(drw)\r
        MGL_PUSH(DrwDat,d,mutexDrw);\r
        return DrwDat.size();\r
@@ -64,10 +64,9 @@ void mglCanvas::SetFrame(long i)
        {\r
                Finish();       CurFrameId--;\r
                mglDrawDat d;\r
-               d.Pnt=Pnt;      d.Prm=Prm;      d.Glf=Glf;      d.Ptx=Ptx;      d.Txt=Txt;\r
+               d.Pnt=Pnt;      d.Prm=Prm;      d.Sub=Sub;      d.Glf=Glf;      d.Ptx=Ptx;      d.Txt=Txt;\r
 #if MGL_HAVE_PTHREAD\r
                pthread_mutex_lock(&mutexDrw);\r
-#pragma omp critical(drw)\r
                DrwDat[i] = d;\r
                pthread_mutex_unlock(&mutexDrw);\r
 #else\r
@@ -85,16 +84,18 @@ void mglCanvas::GetFrame(long k)
 #if MGL_HAVE_PTHREAD\r
        pthread_mutex_lock(&mutexPnt);\r
        pthread_mutex_lock(&mutexPrm);\r
+       pthread_mutex_lock(&mutexSub);\r
        pthread_mutex_lock(&mutexGlf);\r
        pthread_mutex_lock(&mutexPtx);\r
        pthread_mutex_lock(&mutexTxt);\r
 #endif\r
 #pragma omp critical\r
-       {       Pnt=d.Pnt;      Prm=d.Prm;      Glf=d.Glf;      Ptx=d.Ptx;      Txt=d.Txt;      ClearPrmInd();  }\r
+       {       Pnt=d.Pnt;      Prm=d.Prm;      Sub=d.Sub;      Glf=d.Glf;      Ptx=d.Ptx;      Txt=d.Txt;      ClearPrmInd();  }\r
 #if MGL_HAVE_PTHREAD\r
        pthread_mutex_unlock(&mutexTxt);\r
        pthread_mutex_unlock(&mutexPtx);\r
        pthread_mutex_unlock(&mutexGlf);\r
+       pthread_mutex_unlock(&mutexSub);\r
        pthread_mutex_unlock(&mutexPrm);\r
        pthread_mutex_unlock(&mutexPnt);\r
 #endif\r
@@ -117,9 +118,10 @@ void mglCanvas::ClearFrame()
 #pragma omp critical\r
        {\r
                StartAutoGroup(NULL);\r
-               Sub.clear();    Leg.clear();    Grp.clear();    Act.clear();\r
-               Pnt.clear();    Prm.clear();    Ptx.clear();    Glf.clear();    ClearPrmInd();\r
+               Leg.clear();    Grp.clear();    Act.clear();    Glf.clear();\r
+               Pnt.clear();    Prm.clear();    Ptx.clear();    ClearPrmInd();\r
                Txt.clear();    Txt.reserve(3);\r
+//             mglBlock inpl = Sub[0]; Sub.clear();    Sub.push_back(inpl);    // NOTE at least one inplot should present!!!\r
                mglTexture t1(MGL_DEF_PAL,-1), t2(MGL_DEF_SCH,1);\r
                Txt.push_back(t1);      Txt.push_back(t2);      // No extra lock is required\r
        }\r
@@ -141,10 +143,11 @@ void mglCanvas::ShowFrame(long k)
 {\r
        if(k<0 || (size_t)k>=DrwDat.size())     return;\r
        ClfZB();\r
-       size_t npnt=Pnt.size(), nglf=Glf.size(), nptx=Ptx.size(), ntxt=Txt.size();\r
+       size_t npnt=Pnt.size(), nglf=Glf.size(), nptx=Ptx.size(), ntxt=Txt.size(), nsub=Sub.size();\r
 #if MGL_HAVE_PTHREAD\r
        pthread_mutex_lock(&mutexPnt);\r
        pthread_mutex_lock(&mutexPrm);\r
+       pthread_mutex_lock(&mutexSub);\r
        pthread_mutex_lock(&mutexGlf);\r
        pthread_mutex_lock(&mutexPtx);\r
        pthread_mutex_lock(&mutexTxt);\r
@@ -152,13 +155,16 @@ void mglCanvas::ShowFrame(long k)
 #pragma omp critical\r
        {\r
                const mglDrawDat &d=DrwDat[k];\r
-               Glf.reserve(d.Glf.size());      for(size_t i=0;i<d.Glf.size();i++)      Glf.push_back(d.Glf[i]);\r
-               Ptx.reserve(d.Ptx.size());      for(size_t i=0;i<d.Ptx.size();i++)      Ptx.push_back(d.Ptx[i]);\r
+               Glf.resize(d.Glf.size());       for(size_t i=0;i<d.Glf.size();i++)      Glf.push_back(d.Glf[i]);\r
+               Ptx.resize(d.Ptx.size());       for(size_t i=0;i<d.Ptx.size();i++)      Ptx.push_back(d.Ptx[i]);\r
+               Sub.resize(d.Sub.size());       for(size_t i=0;i<d.Sub.size();i++)      Sub.push_back(d.Sub[i]);\r
                Txt.reserve(d.Pnt.size());      for(size_t i=0;i<d.Txt.size();i++)      Txt.push_back(d.Txt[i]);\r
                Pnt.reserve(d.Pnt.size());      ClearPrmInd();\r
                for(size_t i=0;i<d.Pnt.size();i++)\r
                {\r
                        mglPnt p = d.Pnt[i];    p.c += ntxt;\r
+                       if(p.sub>=0)    p.sub += nsub;\r
+                       else    p.sub -= nsub;\r
                        Pnt.push_back(p);\r
                }\r
                Prm.reserve(d.Prm.size());\r
@@ -182,6 +188,7 @@ void mglCanvas::ShowFrame(long k)
 #if MGL_HAVE_PTHREAD\r
        pthread_mutex_unlock(&mutexPnt);\r
        pthread_mutex_unlock(&mutexPrm);\r
+       pthread_mutex_unlock(&mutexSub);\r
        pthread_mutex_unlock(&mutexGlf);\r
        pthread_mutex_unlock(&mutexPtx);\r
        pthread_mutex_unlock(&mutexTxt);\r
@@ -239,7 +246,8 @@ GifFileType *gif;*/
        SetDefScheme(MGL_DEF_SCH);      SetPalette(MGL_DEF_PAL);\r
        SetPenPal("k-1");               Alpha(false);\r
        stack.clear();  Restore();      DefColor('k');\r
-       SetPlotFactor(0);       InPlot(0,1,0,1,false);\r
+       SetPlotFactor(0);       Sub.clear();\r
+       InPlot(0,1,0,1,false);\r
        SetTickLen(0);  SetCut(true);\r
        AdjustTicks("xyzc",true);       Clf('w');\r
 \r
@@ -454,9 +462,12 @@ pthread_mutex_lock(&mutexPtx);
        {\r
                Bt = B; Bt.norot=(q.sub<0);     // NOTE check this later for mglInPlot\r
                inv = inv ^ (strchr(font,'T')!=0);\r
-               if(inv) shift = 0.2*h-shift;\r
-               shift += 0.015*h;       // Correction for glyph rotation around proper point\r
-       //              shift *= h;\r
+               if(strchr(font,'V'))    shift = 0.1*h;\r
+               else\r
+               {\r
+                       if(inv) shift = 0.2*h-shift;\r
+                       shift += 0.015*h;       // Correction for glyph rotation around proper point\r
+               }\r
 \r
                int align;\r
                mreal col1=col, col2=col;\r
@@ -503,19 +514,19 @@ pthread_mutex_lock(&mutexPtx);
                        long k1,k2,k3,k4;       mglPnt pt;      mglPoint pp;\r
                        w = fnt->Width(text,font);      h = fnt->Height(font);\r
                        mreal d=-w*align/2.-h*0.2;      w+=h*0.4;\r
-                       pt = q; pp = mglPoint(d,-h*0.4);                PostScale(&Bt,pp);\r
+                       pt = q; pp.Set(d,-h*0.4);               PostScale(&Bt,pp);\r
                        pt.x=pt.xx=pp.x;        pt.y=pt.yy=pp.y;\r
 #pragma omp critical(pnt)\r
                        {k1=Pnt.size(); MGL_PUSH(Pnt,pt,mutexPnt);}\r
-                       pt = q; pp = mglPoint(w+d,-h*0.4);              PostScale(&Bt,pp);\r
+                       pt = q; pp.Set(w+d,-h*0.4);             PostScale(&Bt,pp);\r
                        pt.x=pt.xx=pp.x;        pt.y=pt.yy=pp.y;\r
 #pragma omp critical(pnt)\r
                        {k2=Pnt.size(); MGL_PUSH(Pnt,pt,mutexPnt);}\r
-                       pt = q; pp = mglPoint(d,h*1.2);                 PostScale(&Bt,pp);\r
+                       pt = q; pp.Set(d,h*1.2);                        PostScale(&Bt,pp);\r
                        pt.x=pt.xx=pp.x;        pt.y=pt.yy=pp.y;\r
 #pragma omp critical(pnt)\r
                        {k3=Pnt.size(); MGL_PUSH(Pnt,pt,mutexPnt);}\r
-                       pt = q; pp = mglPoint(w+d,h*1.2);               PostScale(&Bt,pp);\r
+                       pt = q; pp.Set(w+d,h*1.2);              PostScale(&Bt,pp);\r
                        pt.x=pt.xx=pp.x;        pt.y=pt.yy=pp.y;\r
 #pragma omp critical(pnt)\r
                        {k4=Pnt.size(); MGL_PUSH(Pnt,pt,mutexPnt);}\r
@@ -565,10 +576,6 @@ void mglCanvas::InPlot(mreal x1,mreal x2,mreal y1,mreal y2, const char *st)
        if(!st)         {       InPlot(x1,x2,y1,y2,false);      return; }\r
        inW = Width*(x2-x1);    inH = Height*(y2-y1);\r
        inX=Width*x1;   inY=Height*y1;  ZMin=1;\r
-       mglPrim p;      p.id = ObjId;\r
-       p.n1=x1*Width;  p.n2=x2*Width;  p.n3=y1*Height; p.n4=y2*Height;\r
-#pragma omp critical(sub)\r
-       MGL_PUSH(Sub,p,mutexSub);\r
 \r
        if(strchr(st,'T'))      {       y1*=0.9;        y2*=0.9;        }       // general title\r
        bool r = !(strchr(st,'r') || strchr(st,'R') || strchr(st,'>') || strchr(st,'g'));\r
@@ -593,6 +600,12 @@ void mglCanvas::InPlot(mreal x1,mreal x2,mreal y1,mreal y2, const char *st)
        B.b[8] = sqrt(B.b[0]*B.b[4]);\r
        B.z = (1.f-B.b[8]/(2*Depth))*Depth;\r
        B1=B;   font_factor = B.b[0] < B.b[4] ? B.b[0] : B.b[4];\r
+\r
+       mglBlock p;     p.AmbBr = AmbBr;        p.DifBr = DifBr;        p.B = B;\r
+       for(int i=0;i<10;i++)   p.light[i] = light[i];\r
+       p.id = ObjId;   p.n1=x1*Width;  p.n2=x2*Width;  p.n3=y1*Height; p.n4=y2*Height;\r
+#pragma omp critical(sub)\r
+       MGL_PUSH(Sub,p,mutexSub);\r
 }\r
 //-----------------------------------------------------------------------------\r
 void mglCanvas::InPlot(mglMatrix &M,mreal x1,mreal x2,mreal y1,mreal y2, bool rel)\r
@@ -615,13 +628,15 @@ void mglCanvas::InPlot(mglMatrix &M,mreal x1,mreal x2,mreal y1,mreal y2, bool re
                M.b[0] = Width*(x2-x1); M.b[4] = Height*(y2-y1);\r
                M.b[8] = sqrt(M.b[0]*M.b[4]);\r
                M.z = (1.f-M.b[8]/(2*Depth))*Depth;\r
-               B1=B;\r
+               B1=M;\r
        }\r
        inW=M.b[0];     inH=M.b[4];     ZMin=1;\r
        inX=Width*x1;   inY=Height*y1;\r
        font_factor = M.b[0] < M.b[4] ? M.b[0] : M.b[4];\r
-       mglPrim p;      p.id = ObjId;\r
-       p.n1=x1*Width;  p.n2=x2*Width;  p.n3=y1*Height; p.n4=y2*Height;\r
+\r
+       mglBlock p;     p.AmbBr = AmbBr;        p.DifBr = DifBr;        p.B = M;\r
+       for(int i=0;i<10;i++)   p.light[i] = light[i];\r
+       p.id = ObjId;   p.n1=x1*Width;  p.n2=x2*Width;  p.n3=y1*Height; p.n4=y2*Height;\r
 #pragma omp critical(sub)\r
        MGL_PUSH(Sub,p,mutexSub);\r
 }\r
@@ -656,6 +671,7 @@ void mglCanvas::Rotate(mreal tetz,mreal tetx,mreal tety)
                mreal h=(fabs(B.b[0])+fabs(B.b[1])+fabs(B.b[2]))/B1.b[0];\r
                B.pf = 1.55+0.6147*(w<h ? (h-1):(w-1));\r
        }\r
+       size_t n = Sub.size();  if(n>0) Sub[n-1].B = B;\r
 }\r
 //-----------------------------------------------------------------------------\r
 void mglMatrix::Rotate(mreal tetz,mreal tetx,mreal tety)\r
@@ -689,6 +705,7 @@ void mglCanvas::RotateN(mreal Tet,mreal x,mreal y,mreal z)
                mreal h=(fabs(B.b[0])+fabs(B.b[1])+fabs(B.b[2]))/B1.b[0];\r
                B.pf = 1.55+0.6147*(w<h ? (h-1):(w-1));\r
        }\r
+       size_t n = Sub.size();  if(n>0) Sub[n-1].B = B;\r
 }\r
 //-----------------------------------------------------------------------------\r
 void mglMatrix::RotateN(mreal Tet,mreal x,mreal y,mreal z)\r
@@ -724,10 +741,10 @@ void mglCanvas::Zoom(mreal x1, mreal y1, mreal x2, mreal y2)
 //-----------------------------------------------------------------------------\r
 int mglCanvas::GetSplId(long x,long y) const\r
 {\r
-       register long i,id=-1;\r
-       for(i=Sub.size()-1;i>=0;i--)\r
+       long id=-1;\r
+       for(long i=Sub.size()-1;i>=0;i--)\r
        {\r
-               const mglPrim &p = Sub[i];\r
+               const mglBlock &p = Sub[i];\r
                if(p.n1<=x && p.n2>=x && p.n3<=y && p.n4>=y)\r
                {       id=p.id;        break;  }\r
        }\r
@@ -752,9 +769,10 @@ void mglCanvas::Aspect(mreal Ax,mreal Ay,mreal Az)
        a = a > fabs(Az) ? a : fabs(Az);\r
        if(a==0)        {       SetWarn(mglWarnZero,"Aspect");  return; }\r
        Ax/=a;  Ay/=a;  Az/=a;\r
-       B.b[0] *= Ax;           B.b[3] *= Ax;           B.b[6] *= Ax;\r
-       B.b[1] *= Ay;           B.b[4] *= Ay;           B.b[7] *= Ay;\r
-       B.b[2] *= Az;           B.b[5] *= Az;           B.b[8] *= Az;\r
+       B.b[0] *= Ax;   B.b[3] *= Ax;   B.b[6] *= Ax;\r
+       B.b[1] *= Ay;   B.b[4] *= Ay;   B.b[7] *= Ay;\r
+       B.b[2] *= Az;   B.b[5] *= Az;   B.b[8] *= Az;\r
+       size_t n = Sub.size();  if(n>0) Sub[n-1].B = B;\r
 }\r
 //-----------------------------------------------------------------------------\r
 //     Lighting and transparency\r
@@ -765,6 +783,7 @@ void mglCanvas::Light(int n, bool enable)
 {\r
        if(n<0 || n>9)  {       SetWarn(mglWarnLId,"Light");    return; }\r
        light[n].n = enable;\r
+       size_t m=Sub.size();    if(m>0) Sub[m-1].light[n].n = enable;\r
 }\r
 //-----------------------------------------------------------------------------\r
 void mglCanvas::AddLight(int n, mglPoint r, mglPoint d, char col, mreal br, mreal ap)\r
@@ -772,7 +791,8 @@ void mglCanvas::AddLight(int n, mglPoint r, mglPoint d, char col, mreal br, mrea
        if(n<0 || n>9)  {       SetWarn(mglWarnLId,"AddLight"); return; }\r
        light[n].n = true;      light[n].a = ap>0?ap*ap:3;\r
        light[n].b = br;        light[n].r = r;\r
-       light[n].d = d;         light[n].c = mglColor(col);\r
+       light[n].d = d;         light[n].c.Set(col);\r
+       size_t m=Sub.size();    if(m>0) Sub[m-1].light[n] = light[n];\r
 }\r
 //-----------------------------------------------------------------------------\r
 void mglCanvas::arrow_plot(long n1, long n2, char st)\r
@@ -839,12 +859,12 @@ std::wstring MGL_EXPORT mgl_ftoa(double v, const char *fmt)
        if(mglchr(fmt,'-') && !(plus||tex))             // replace '-' by "\minus"\r
                for(i=0;i<lf;i++)       res += sf[i];\r
        else\r
-               for(i=0;i<lf;i++)       res += sf[i]!='-'?wchar_t(sf[i]):L'−';\r
+               for(i=0;i<lf;i++)       res += sf[i]!='-'?wchar_t(sf[i]):0x2212;\r
        if(tex) // TeX notation: 'e' -> "\cdot 10^{...}"\r
        {\r
                if(res[0]=='1' && (res[1]=='e' || res[1]=='E'))\r
                {       res.replace(0,2,L"10^{");       res += L'}';    }\r
-               else if(wcschr(L"+-",res[0]) && res[1]=='1' && (res[2]=='e' || res[2]=='E'))\r
+               else if(wcschr(L"+-\u2212",res[0]) && res[1]=='1' && (res[2]=='e' || res[2]=='E'))\r
                {       res.replace(1,2,L"10^{");       res += L'}';    }\r
                else\r
                {\r
@@ -875,6 +895,8 @@ void mglCanvas::Legend(const std::vector<mglText> &leg, mreal x, mreal y, const
        strcpy(ff,fmt?fmt:"");  strcat(ff,":L");        Push();\r
        if((pA=strchr(ff,'A')))\r
        {       *pA = ' ';      InPlot(0,1,0,1,false);  iw=B1.b[0];     ih=B1.b[4];     }\r
+       else if(mglchr(font,'A'))\r
+       {       InPlot(0,1,0,1,false);  iw=B1.b[0];     ih=B1.b[4];     }\r
        else    {       iw=B1.b[0]/B1.pf;       ih=B1.b[4]/B1.pf;       }\r
        // find sizes\r
        mreal h=TextHeight(font,size);\r
@@ -907,7 +929,7 @@ void mglCanvas::Legend(const std::vector<mglText> &leg, mreal x, mreal y, const
        }\r
        x += B.x-iw/2+dx;       y += B.y-ih/2+dy;\r
        // draw it\r
-       mglPoint p,q=mglPoint(NAN,NAN,NAN);\r
+       mglPoint p,q(NAN,NAN,NAN);\r
 \r
        mreal cc = AddTexture(font);\r
        mreal c1,c2;    //=AddTexture(char(k1?k1:'w')), c2=AddTexture(char(k2?k2:'k'));\r
@@ -925,10 +947,10 @@ void mglCanvas::Legend(const std::vector<mglText> &leg, mreal x, mreal y, const
        if(strchr(font,'#'))    // draw bounding box\r
        {\r
                SetPenPal("k-");\r
-               long k1=AddPnt(&M,mglPoint(x,y,Depth/MGL_FEPSILON),c1,q,1,0);\r
-               long k2=AddPnt(&M,mglPoint(x+w*ncol,y,Depth/MGL_FEPSILON),c1,q,1,0);\r
-               long k3=AddPnt(&M,mglPoint(x,y+h*nrow,Depth/MGL_FEPSILON),c1,q,1,0);\r
-               long k4=AddPnt(&M,mglPoint(x+w*ncol,y+h*nrow,Depth/MGL_FEPSILON),c1,q,1,0);\r
+               long k1=AddPnt(&M,mglPoint(x,y,Depth/1.01),c1,q,1,0);\r
+               long k2=AddPnt(&M,mglPoint(x+w*ncol,y,Depth/1.01),c1,q,1,0);\r
+               long k3=AddPnt(&M,mglPoint(x,y+h*nrow,Depth/1.01),c1,q,1,0);\r
+               long k4=AddPnt(&M,mglPoint(x+w*ncol,y+h*nrow,Depth/1.01),c1,q,1,0);\r
                quad_plot(k1,k2,k3,k4);\r
                k1=CopyNtoC(k1,c2);     k2=CopyNtoC(k2,c2);\r
                k3=CopyNtoC(k3,c2);     k4=CopyNtoC(k4,c2);\r
@@ -944,10 +966,10 @@ void mglCanvas::Legend(const std::vector<mglText> &leg, mreal x, mreal y, const
                if(!leg[i].stl.empty()) line_plot(k1,k2);\r
                if(m)   for(j=0;j<LegendMarks;j++)\r
                {\r
-                       p = mglPoint(x+ix*w+0.1f*ll + (j+1)*0.8f*ll/(1.+LegendMarks),y+iy*h+0.45*h,Depth);\r
+                       p.Set(x+ix*w+0.1f*ll + (j+1)*0.8f*ll/(1.+LegendMarks),y+iy*h+0.45*h,Depth);\r
                        mark_plot(AddPnt(&M,p,CDef,q,-1,0),m);\r
                }\r
-               p = mglPoint(x+ix*w+((!leg[i].stl.empty())?ll:0.01*iw), y+iy*h+0.15*h, Depth);\r
+               p.Set(x+ix*w+((!leg[i].stl.empty())?ll:0.01*iw), y+iy*h+0.15*h, Depth);\r
                text_plot(AddPnt(&M,p,-1,q,-1,0), leg[i].text.c_str(), ff, size,0,cc);\r
        }\r
        Pop();  EndGroup();     delete []ff;\r
@@ -997,7 +1019,7 @@ void mglCanvas::Table(mreal x, mreal y, HCDT val, const wchar_t *text, const cha
        x = x*(inW-w)+B.x-inW/2;\r
        y = y*(inH-h*m)+B.y-inH/2;\r
 \r
-       mglPoint p,q=mglPoint(NAN,NAN);\r
+       mglPoint p,q(NAN,NAN);\r
        mreal xx,yy;\r
        if(grid)        // draw bounding box\r
        {\r
index 0add529ba6c26a3950550aafa41511613218524c..76f84487520ffa71edb484d0cb6509f28a0ee4cf 100644 (file)
@@ -43,12 +43,12 @@ void MGL_EXPORT mgl_calc_scr(HMGL gr, double x, double y, double z, int *xs, int
 {      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->CalcScr(mglPoint(x,y,z),xs,ys);      }\r
 void MGL_EXPORT mgl_set_obj_id(HMGL gr, int id)\r
 {      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->SetObjId(id);        }\r
-int MGL_EXPORT_PURE mgl_get_obj_id(HMGL gr, int x, int y)\r
+int MGL_EXPORT mgl_get_obj_id(HMGL gr, int x, int y)\r
 {      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   return g?g->GetObjId(x,y):-1;   }\r
-int MGL_EXPORT_PURE mgl_get_spl_id(HMGL gr, int x, int y)\r
+int MGL_EXPORT mgl_get_spl_id(HMGL gr, int x, int y)\r
 {      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   return g?g->GetSplId(x,y):-1;   }\r
 //-----------------------------------------------------------------------------\r
-long MGL_EXPORT_PURE mgl_is_active(HMGL gr, int xs, int ys, int d)\r
+long MGL_EXPORT mgl_is_active(HMGL gr, int xs, int ys, int d)\r
 {\r
        if(d<=0)        d=1;\r
        for(size_t i=0;i<gr->Act.size();i++)\r
@@ -58,14 +58,14 @@ long MGL_EXPORT_PURE mgl_is_active(HMGL gr, int xs, int ys, int d)
        }\r
        return -1;\r
 }\r
-long MGL_EXPORT_PURE mgl_is_active_(uintptr_t *gr, int *xs, int *ys, int *d)\r
+long MGL_EXPORT mgl_is_active_(uintptr_t *gr, int *xs, int *ys, int *d)\r
 {      return mgl_is_active(_GR_, *xs, *ys, *d);       }\r
 //-----------------------------------------------------------------------------\r
 int MGL_EXPORT mgl_new_frame(HMGL gr)\r
 {      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   return g?g->NewFrame():-1;      }\r
 void MGL_EXPORT mgl_end_frame(HMGL gr)\r
 {      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->EndFrame();  }\r
-int MGL_EXPORT_PURE mgl_get_num_frame(HMGL gr)\r
+int MGL_EXPORT mgl_get_num_frame(HMGL gr)\r
 {      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   return g?g->GetNumFrame():0;    }\r
 void MGL_EXPORT mgl_reset_frames(HMGL gr)\r
 {      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->ResetFrames();       }\r
@@ -82,12 +82,11 @@ void MGL_EXPORT mgl_clear_frame(HMGL gr)
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_set_transp_type(HMGL gr, int type)\r
 {      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->SetTranspType(type); }\r
-void MGL_EXPORT mgl_set_alpha(HMGL gr, int enable)\r
-{      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->Alpha(enable);       }\r
+void MGL_EXPORT mgl_set_alpha(HMGL gr, int enable)     {       gr->Alpha(enable);      }\r
 void MGL_EXPORT mgl_set_fog(HMGL gr, double d, double dz)\r
-{      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->Fog(d,dz);           }\r
-void MGL_EXPORT mgl_set_light(HMGL gr, int enable)\r
-{      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->Light(enable);       }\r
+{      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->Fog(d,dz);   }\r
+void MGL_EXPORT mgl_set_light(HMGL gr, int enable)     {       gr->Light(enable);      }\r
+void MGL_EXPORT mgl_set_attach_light(HMGL gr, int enable)      {       gr->AttachLight(enable);        }\r
 void MGL_EXPORT mgl_set_light_n(HMGL gr, int n, int enable)\r
 {      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->Light(n, enable);    }\r
 void MGL_EXPORT mgl_add_light_ext(HMGL gr, int n, double x, double y, double z, char c, double br, double ap)\r
@@ -182,7 +181,7 @@ void MGL_EXPORT mgl_titlew(HMGL gr, const wchar_t *title, const char *stl, doubl
 //-----------------------------------------------------------------------------\r
 int MGL_EXPORT mgl_new_frame_(uintptr_t *gr)   {       return _GR_->NewFrame();        }\r
 void MGL_EXPORT mgl_end_frame_(uintptr_t *gr)  {       _GR_->EndFrame();       }\r
-int MGL_EXPORT_PURE mgl_get_num_frame_(uintptr_t *gr)  {       return _GR_->GetNumFrame();     }\r
+int MGL_EXPORT mgl_get_num_frame_(uintptr_t *gr)       {       return _GR_->GetNumFrame();     }\r
 void MGL_EXPORT mgl_reset_frames_(uintptr_t *gr)       {       _GR_->ResetFrames();    }\r
 void MGL_EXPORT mgl_get_frame_(uintptr_t *gr, int *i)  {       _GR_->GetFrame(*i);     }\r
 void MGL_EXPORT mgl_set_frame_(uintptr_t *gr, int *i)  {       _GR_->SetFrame(*i);     }\r
@@ -194,6 +193,7 @@ void MGL_EXPORT mgl_set_transp_type_(uintptr_t *gr, int *type)              {       _GR_->SetTrans
 void MGL_EXPORT mgl_set_alpha_(uintptr_t *gr, int *enable)                     {       _GR_->Alpha(*enable);   }\r
 void MGL_EXPORT mgl_set_fog_(uintptr_t *gr, mreal *d, mreal *dz)       {       _GR_->Fog(*d, *dz);             }\r
 void MGL_EXPORT mgl_set_light_(uintptr_t *gr, int *enable)                     {       _GR_->Light(*enable);   }\r
+void MGL_EXPORT mgl_set_attach_light_(uintptr_t *gr, int *enable)      {       _GR_->AttachLight(*enable);     }\r
 void MGL_EXPORT mgl_set_light_n_(uintptr_t *gr, int *n, int *enable)\r
 {      _GR_->Light(*n, *enable);       }\r
 void MGL_EXPORT mgl_add_light_(uintptr_t *gr, int *n, mreal *x, mreal *y, mreal *z)\r
@@ -266,14 +266,20 @@ void MGL_EXPORT mgl_calc_xyz_(uintptr_t *gr, int *xs, int *ys, mreal *x, mreal *
 void MGL_EXPORT mgl_calc_scr_(uintptr_t *gr, mreal *x, mreal *y, mreal *z, int *xs, int *ys)\r
 {      _GR_->CalcScr(mglPoint(*x,*y,*z),xs,ys);        }\r
 void MGL_EXPORT mgl_set_obj_id_(uintptr_t *gr, int *id)                {       _GR_->SetObjId(*id);    }\r
-int MGL_EXPORT_PURE mgl_get_obj_id_(uintptr_t *gr, int *x, int *y)     {       return _GR_->GetObjId(*x,*y);   }\r
-int MGL_EXPORT_PURE mgl_get_spl_id_(uintptr_t *gr, int *x, int *y)     {       return _GR_->GetSplId(*x,*y);   }\r
+int MGL_EXPORT mgl_get_obj_id_(uintptr_t *gr, int *x, int *y)  {       return _GR_->GetObjId(*x,*y);   }\r
+int MGL_EXPORT mgl_get_spl_id_(uintptr_t *gr, int *x, int *y)  {       return _GR_->GetSplId(*x,*y);   }\r
 //-----------------------------------------------------------------------------\r
+double mgl_size_scl = 1;\r
 HMGL MGL_EXPORT mgl_create_graph(int width, int height)\r
 {      return new mglCanvas(width,height);     }\r
 void MGL_EXPORT mgl_delete_graph(HMGL gr)      {       if(gr)  delete gr;      }\r
+void MGL_EXPORT mgl_set_size_scl(double scl){  if(scl>0)       mgl_size_scl = scl;     }\r
 void MGL_EXPORT mgl_set_size(HMGL gr, int width, int height)\r
-{      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->SetSize(width, height);      }\r
+{\r
+       mglCanvas *g = dynamic_cast<mglCanvas *>(gr);\r
+       width = int(mgl_size_scl*width);        height = int(mgl_size_scl*height);\r
+       if(g)   g->SetSize(width, height);\r
+}\r
 void MGL_EXPORT mgl_set_def_param(HMGL gr)\r
 {      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->DefaultPlotParam();  }\r
 void MGL_EXPORT mgl_combine_gr(HMGL gr, HMGL in)\r
@@ -353,8 +359,9 @@ void MGL_EXPORT mgl_set_legend_marks(HMGL gr, int num)
 uintptr_t MGL_EXPORT mgl_create_graph_(int *width, int *height)\r
 {      return uintptr_t(new mglCanvas(*width,*height));        }\r
 void MGL_EXPORT mgl_delete_graph_(uintptr_t *gr)       {       delete _GR_;    }\r
+void MGL_EXPORT mgl_set_size_scl_(double *scl) {       mgl_set_size_scl(*scl); }\r
 void MGL_EXPORT mgl_set_size_(uintptr_t *gr, int *width, int *height)\r
-{      _GR_->SetSize(*width,*height);  }\r
+{      mgl_set_size(_GR_,*width,*height);      }\r
 void MGL_EXPORT mgl_set_def_param_(uintptr_t *gr)      {       _GR_->DefaultPlotParam();       }\r
 void MGL_EXPORT mgl_combine_gr_(uintptr_t *gr, uintptr_t *in)\r
 {      _GR_->Combine((mglCanvas *)in); }\r
@@ -446,10 +453,10 @@ void MGL_EXPORT mgl_set_legend_marks_(uintptr_t *gr, int *num)
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_wnd_set_delay(HMGL gr, double dt)\r
 {      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->SetDelay(dt);        }\r
-double MGL_EXPORT_PURE mgl_wnd_get_delay(HMGL gr)\r
+double MGL_EXPORT mgl_wnd_get_delay(HMGL gr)\r
 {      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   return g?g->GetDelay():0;       }\r
 void MGL_EXPORT mgl_wnd_set_delay_(uintptr_t *gr, mreal *dt)   {       _GR_->SetDelay(*dt);    }\r
-double MGL_EXPORT_PURE mgl_wnd_get_delay_(uintptr_t *gr)       {       return _GR_->GetDelay();        }\r
+double MGL_EXPORT mgl_wnd_get_delay_(uintptr_t *gr)    {       return _GR_->GetDelay();        }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_set_plotfactor(HMGL gr, double val)\r
 {      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->SetPlotFactor(val);  }\r
index 3457c7d82a54755676015202082808ee8de548d3..7967e67fc0a016bbfb2e750d480924abb77636f3 100644 (file)
@@ -88,7 +88,7 @@ void MGL_EXPORT mglStartThreadV(void *(*func)(void *), long n, dual *a, const vo
 mdual MGL_EXPORT_CONST mgl_expi(dual a)\r
 {\r
        dual r = exp(dual(0,1)*dual(a));\r
-       return r.real()+r.imag()*_Complex_I;\r
+       return r.real()+r.imag()*mgl_I;\r
 }\r
 //-----------------------------------------------------------------------------\r
 MGL_NO_EXPORT void *mgl_csmth_x(void *par)\r
@@ -560,7 +560,7 @@ void MGL_EXPORT mgl_datac_roll(HADT dd, char dir, long num)
        dual *b,*a=dd->a;\r
        if(dir=='z' && nz>1)\r
        {\r
-               d = num>0 ? num%nz : (num+nz*(1+num/nz))%nz;\r
+               d = num>0 ? num%nz : (num+nz*(1-num/nz))%nz;\r
                if(d==0)        return;         // nothing to do\r
                b = new dual[nx*ny*nz];\r
                memcpy(b,a+nx*ny*d,nx*ny*(nz-d)*sizeof(dual));\r
@@ -569,7 +569,7 @@ void MGL_EXPORT mgl_datac_roll(HADT dd, char dir, long num)
        }\r
        if(dir=='y' && ny>1)\r
        {\r
-               d = num>0 ? num%ny : (num+ny*(1+num/ny))%ny;\r
+               d = num>0 ? num%ny : (num+ny*(1-num/ny))%ny;\r
                if(d==0)        return;         // nothing to do\r
                b = new dual[nx*ny*nz];\r
                memcpy(b,a+nx*d,(nx*ny*nz-nx*d)*sizeof(dual));\r
@@ -580,7 +580,7 @@ void MGL_EXPORT mgl_datac_roll(HADT dd, char dir, long num)
        }\r
        if(dir=='x' && nx>1)\r
        {\r
-               d = num>0 ? num%nx : (num+nx*(1+num/nx))%nx;\r
+               d = num>0 ? num%nx : (num+nx*(1-num/nx))%nx;\r
                if(d==0)        return;         // nothing to do\r
                b = new dual[nx*ny*nz];\r
                memcpy(b,a+d,(nx*ny*nz-d)*sizeof(dual));\r
@@ -630,23 +630,23 @@ void MGL_EXPORT mgl_datac_mirror_(uintptr_t *d, const char *dir,int l)
 {      char *s=new char[l+1];  memcpy(s,dir,l);        s[l]=0;\r
        mgl_datac_mirror(_DC_,s);       delete []s;     }\r
 //-----------------------------------------------------------------------------\r
-dual MGL_EXPORT_PURE mglSpline3Cs(const dual *a, long nx, long ny, long nz, mreal x, mreal y, mreal z)\r
+dual MGL_EXPORT mglSpline3Cs(const dual *a, long nx, long ny, long nz, mreal x, mreal y, mreal z)\r
 {      return mglSpline3st<dual>(a,nx,ny,nz,x,y,z);    }\r
 //-----------------------------------------------------------------------------\r
-dual MGL_EXPORT_PURE mglSpline3C(const dual *a, long nx, long ny, long nz, mreal x, mreal y, mreal z,dual *dx, dual *dy, dual *dz)\r
+dual MGL_EXPORT mglSpline3C(const dual *a, long nx, long ny, long nz, mreal x, mreal y, mreal z,dual *dx, dual *dy, dual *dz)\r
 {      return mglSpline3t<dual>(a,nx,ny,nz,x,y,z,dx,dy,dz);    }\r
 //-----------------------------------------------------------------------------\r
-dual MGL_EXPORT_PURE mglLinearC(const dual *a, long nx, long ny, long nz, mreal x, mreal y, mreal z)\r
+dual MGL_EXPORT mglLinearC(const dual *a, long nx, long ny, long nz, mreal x, mreal y, mreal z)\r
 {      return mglLineart<dual>(a,nx,ny,nz,x,y,z);      }\r
 //-----------------------------------------------------------------------------\r
-mdual MGL_EXPORT_PURE mgl_datac_spline(HCDT d, mreal x,mreal y,mreal z)\r
+mdual MGL_EXPORT mgl_datac_spline(HCDT d, mreal x,mreal y,mreal z)\r
 {\r
        const mglDataC *dd=dynamic_cast<const mglDataC *>(d);\r
        dual r = dd ? mglSpline3st<dual>(dd->a,dd->nx,dd->ny,dd->nz,x,y,z) : mgl_data_spline(d,x,y,z);\r
-       return r.real()+r.imag()*_Complex_I;\r
+       return r.real()+r.imag()*mgl_I;\r
 }\r
 //-----------------------------------------------------------------------------\r
-mdual MGL_EXPORT_PURE mgl_datac_spline_ext(HCDT d, mreal x,mreal y,mreal z, dual *dx,dual *dy,dual *dz)\r
+mdual MGL_EXPORT mgl_datac_spline_ext(HCDT d, mreal x,mreal y,mreal z, dual *dx,dual *dy,dual *dz)\r
 {\r
        const mglDataC *dd=dynamic_cast<const mglDataC *>(d);\r
        if(!dd)\r
@@ -657,15 +657,15 @@ mdual MGL_EXPORT_PURE mgl_datac_spline_ext(HCDT d, mreal x,mreal y,mreal z, dual
                return res;\r
        }\r
        dual r = mglSpline3t<dual>(dd->a,dd->nx,dd->ny,dd->nz,x,y,z,dx,dy,dz);\r
-       return r.real()+r.imag()*_Complex_I;\r
+       return r.real()+r.imag()*mgl_I;\r
 }\r
 //-----------------------------------------------------------------------------\r
-mdual MGL_EXPORT_PURE mgl_datac_spline_(uintptr_t *d, mreal *x,mreal *y,mreal *z)\r
+mdual MGL_EXPORT mgl_datac_spline_(uintptr_t *d, mreal *x,mreal *y,mreal *z)\r
 {      return mgl_datac_spline(_DA_(d),*x,*y,*z);      }\r
-mdual MGL_EXPORT_PURE mgl_datac_spline_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, dual *dx,dual *dy,dual *dz)\r
+mdual MGL_EXPORT mgl_datac_spline_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, dual *dx,dual *dy,dual *dz)\r
 {      return mgl_datac_spline_ext(_DA_(d),*x,*y,*z,dx,dy,dz); }\r
 //-----------------------------------------------------------------------------\r
-mdual MGL_EXPORT_PURE mgl_datac_linear_ext(HCDT d, mreal x,mreal y,mreal z, dual *dx,dual *dy,dual *dz)\r
+mdual MGL_EXPORT mgl_datac_linear_ext(HCDT d, mreal x,mreal y,mreal z, dual *dx,dual *dy,dual *dz)\r
 {\r
        long kx=long(x), ky=long(y), kz=long(z);\r
        dual b0,b1;\r
@@ -708,14 +708,14 @@ mdual MGL_EXPORT_PURE mgl_datac_linear_ext(HCDT d, mreal x,mreal y,mreal z, dual
        if(dy)  *dy = ky>=0?aa[dn]-aa[0]:0;\r
        if(dz)  *dz = b1-b0;\r
        dual r = b0 + z*(b1-b0);\r
-       return r.real()+r.imag()*_Complex_I;\r
+       return r.real()+r.imag()*mgl_I;\r
 }\r
-mdual MGL_EXPORT_PURE mgl_datac_linear(HCDT d, mreal x,mreal y,mreal z)\r
+mdual MGL_EXPORT mgl_datac_linear(HCDT d, mreal x,mreal y,mreal z)\r
 {      return mgl_datac_linear_ext(d, x,y,z, 0,0,0);   }\r
 //-----------------------------------------------------------------------------\r
-mdual MGL_EXPORT_PURE mgl_datac_linear_(uintptr_t *d, mreal *x,mreal *y,mreal *z)\r
+mdual MGL_EXPORT mgl_datac_linear_(uintptr_t *d, mreal *x,mreal *y,mreal *z)\r
 {      return mgl_datac_linear(_DA_(d),*x,*y,*z);      }\r
-mdual MGL_EXPORT_PURE mgl_datac_linear_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, dual *dx,dual *dy,dual *dz)\r
+mdual MGL_EXPORT mgl_datac_linear_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, dual *dx,dual *dy,dual *dz)\r
 {      return mgl_datac_linear_ext(_DA_(d),*x,*y,*z,dx,dy,dz); }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_datac_crop(HADT d, long n1, long n2, char dir)\r
@@ -726,6 +726,7 @@ void MGL_EXPORT mgl_datac_crop(HADT d, long n1, long n2, char dir)
        switch(dir)\r
        {\r
        case 'x':\r
+               if(n1>=nx)      break;\r
                n2 = n2>0 ? n2 : nx+n2;\r
                if(n2<0 || n2>=nx || n2<n1)     n2 = nx;\r
                nn = n2-n1;     b = new dual[nn*ny*nz];\r
@@ -736,6 +737,7 @@ void MGL_EXPORT mgl_datac_crop(HADT d, long n1, long n2, char dir)
                d->a = b;       d->link=false;  d->NewId();\r
                break;\r
        case 'y':\r
+               if(n1>=ny)      break;\r
                n2 = n2>0 ? n2 : ny+n2;\r
                if(n2<0 || n2>=ny || n2<n1)     n2 = ny;\r
                nn = n2-n1;     b = new dual[nn*nx*nz];\r
@@ -746,6 +748,7 @@ void MGL_EXPORT mgl_datac_crop(HADT d, long n1, long n2, char dir)
                d->a = b;       d->link=false;\r
                break;\r
        case 'z':\r
+               if(n1>=nz)      break;\r
                n2 = n2>0 ? n2 : nz+n2;\r
                if(n2<0 || n2>=nz || n2<n1)     n2 = nz;\r
                nn = n2-n1;     b = new dual[nn*nx*ny];\r
@@ -861,12 +864,12 @@ mdual MGL_EXPORT mgl_datac_get_value(HCDT dat, long i, long j, long k)
                return NAN;\r
        const mglDataC *d = dynamic_cast<const mglDataC*>(dat);\r
        dual r = d ? d->a[i0] : dual(dat->vthr(i0),0);\r
-       return r.real()+r.imag()*_Complex_I;\r
+       return r.real()+r.imag()*mgl_I;\r
 }\r
 mdual MGL_EXPORT mgl_datac_get_value_(uintptr_t *d, int *i, int *j, int *k)\r
 {      return mgl_datac_get_value(_DA_(d),*i,*j,*k);   }\r
 //-----------------------------------------------------------------------------\r
-MGL_EXPORT_PURE dual *mgl_datac_data(HADT dat) {       return dat->a;  }\r
+MGL_EXPORT dual *mgl_datac_data(HADT dat)      {       return dat->a;  }\r
 //-----------------------------------------------------------------------------\r
 MGL_EXPORT dual *mgl_datac_value(HADT dat, long i,long j,long k)\r
 {      register long ii=i*dat->nx*(j+dat->ny*k);\r
@@ -874,47 +877,27 @@ MGL_EXPORT dual *mgl_datac_value(HADT dat, long i,long j,long k)
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_datac_join(HADT d, HCDT v)\r
 {\r
-       register long nx=d->nx, ny=d->ny, nz=d->nz;\r
+       long nx=d->nx, ny=d->ny, nz=d->nz, k=nx*ny*nz;\r
        const mglDataC *mv = dynamic_cast<const mglDataC *>(v);\r
-       long vx=v->GetNx(), vy=v->GetNy(), vz=v->GetNz(), k=nx*ny*nz;\r
+       long vx=v->GetNx(), vy=v->GetNy(), vz=v->GetNz(), m = vx*vy*vz;\r
 \r
-       if(nx==vx && ny==vy && (nz>1 || vz>1))\r
-       {\r
-               dual *b = new dual[nx*ny*(nz+vz)];\r
-               memcpy(b,d->a,nx*ny*nz*sizeof(dual));\r
-               if(mv)  memcpy(b+nx*ny*nz,mv->a,nx*ny*vz*sizeof(dual));\r
-               else\r
-#pragma omp parallel for\r
-                       for(long i=0;i<nx*ny*vz;i++)    b[k+i] = v->vthr(i);\r
-               if(!d->link)    delete []d->a;  d->nz += vz;\r
-               d->a = b;       d->link=false;  d->NewId();\r
-       }\r
-       else if(nx==vx && (ny>1 || vy>1))\r
+       if(nx==vx && ny==vy && (nz>1 || vz>1))  d->nz += vz;\r
+       else\r
        {\r
                ny *= nz;       vy *= vz;\r
-               dual *b = new dual[nx*(ny+vy)];\r
-               memcpy(b,d->a,nx*ny*sizeof(dual));\r
-               if(mv)  memcpy(b+nx*ny,mv->a,nx*vy*sizeof(dual));\r
+               if(nx==vx && (ny>1 || vy>1))\r
+               {       d->nz = 1;      d->ny = ny+vy;  }\r
                else\r
-#pragma omp parallel for\r
-                       for(long i=0;i<nx*vy;i++)       b[k+i] = v->vthr(i);\r
-               if(!d->link)    delete []d->a;\r
-               d->nz = 1;      d->ny = ny+vy;\r
-               d->a = b;       d->link=false;  d->NewId();\r
+               {       d->ny = d->nz = 1;      d->nx = k+m;    }\r
        }\r
+       dual *b = new dual[k+m];\r
+       memcpy(b,d->a,k*sizeof(dual));\r
+       if(mv)  memcpy(b+k,mv->a,m*sizeof(dual));\r
        else\r
-       {\r
-               nx *= ny*nz;    vx *= vy*vz;\r
-               dual *b = new dual[nx+vx];\r
-               memcpy(b,d->a,nx*sizeof(dual));\r
-               if(mv)  memcpy(b+nx,mv->a,vx*sizeof(dual));\r
-               else\r
 #pragma omp parallel for\r
-                       for(long i=0;i<vx;i++)  b[k+i] = v->vthr(i);\r
-               if(!d->link)    delete []d->a;\r
-               d->nz = d->ny = 1;      d->nx = nx+vx;\r
-               d->a = b;       d->link=false;  d->NewId();\r
-       }\r
+               for(long i=0;i<m;i++)   b[k+i] = v->vthr(i);\r
+       if(!d->link)    delete []d->a;\r
+       d->a = b;       d->link=false;  d->NewId();\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_datac_join_(uintptr_t *d, uintptr_t *val)\r
@@ -1171,8 +1154,163 @@ mdual MGL_EXPORT mgl_gsplinec(HCDT c, mreal dx, dual *d1, dual *d2)
                if(d2)  *d2 = 2*c->v(5*i+3)+6*dx*c->v(5*i+4);\r
                res = c->v(5*i+1)+dx*(c->v(5*i+2)+dx*(c->v(5*i+3)+dx*c->v(5*i+4)));\r
        }\r
-       return res.real()+res.imag()*_Complex_I;\r
+       return res.real()+res.imag()*mgl_I;\r
 }\r
 mdual MGL_EXPORT mgl_gsplinec_(uintptr_t *c, mreal *dx, dual *d1, dual *d2)\r
 {      return mgl_gsplinec(_DA_(c),*dx,d1,d2); }\r
 //-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_datac_refill_gs(HADT dat, HCDT xdat, HCDT vdat, mreal x1, mreal x2, long sl)\r
+{\r
+       HADT coef = mgl_gsplinec_init(xdat, vdat);\r
+       if(!coef)       return; // incompatible dimensions\r
+       const long nx = dat->nx, nn=dat->ny*dat->nz;\r
+       mreal x0 = x1-xdat->v(0), dx = (x2-x1)/(nx-1);\r
+#pragma omp parallel for\r
+       for(long i=0;i<nx;i++)\r
+       {\r
+               register dual d = mgl_gsplinec(coef,x0+dx*i,0,0);\r
+               if(sl<0)        for(long j=0;j<nn;j++)  dat->a[i+j*nx] = d;\r
+               else    dat->a[i+sl*nx] = d;\r
+       }\r
+       mgl_delete_datac(coef);\r
+}\r
+//-----------------------------------------------------------------------------\r
+mreal MGL_NO_EXPORT mgl_index_1(mreal v, HCDT dat);\r
+void MGL_EXPORT mgl_datac_refill_x(HADT dat, HCDT xdat, HCDT vdat, mreal x1, mreal x2, long sl)\r
+{\r
+       long nx=dat->nx,mx=vdat->GetNx(),nn=dat->ny*dat->nz;\r
+       if(mx!=xdat->GetNx())   return; // incompatible dimensions\r
+       mreal dx = (x2-x1)/(nx-1);\r
+#pragma omp parallel for\r
+       for(long i=0;i<nx;i++)\r
+       {\r
+               register mreal u = mgl_index_1(x1+dx*i,xdat);\r
+               register dual d = mgl_datac_spline(vdat,u,0,0);\r
+               if(sl<0)        for(long j=0;j<nn;j++)  dat->a[i+j*nx] = d;\r
+               else    dat->a[i+sl*nx] = d;\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_datac_refill_xy(HADT dat, HCDT xdat, HCDT ydat, HCDT vdat, mreal x1, mreal x2, mreal y1, mreal y2, long sl)\r
+{\r
+       long nx=dat->nx,ny=dat->ny,nz=dat->nz,mx=vdat->GetNx(),my=vdat->GetNy(),nn=nx*ny;\r
+       bool both=(xdat->GetNN()==vdat->GetNN() && ydat->GetNN()==vdat->GetNN());\r
+       if(!both && (xdat->GetNx()!=mx || ydat->GetNx()!=my))   return; // incompatible dimensions\r
+       mreal dx = (x2-x1)/(nx-1), dy = (y2-y1)/(ny-1);\r
+       if(both)\r
+       {\r
+#pragma omp parallel for\r
+               for(long i=0;i<nn*nz;i++)       dat->a[i]=NAN;\r
+#pragma omp parallel for collapse(2)\r
+               for(long j=0;j<my-1;j++)        for(long i=0;i<mx-1;i++)\r
+               {\r
+                       long i0 = i+mx*j;\r
+                       mreal vx0 = (xdat->vthr(i0)-x1)/dx, vy0 = (ydat->vthr(i0)-y1)/dy;\r
+                       mreal vx1 = (xdat->vthr(i0+1)-x1)/dx, vy1 = (ydat->vthr(i0+1)-y1)/dy;\r
+                       mreal vx2 = (xdat->vthr(i0+mx)-x1)/dx, vy2 = (ydat->vthr(i0+mx)-y1)/dy;\r
+                       mreal vx3 = (xdat->vthr(i0+mx+1)-x1)/dx, vy3 = (ydat->vthr(i0+mx+1)-y1)/dy;\r
+                       long xx1 = long(mgl_min( mgl_min(vx0,vx1), mgl_min(vx2,vx3) )); // bounding box\r
+                       long yy1 = long(mgl_min( mgl_min(vy0,vy1), mgl_min(vy2,vy3) ));\r
+                       long xx2 = long(mgl_max( mgl_max(vx0,vx1), mgl_max(vx2,vx3) ));\r
+                       long yy2 = long(mgl_max( mgl_max(vy0,vy1), mgl_max(vy2,vy3) ));\r
+                       xx1=mgl_max(xx1,0);     xx2=mgl_min(xx2,nx-1);\r
+                       yy1=mgl_max(yy1,0);     yy2=mgl_min(yy2,ny-1);\r
+                       if(xx1>xx2 || yy1>yy2)  continue;\r
+\r
+                       mreal d1x = vx1-vx0, d1y = vy1-vy0;\r
+                       mreal d2x = vx2-vx0, d2y = vy2-vy0;\r
+                       mreal d3x = vx3+vx0-vx1-vx2, d3y = vy3+vy0-vy1-vy2;\r
+                       mreal dd = d1x*d2y-d1y*d2x;\r
+                       mreal dsx =-4*(d2y*d3x - d2x*d3y)*d1y;\r
+                       mreal dsy = 4*(d2y*d3x - d2x*d3y)*d1x;\r
+\r
+                       for(long jj=yy1;jj<=yy2;jj++)   for(long ii=xx1;ii<=xx2;ii++)\r
+                       {\r
+                               mreal xx = (ii-vx0), yy = (jj-vy0);\r
+                               mreal s = dsx*xx + dsy*yy + (dd+d3y*xx-d3x*yy)*(dd+d3y*xx-d3x*yy);\r
+                               if(s>=0)\r
+                               {\r
+                                       s = sqrt(s);\r
+                                       mreal qu = d3x*yy - d3y*xx + dd + s;\r
+                                       mreal qv = d3y*xx - d3x*yy + dd + s;\r
+                                       mreal u = 2.f*(d2y*xx - d2x*yy)/qu;\r
+                                       mreal v = 2.f*(d1x*yy - d1y*xx)/qv;\r
+                                       if(u*(1.f-u)<0.f || v*(1.f-v)<0.f)      // first root bad\r
+                                       {\r
+                                               qu = d3x*yy - d3y*xx + dd - s;\r
+                                               qv = d3y*xx - d3x*yy + dd - s;\r
+                                               u = 2.f*(d2y*xx - d2x*yy)/qu;\r
+                                               v = 2.f*(d1x*yy - d1y*xx)/qv;\r
+                                               if(u*(1.f-u)<0.f || v*(1.f-v)<0.f)      continue;       // second root bad\r
+                                       }\r
+                                       i0 = ii+nx*jj;  s = mgl_data_spline(vdat,i+u,j+v,0);\r
+                                       if(sl<0)        for(long k=0;k<nz;k++)  dat->a[i0+k*nn] = s;\r
+                                       else    dat->a[i0+sl*nn] = s;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+       else\r
+       {\r
+               mglData u(nx), v(ny);\r
+#pragma omp parallel for\r
+               for(long i=0;i<nx;i++)  u.a[i] = mgl_index_1(x1+dx*i,xdat);\r
+#pragma omp parallel for\r
+               for(long i=0;i<ny;i++)  v.a[i] = mgl_index_1(y1+dy*i,ydat);\r
+#pragma omp parallel for collapse(2)\r
+               for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
+               {\r
+                       register dual d = mgl_datac_spline(vdat,u.a[i],v.a[j],0);\r
+                       register long i0=i+nx*j;\r
+                       if(sl<0)        for(long k=0;k<nz;k++)  dat->a[i0+k*nn] = d;\r
+                       else    dat->a[i0+sl*nn] = d;\r
+               }\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_datac_refill_xyz(HADT dat, HCDT xdat, HCDT ydat, HCDT zdat, HCDT vdat, mreal x1, mreal x2, mreal y1, mreal y2, mreal z1, mreal z2)\r
+{\r
+       long nx=dat->nx,ny=dat->ny,nz=dat->nz,mx=vdat->GetNx(),my=vdat->GetNy(),mz=vdat->GetNz();\r
+       bool both=(xdat->GetNN()==vdat->GetNN() && ydat->GetNN()==vdat->GetNN() && zdat->GetNN()==vdat->GetNN());\r
+       if(!both && (xdat->GetNx()!=mx || ydat->GetNx()!=my || zdat->GetNx()!=mz))      return; // incompatible dimensions\r
+       const mreal acx=1e-6*fabs(x2-x1), acy=1e-6*fabs(y2-y1), acz=1e-6*fabs(z2-z1);\r
+       if(both)\r
+#pragma omp parallel for collapse(3)\r
+               for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
+               {\r
+                       mreal xx = x1+(x2-x1)*i/(nx-1.),dxx,dxy,dxz,vx,dx=0,dd;\r
+                       mreal yy = y1+(y2-y1)*j/(ny-1.),dyx,dyy,dyz,vy,dy=0;\r
+                       mreal zz = z1+(z2-z1)*k/(nz-1.),dzx,dzy,dzz,vz,dz=0;\r
+                       vx = mgl_data_spline_ext(xdat,dx,dy,dz,&dxx,&dxy,&dxz);\r
+                       vy = mgl_data_spline_ext(ydat,dx,dy,dz,&dyx,&dyy,&dyz);\r
+                       vz = mgl_data_spline_ext(zdat,dx,dy,dz,&dzx,&dzy,&dzz);\r
+                       long count=0;\r
+                       do      // use Newton method to find root\r
+                       {\r
+                               if(count>50)    {       dx=NAN; break;  }       count++;\r
+                               dd = -dxx*dyy*dzz+dxy*dyx*dzz+dxx*dyz*dzy-dxz*dyx*dzy-dxy*dyz*dzx+dxz*dyy*dzx;\r
+                               dx += ((dyz*dzy-dyy*dzz)*(xx-vx)+(dxy*dzz-dxz*dzy)*(yy-vy)+(dxz*dyy-dxy*dyz)*(zz-vz))/dd;\r
+                               dy += ((dyx*dzz-dyz*dzx)*(xx-vx)+(dxz*dzx-dxx*dzz)*(yy-vy)+(dxx*dyz-dxz*dyx)*(zz-vz))/dd;\r
+                               dz += ((dyy*dzx-dyx*dzy)*(xx-vx)+(dxx*dzy-dxy*dzx)*(yy-vy)+(dxy*dyx-dxx*dyy)*(zz-vz))/dd;\r
+                               vx = mgl_data_spline_ext(xdat,dx,dy,dz,&dxx,&dxy,&dxz);\r
+                               vy = mgl_data_spline_ext(ydat,dx,dy,dz,&dyx,&dyy,&dyz);\r
+                               vz = mgl_data_spline_ext(zdat,dx,dy,dz,&dzx,&dzy,&dzz);\r
+                       }       while(fabs(xx-vx)>acx && fabs(yy-vy)>acy && fabs(zz-vz)>acz);   // this valid for linear interpolation\r
+                       dat->a[i+nx*(j+ny*k)] = mgl_isnan(dx)?NAN:mgl_data_spline(vdat,dx,dy,dz);\r
+               }\r
+       else\r
+       {\r
+               mglData u(nx), v(ny), w(nz);\r
+               mreal dx = (x2-x1)/(nx-1), dy = (y2-y1)/(ny-1), dz = (z2-z1)/(nz-1);\r
+#pragma omp parallel for\r
+               for(long i=0;i<nx;i++)  u.a[i] = mgl_index_1(x1+dx*i,xdat);\r
+#pragma omp parallel for\r
+               for(long i=0;i<ny;i++)  v.a[i] = mgl_index_1(y1+dy*i,ydat);\r
+#pragma omp parallel for\r
+               for(long i=0;i<nz;i++)  w.a[i] = mgl_index_1(z1+dz*i,zdat);\r
+#pragma omp parallel for collapse(3)\r
+               for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
+                       dat->a[i+nx*(j+ny*k)] = mgl_datac_spline(vdat,u.a[i],v.a[j],w.a[k]);\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
index 16bae00cc76f3b883554fabebeb1277be04a4d97..b1fc925a20fed99ab43e8dc6221bca2d063aca45 100644 (file)
@@ -22,7 +22,7 @@
 #include "mgl2/evalc.h"\r
 #include "mgl2/thread.h"\r
 #include "interp.hpp"\r
-mglDataC MGL_NO_EXPORT mglFormulaCalcC(const char *str, const std::vector<mglDataA*> &head);\r
+HADT MGL_NO_EXPORT mglFormulaCalcC(const char *str, const std::vector<mglDataA*> &head);\r
 //-----------------------------------------------------------------------------\r
 HADT MGL_EXPORT mgl_datac_trace(HCDT d)\r
 {\r
@@ -53,7 +53,7 @@ HADT MGL_EXPORT mgl_datac_trace(HCDT d)
        return r;\r
 }\r
 uintptr_t MGL_EXPORT mgl_datac_trace_(uintptr_t *d)\r
-{      return uintptr_t(mgl_datac_trace(_DT_));        }\r
+{      return uintptr_t(mgl_datac_trace(_DC_));        }\r
 //-----------------------------------------------------------------------------\r
 HADT MGL_EXPORT mgl_datac_subdata_ext(HCDT d, HCDT xx, HCDT yy, HCDT zz)\r
 {\r
@@ -184,9 +184,9 @@ HADT MGL_EXPORT mgl_datac_subdata(HCDT d, long xx,long yy,long zz)
 }\r
 //-----------------------------------------------------------------------------\r
 uintptr_t MGL_EXPORT mgl_datac_subdata_(uintptr_t *d, int *xx,int *yy,int *zz)\r
-{      return uintptr_t(mgl_datac_subdata(_DT_,*xx,*yy,*zz));  }\r
+{      return uintptr_t(mgl_datac_subdata(_DC_,*xx,*yy,*zz));  }\r
 uintptr_t MGL_EXPORT mgl_datac_subdata_ext_(uintptr_t *d, uintptr_t *xx, uintptr_t *yy, uintptr_t *zz)\r
-{      return uintptr_t(mgl_datac_subdata_ext(_DT_,_DA_(xx),_DA_(yy),_DA_(zz)));       }\r
+{      return uintptr_t(mgl_datac_subdata_ext(_DC_,_DA_(xx),_DA_(yy),_DA_(zz)));       }\r
 //-----------------------------------------------------------------------------\r
 MGL_NO_EXPORT void *mgl_cresize(void *par)\r
 {\r
@@ -225,9 +225,9 @@ HADT MGL_EXPORT mgl_datac_resize_box(HCDT dat, long mx,long my,long mz, mreal x1
 HADT MGL_EXPORT mgl_datac_resize(HCDT d, long mx,long my,long mz)\r
 {      return mgl_datac_resize_box(d, mx,my,mz,0,1,0,1,0,1);   }\r
 uintptr_t MGL_EXPORT mgl_datac_resize_(uintptr_t *d, int *mx,int *my,int *mz)\r
-{      return uintptr_t(mgl_datac_resize(_DT_,*mx,*my,*mz));   }\r
+{      return uintptr_t(mgl_datac_resize(_DC_,*mx,*my,*mz));   }\r
 uintptr_t MGL_EXPORT mgl_datac_resize_box_(uintptr_t *d, int *mx,int *my,int *mz, mreal *x1,mreal *x2, mreal *y1,mreal *y2, mreal *z1,mreal *z2)\r
-{      return uintptr_t(mgl_datac_resize_box(_DT_,*mx,*my,*mz,*x1,*x2,*y1,*y2,*z1,*z2));       }\r
+{      return uintptr_t(mgl_datac_resize_box(_DC_,*mx,*my,*mz,*x1,*x2,*y1,*y2,*z1,*z2));       }\r
 //-----------------------------------------------------------------------------\r
 HADT MGL_EXPORT mgl_datac_combine(HCDT d1, HCDT d2)\r
 {\r
@@ -348,7 +348,7 @@ HADT MGL_EXPORT mgl_datac_sum(HCDT dat, const char *dir)
 }\r
 uintptr_t MGL_EXPORT mgl_datac_sum_(uintptr_t *d, const char *dir,int l)\r
 {      char *s=new char[l+1];  memcpy(s,dir,l);        s[l]=0;\r
-       uintptr_t r=uintptr_t(mgl_datac_sum(_DT_,s));   delete []s;     return r;       }\r
+       uintptr_t r=uintptr_t(mgl_datac_sum(_DC_,s));   delete []s;     return r;       }\r
 //-----------------------------------------------------------------------------\r
 HADT MGL_EXPORT mgl_datac_momentum(HCDT dat, char dir, const char *how)\r
 {\r
@@ -360,9 +360,8 @@ HADT MGL_EXPORT mgl_datac_momentum(HCDT dat, char dir, const char *how)
        mglDataC u(dat);        u.s=L"u";       // NOTE slow !!!\r
        std::vector<mglDataA*> list;\r
        list.push_back(&x);     list.push_back(&y);     list.push_back(&z);     list.push_back(&u);\r
-       mglDataC res=mglFormulaCalcC(how,list);\r
+       HADT res=mglFormulaCalcC(how,list), b=0;\r
 \r
-       mglDataC *b=0;\r
        if(dir=='x')\r
        {\r
                b=new mglDataC(nx);\r
@@ -373,7 +372,7 @@ HADT MGL_EXPORT mgl_datac_momentum(HCDT dat, char dir, const char *how)
                        for(long j=0;j<ny*nz;j++)\r
                        {\r
                                register dual u=dat->vthr(i+nx*j);\r
-                               i0 += u;        i1 += u*res.a[i+nx*j];\r
+                               i0 += u;        i1 += u*res->a[i+nx*j];\r
                        }\r
                        b->a[i] = i0!=mreal(0) ? i1/i0 : 0;\r
                }\r
@@ -388,7 +387,7 @@ HADT MGL_EXPORT mgl_datac_momentum(HCDT dat, char dir, const char *how)
                        for(long k=0;k<nz;k++)  for(long j=0;j<nx;j++)\r
                        {\r
                                register dual u=dat->v(j,i,k);\r
-                               i0 += u;        i1 += u*res.a[j+nx*(i+ny*k)];\r
+                               i0 += u;        i1 += u*res->a[j+nx*(i+ny*k)];\r
                        }\r
                        b->a[i] = i0!=mreal(0) ? i1/i0 : 0;\r
                }\r
@@ -404,16 +403,16 @@ HADT MGL_EXPORT mgl_datac_momentum(HCDT dat, char dir, const char *how)
                        for(long j=0;j<nn;j++)\r
                        {\r
                                register dual u=dat->vthr(j+nn*i);\r
-                               i0 += u;        i1 += u*res.a[j+nn*i];\r
+                               i0 += u;        i1 += u*res->a[j+nn*i];\r
                        }\r
                        b->a[i] = i0!=mreal(0) ? i1/i0 : 0;\r
                }\r
        }\r
-       return b;\r
+       mgl_delete_datac(res);  return b;\r
 }\r
 uintptr_t MGL_EXPORT mgl_datac_momentum_(uintptr_t *d, char *dir, const char *how, int,int l)\r
 {      char *s=new char[l+1];  memcpy(s,how,l);        s[l]=0;\r
-       uintptr_t r=uintptr_t(mgl_datac_momentum(_DT_,*dir, s));        delete []s;     return r;       }\r
+       uintptr_t r=uintptr_t(mgl_datac_momentum(_DC_,*dir, s));        delete []s;     return r;       }\r
 //-----------------------------------------------------------------------------\r
 HADT MGL_EXPORT mgl_datac_evaluate(HCDT dat, HCDT idat, HCDT jdat, HCDT kdat, int norm)\r
 {\r
@@ -446,7 +445,7 @@ HADT MGL_EXPORT mgl_datac_evaluate(HCDT dat, HCDT idat, HCDT jdat, HCDT kdat, in
        return r;\r
 }\r
 uintptr_t MGL_EXPORT mgl_datac_evaluate_(uintptr_t *d, uintptr_t *idat, uintptr_t *jdat, uintptr_t *kdat, int *norm)\r
-{      return uintptr_t(mgl_datac_evaluate(_DT_,_DA_(idat),_DA_(jdat),_DA_(kdat),*norm));      }\r
+{      return uintptr_t(mgl_datac_evaluate(_DC_,_DA_(idat),_DA_(jdat),_DA_(kdat),*norm));      }\r
 //-----------------------------------------------------------------------------\r
 HADT MGL_EXPORT mgl_datac_column(HCDT dat, const char *eq)\r
 {\r
@@ -468,13 +467,157 @@ HADT MGL_EXPORT mgl_datac_column(HCDT dat, const char *eq)
        if(list.size()==0)      return 0;       // no named columns\r
        mglDataV *t = new mglDataV(dat->GetNy(),dat->GetNz());\r
        t->s=L"#$mgl";  list.push_back(t);\r
-       mglDataC *r = new mglDataC;\r
-       r->Set(mglFormulaCalcC(eq,list));\r
+       HADT r = mglFormulaCalcC(eq,list);\r
        for(size_t i=0;i<list.size();i++)       delete list[i];\r
        return r;\r
 }\r
 uintptr_t MGL_EXPORT mgl_datac_column_(uintptr_t *d, const char *eq,int l)\r
 {      char *s=new char[l+1];  memcpy(s,eq,l); s[l]=0;\r
-       uintptr_t r = uintptr_t(mgl_datac_column(_DT_,s));\r
+       uintptr_t r = uintptr_t(mgl_datac_column(_DC_,s));\r
        delete []s;     return r;       }\r
 //-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_datac_mul_dat(HADT d, HCDT a)\r
+{\r
+       long nx=d->nx, ny=d->ny, nz=d->nz;\r
+       long mx=a->GetNx(), my=a->GetNy(), mz=a->GetNz();\r
+       const mglDataC *c = dynamic_cast<const mglDataC*>(a);\r
+       \r
+       if(mz*my*mx==1)\r
+       {\r
+               dual v=c?c->a[0]:a->v(0);\r
+#pragma omp parallel for\r
+               for(long i=0;i<nx*ny*nz;i++)    d->a[i] += v;\r
+       }\r
+       else\r
+       {\r
+               long n=0, m=0;\r
+               if(nz*ny*nx==mz*my*mx)  {       n=nx*ny*nz;     m=1;    }\r
+               else if(ny*nx==my*mx)   {       n=nx*ny;        m=nz;   }\r
+               else if(nx==mx)                 {       n=nx;   m=ny*nz;        }\r
+               if(c)\r
+#pragma omp parallel for collapse(2)\r
+                       for(long k=0;k<m;k++)   for(long i=0;i<n;i++)   d->a[i+n*k] *= c->a[i];\r
+               else\r
+#pragma omp parallel for collapse(2)\r
+                       for(long k=0;k<m;k++)   for(long i=0;i<n;i++)   d->a[i+n*k] *= a->vthr(i);\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_datac_mul_num(HADT d, dual a)\r
+{\r
+       long n=d->GetNN();\r
+#pragma omp parallel for\r
+       for(long i=0;i<n;i++)   d->a[i] *= a;\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_datac_div_dat(HADT d, HCDT a)\r
+{\r
+       long nx=d->nx, ny=d->ny, nz=d->nz;\r
+       long mx=a->GetNx(), my=a->GetNy(), mz=a->GetNz();\r
+       const mglDataC *c = dynamic_cast<const mglDataC*>(a);\r
+       \r
+       if(mz*my*mx==1)\r
+       {\r
+               dual v=c?c->a[0]:a->v(0);\r
+#pragma omp parallel for\r
+               for(long i=0;i<nx*ny*nz;i++)    d->a[i] /= v;\r
+       }\r
+       else\r
+       {\r
+               long n=0, m=0;\r
+               if(nz*ny*nx==mz*my*mx)  {       n=nx*ny*nz;     m=1;    }\r
+               else if(ny*nx==my*mx)   {       n=nx*ny;        m=nz;   }\r
+               else if(nx==mx)                 {       n=nx;   m=ny*nz;        }\r
+               if(c)\r
+#pragma omp parallel for collapse(2)\r
+                       for(long k=0;k<m;k++)   for(long i=0;i<n;i++)   d->a[i+n*k] /= c->a[i];\r
+               else\r
+#pragma omp parallel for collapse(2)\r
+                       for(long k=0;k<m;k++)   for(long i=0;i<n;i++)   d->a[i+n*k] /= a->vthr(i);\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_datac_div_num(HADT d, dual a)\r
+{\r
+       long n=d->GetNN();\r
+#pragma omp parallel for\r
+       for(long i=0;i<n;i++)   d->a[i] /= a;\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_datac_add_dat(HADT d, HCDT a)\r
+{\r
+       long nx=d->nx, ny=d->ny, nz=d->nz;\r
+       long mx=a->GetNx(), my=a->GetNy(), mz=a->GetNz();\r
+       const mglDataC *c = dynamic_cast<const mglDataC*>(a);\r
+       \r
+       if(mz*my*mx==1)\r
+       {\r
+               dual v=c?c->a[0]:a->v(0);\r
+#pragma omp parallel for\r
+               for(long i=0;i<nx*ny*nz;i++)    d->a[i] += v;\r
+       }\r
+       else\r
+       {\r
+               long n=0, m=0;\r
+               if(nz*ny*nx==mz*my*mx)  {       n=nx*ny*nz;     m=1;    }\r
+               else if(ny*nx==my*mx)   {       n=nx*ny;        m=nz;   }\r
+               else if(nx==mx)                 {       n=nx;   m=ny*nz;        }\r
+               if(c)\r
+#pragma omp parallel for collapse(2)\r
+                       for(long k=0;k<m;k++)   for(long i=0;i<n;i++)   d->a[i+n*k] += c->a[i];\r
+               else\r
+#pragma omp parallel for collapse(2)\r
+                       for(long k=0;k<m;k++)   for(long i=0;i<n;i++)   d->a[i+n*k] += a->vthr(i);\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_datac_add_num(HADT d, dual a)\r
+{\r
+       long n=d->GetNN();\r
+#pragma omp parallel for\r
+       for(long i=0;i<n;i++)   d->a[i] += a;\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_datac_sub_dat(HADT d, HCDT a)\r
+{\r
+       long nx=d->nx, ny=d->ny, nz=d->nz;\r
+       long mx=a->GetNx(), my=a->GetNy(), mz=a->GetNz();\r
+       const mglDataC *c = dynamic_cast<const mglDataC*>(a);\r
+       \r
+       if(mz*my*mx==1)\r
+       {\r
+               dual v=c?c->a[0]:a->v(0);\r
+#pragma omp parallel for\r
+               for(long i=0;i<nx*ny*nz;i++)    d->a[i] -= v;\r
+       }\r
+       else\r
+       {\r
+               long n=0, m=0;\r
+               if(nz*ny*nx==mz*my*mx)  {       n=nx*ny*nz;     m=1;    }\r
+               else if(ny*nx==my*mx)   {       n=nx*ny;        m=nz;   }\r
+               else if(nx==mx)                 {       n=nx;   m=ny*nz;        }\r
+               if(c)\r
+#pragma omp parallel for collapse(2)\r
+                       for(long k=0;k<m;k++)   for(long i=0;i<n;i++)   d->a[i+n*k] -= c->a[i];\r
+               else\r
+#pragma omp parallel for collapse(2)\r
+                       for(long k=0;k<m;k++)   for(long i=0;i<n;i++)   d->a[i+n*k] -= a->vthr(i);\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_datac_sub_num(HADT d, dual a)\r
+{\r
+       long n=d->GetNN();\r
+#pragma omp parallel for\r
+       for(long i=0;i<n;i++)   d->a[i] -= a;\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_datac_mul_dat_(uintptr_t *d, uintptr_t *b) {       mgl_datac_mul_dat(_DC_, _DA_(b));       }\r
+void MGL_EXPORT mgl_datac_div_dat_(uintptr_t *d, uintptr_t *b) {       mgl_datac_div_dat(_DC_, _DA_(b));       }\r
+void MGL_EXPORT mgl_datac_add_dat_(uintptr_t *d, uintptr_t *b) {       mgl_datac_add_dat(_DC_, _DA_(b));       }\r
+void MGL_EXPORT mgl_datac_sub_dat_(uintptr_t *d, uintptr_t *b) {       mgl_datac_sub_dat(_DC_, _DA_(b));       }\r
+void MGL_EXPORT mgl_datac_mul_num_(uintptr_t *d, dual *b)              {       mgl_datac_mul_num(_DC_, *b);    }\r
+void MGL_EXPORT mgl_datac_div_num_(uintptr_t *d, dual *b)              {       mgl_datac_div_num(_DC_, *b);    }\r
+void MGL_EXPORT mgl_datac_add_num_(uintptr_t *d, dual *b)              {       mgl_datac_add_num(_DC_, *b);    }\r
+void MGL_EXPORT mgl_datac_sub_num_(uintptr_t *d, dual *b)              {       mgl_datac_sub_num(_DC_, *b);    }\r
+//-----------------------------------------------------------------------------\r
index fa7f3363edc740af4ff1cdcdf2c2f276eaaca2a1..5ddb46280a7001ec57d34707ed6ef475a84f63ea 100644 (file)
@@ -34,7 +34,7 @@
 \r
 inline bool isn(char ch)       {return ch=='\n';}\r
 MGL_NO_EXPORT char *mgl_read_gz(gzFile fp);\r
-mglDataC MGL_NO_EXPORT mglFormulaCalcC(const char *str, const std::vector<mglDataA*> &head);\r
+HADT MGL_NO_EXPORT mglFormulaCalcC(const char *str, const std::vector<mglDataA*> &head);\r
 //-----------------------------------------------------------------------------\r
 HADT MGL_EXPORT mgl_create_datac()     {       return new mglDataC;    }\r
 HADT MGL_EXPORT mgl_create_datac_size(long nx, long ny, long nz){      return new mglDataC(nx,ny,nz);  }\r
@@ -639,7 +639,7 @@ void MGL_EXPORT mgl_datac_modify_vw(HADT d, const char *eq,HCDT vdat,HCDT wdat)
        list.push_back(&x);     list.push_back(&y);     list.push_back(&z);     list.push_back(d);\r
        list.push_back(&v);     list.push_back(&w);     list.push_back(&r);\r
        list.push_back(&i);     list.push_back(&j);     list.push_back(&k);\r
-       d->Set(mglFormulaCalcC(eq,list));       d->s = s;\r
+       d->Move(mglFormulaCalcC(eq,list));      d->s = s;\r
 }\r
 void MGL_EXPORT mgl_datac_modify_vw_(uintptr_t *d, const char *eq, uintptr_t *v, uintptr_t *w,int l)\r
 {      char *s=new char[l+1];  memcpy(s,eq,l); s[l]=0;\r
index 987c5d22787c00befcd79d4823b6837f1337c0e9..d4776d212cfbde10848c513440a50f03ae056a29 100644 (file)
@@ -114,7 +114,7 @@ void MGL_NO_EXPORT mgl_string_curve(mglBase *gr,long f,long ,const long *ff,cons
        for(j=0;j<len;j++)      // draw text\r
        {\r
                L[0] = text[align!=2?j:len-1-j];        s = pt[j+1]-pt[j];      l = !s;\r
-               gr->text_plot(gr->AddPnt(pt[j]+(pos*h)*l,c+dc*i,s,-1,-1),L,fnt,size,0.05,c+dc*j);\r
+               gr->text_plot(gr->AddPnt(pt[j]+(pos*h)*l,c+dc*i,align!=2?s:-s,-1,-1),L,fnt,size,0.05,c+dc*j);\r
        }\r
        delete []wdt;   delete []pt;    delete []fnt;\r
 }\r
@@ -1134,6 +1134,7 @@ void MGL_EXPORT mgl_cont3_(uintptr_t *gr, uintptr_t *a, const char *sch, mreal *
 //     Dens3 series\r
 //\r
 //-----------------------------------------------------------------------------\r
+void MGL_NO_EXPORT mgl_surf_gen(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, HCDT a, const char *sch);\r
 void MGL_EXPORT mgl_dens3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, double sVal, const char *opt)\r
 {\r
        bool both = mgl_isboth(x,y,z,a);\r
@@ -1147,7 +1148,8 @@ void MGL_EXPORT mgl_dens3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const cha
 \r
        _mgl_slice s;\r
        mgl_get_slice(s,x,y,z,a,dir,sVal,both);\r
-       mgl_surfc_xy(gr,&s.x,&s.y,&s.z,&s.a,sch,0);\r
+       mgl_surf_gen(gr, &s.x,&s.y,&s.z,&s.a, 0, sch);\r
+//     mgl_surfc_xy(gr,&s.x,&s.y,&s.z,&s.a,sch,0);\r
        gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -1304,8 +1306,8 @@ long MGL_LOCAL_PURE mgl_find_prev(long i, long pc, long *nn)
 void MGL_NO_EXPORT mgl_axial_plot(mglBase *gr,long pc, mglPoint *ff, long *nn,char dir,mreal cc,int wire)\r
 {\r
        mglPoint a(0,0,1),b,c,p,q1,q2;\r
-       if(dir=='x')    a = mglPoint(1,0,0);\r
-       if(dir=='y')    a = mglPoint(0,1,0);\r
+       if(dir=='x')    a.Set(1,0,0);\r
+       if(dir=='y')    a.Set(0,1,0);\r
        b = !a; c = a^b;\r
 \r
        long p1,p2,p3,p4;\r
@@ -1364,14 +1366,14 @@ void MGL_EXPORT mgl_axial_gen(HMGL gr, mreal val, HCDT a, HCDT x, HCDT y, mreal
                mreal d = (i<n-1)?mgl_d(val,ma->a[i0+n*m*ak],ma->a[i0+1+n*m*ak]):-1;\r
                if(d>=0 && d<1)\r
                {\r
-                       pp[pc] = mglPoint(mx->a[i0]*(1-d)+mx->a[i0+1]*d, my->a[i0]*(1-d)+my->a[i0+1]*d);\r
-                       kk[pc] = mglPoint(i+d,j);       pc++;\r
+                       pp[pc].Set(mx->a[i0]*(1-d)+mx->a[i0+1]*d, my->a[i0]*(1-d)+my->a[i0+1]*d);\r
+                       kk[pc].Set(i+d,j);      pc++;\r
                }\r
                d = (j<m-1)?mgl_d(val,ma->a[i0+n*m*ak],ma->a[i0+n*m*ak+n]):-1;\r
                if(d>=0 && d<1)\r
                {\r
-                       pp[pc] = mglPoint(mx->a[i0]*(1-d)+mx->a[i0+n]*d, my->a[i0]*(1-d)+my->a[i0+n]*d);\r
-                       kk[pc] = mglPoint(i,j+d);       pc++;\r
+                       pp[pc].Set(mx->a[i0]*(1-d)+mx->a[i0+n]*d, my->a[i0]*(1-d)+my->a[i0+n]*d);\r
+                       kk[pc].Set(i,j+d);      pc++;\r
                }\r
        }\r
        else    for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
@@ -1380,14 +1382,14 @@ void MGL_EXPORT mgl_axial_gen(HMGL gr, mreal val, HCDT a, HCDT x, HCDT y, mreal
                mreal d = (i<n-1)?mgl_d(val,va,a->v(i+1,j,ak)):-1;\r
                if(d>=0 && d<1)\r
                {\r
-                       pp[pc] = mglPoint(vx*(1-d)+x->v(i+1,j)*d, vy*(1-d)+y->v(i+1,j)*d);\r
-                       kk[pc] = mglPoint(i+d,j);       pc++;\r
+                       pp[pc].Set(vx*(1-d)+x->v(i+1,j)*d, vy*(1-d)+y->v(i+1,j)*d);\r
+                       kk[pc].Set(i+d,j);      pc++;\r
                }\r
                d = (j<m-1)?mgl_d(val,va,a->v(i,j+1,ak)):-1;\r
                if(d>=0 && d<1)\r
                {\r
-                       pp[pc] = mglPoint(vx*(1-d)+x->v(i,j+1)*d, vy*(1-d)+y->v(i,j+1)*d);\r
-                       kk[pc] = mglPoint(i,j+d);       pc++;\r
+                       pp[pc].Set(vx*(1-d)+x->v(i,j+1)*d, vy*(1-d)+y->v(i,j+1)*d);\r
+                       kk[pc].Set(i,j+d);      pc++;\r
                }\r
        }\r
        // deallocate arrays and finish if no point\r
@@ -1547,12 +1549,12 @@ void MGL_EXPORT mgl_torus(HMGL gr, HCDT r, HCDT z, const char *sch, const char *
                if(mr&&mz)      for(i=0;i<n;i++)\r
                {\r
                        nn[i] = i<n-1 ? i+1 : -1;\r
-                       pp[i] = mglPoint(mr->a[i+n*j], mz->a[i+n*j]);\r
+                       pp[i].Set(mr->a[i+n*j], mz->a[i+n*j]);\r
                }\r
                else    for(i=0;i<n;i++)\r
                {\r
                        nn[i] = i<n-1 ? i+1 : -1;\r
-                       pp[i] = mglPoint(r->v(i,j), z->v(i,j));\r
+                       pp[i].Set(r->v(i,j), z->v(i,j));\r
                }\r
                mgl_axial_plot(gr,n,pp,nn,dir,c,wire);\r
        }\r
index 831568478db8dfdcc28295b952e20dc44bc78427..65629885ef4dd6f43c6433702c2b6e05b11efe33 100644 (file)
@@ -28,8 +28,8 @@ struct mglSegment
                if(v1==v2 && u1==u2)    res=false;      // NOTE: shouldn't be here never
                if(res)
                {
-                       p1 = mglPoint(mgl_data_linear(x,i+u1,j+v1,k), mgl_data_linear(y,i+u1,j+v1,k), mgl_data_linear(z,i+u1,j+v1,k));
-                       p2 = mglPoint(mgl_data_linear(x,i+u2,j+v2,k), mgl_data_linear(y,i+u2,j+v2,k), mgl_data_linear(z,i+u2,j+v2,k));
+                       p1.Set(mgl_data_linear(x,i+u1,j+v1,k), mgl_data_linear(y,i+u1,j+v1,k), mgl_data_linear(z,i+u1,j+v1,k));
+                       p2.Set(mgl_data_linear(x,i+u2,j+v2,k), mgl_data_linear(y,i+u2,j+v2,k), mgl_data_linear(z,i+u2,j+v2,k));
                }
                return res;
        }
index 32e36c530fc0744770f73678493b5a23938f116d..5c48f2815a105c381828bdb7ec049f59d128f9a5 100644 (file)
@@ -31,7 +31,7 @@
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_triplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, const char *opt)\r
 {\r
-       long n = x->GetNx(), m = nums->GetNy();\r
+       long n = x->GetNN(), m = nums->GetNy();\r
        if(mgl_check_trig(gr,nums,x,y,z,a,"TriPlot"))   return;\r
 \r
        long ss=gr->AddTexture(sch);\r
@@ -39,19 +39,19 @@ void MGL_EXPORT mgl_triplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCD
        static int cgid=1;      gr->StartGroup("TriPlot",cgid++);\r
 \r
        bool wire = mglchr(sch,'#');\r
-       long nc = a->GetNx();\r
+       long nc = a->GetNN();\r
        if(nc!=n && nc>=m)      // colors per triangle\r
        {\r
                mglPoint p1,p2,p3,q;\r
                gr->Reserve(m*3);\r
-               for(long i=0;i<m;i++)\r
+               for(long i=0;i<m;i++)   if(nums->v(0,i)>=0 && nums->v(1,i)>=0 && nums->v(2,i)>=0) \r
                {\r
                        register long k1 = long(nums->v(0,i)+0.5);\r
-                       p1 = mglPoint(x->v(k1), y->v(k1), z->v(k1));\r
+                       p1.Set(x->v(k1), y->v(k1), z->v(k1));\r
                        register long k2 = long(nums->v(1,i)+0.5);\r
-                       p2 = mglPoint(x->v(k2), y->v(k2), z->v(k2));\r
+                       p2.Set(x->v(k2), y->v(k2), z->v(k2));\r
                        register long k3 = long(nums->v(2,i)+0.5);\r
-                       p3 = mglPoint(x->v(k3), y->v(k3), z->v(k3));\r
+                       p3.Set(x->v(k3), y->v(k3), z->v(k3));\r
                        q = wire ? mglPoint(NAN,NAN) : (p2-p1) ^ (p3-p1);\r
                        k1 = gr->AddPnt(p1,gr->GetC(ss,a->v(k1)),q);\r
                        k2 = gr->AddPnt(p2,gr->GetC(ss,a->v(k2)),q);\r
@@ -64,15 +64,15 @@ void MGL_EXPORT mgl_triplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCD
                gr->Reserve(n);\r
                long *kk = new long[n];\r
                mglPoint *pp = new mglPoint[n];\r
-               for(long i=0;i<m;i++)   // add averaged normales\r
+               for(long i=0;i<m;i++)   if(nums->v(0,i)>=0 && nums->v(1,i)>=0 && nums->v(2,i)>=0)       // add averaged normales\r
                {\r
                        register long k1 = long(nums->v(0,i)+0.5);\r
                        register long k2 = long(nums->v(1,i)+0.5);\r
                        register long k3 = long(nums->v(2,i)+0.5);\r
                        if(!wire)\r
                        {\r
-                               mglPoint q = mglPoint(x->v(k2)-x->v(k1), y->v(k2)-y->v(k1), z->v(k2)-z->v(k1)) ^\r
-                                       mglPoint(x->v(k3)-x->v(k1), y->v(k3)-y->v(k1), z->v(k3)-z->v(k1));\r
+                               mglPoint q(mglPoint(x->v(k2)-x->v(k1), y->v(k2)-y->v(k1), z->v(k2)-z->v(k1)) ^\r
+                                       mglPoint(x->v(k3)-x->v(k1), y->v(k3)-y->v(k1), z->v(k3)-z->v(k1)));\r
                                q.Normalize();\r
                                // try be sure that in the same direction ...\r
                                if(q.z<0)       q *= -1;\r
@@ -82,7 +82,7 @@ void MGL_EXPORT mgl_triplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCD
                }\r
                for(long i=0;i<n;i++)   // add points\r
                        kk[i] = gr->AddPnt(mglPoint(x->v(i), y->v(i), z->v(i)), gr->GetC(ss,a->v(i)), pp[i]);\r
-               for(long i=0;i<m;i++)   // draw triangles\r
+               for(long i=0;i<m;i++)   if(nums->v(0,i)>=0 && nums->v(1,i)>=0 && nums->v(2,i)>=0)       // draw triangles\r
                {\r
                        register long k1 = long(nums->v(0,i)+0.5);\r
                        register long k2 = long(nums->v(1,i)+0.5);\r
@@ -105,7 +105,7 @@ void MGL_EXPORT mgl_triplot_xyz(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, cons
 void MGL_EXPORT mgl_triplot_xy(HMGL gr, HCDT nums, HCDT x, HCDT y, const char *sch, const char *opt)\r
 {\r
        gr->SaveState(opt);\r
-       mglData z(x->GetNx());\r
+       mglData z(x->GetNN());\r
        mreal zm = gr->AdjustZMin();    z.Fill(zm,zm);\r
        mgl_triplot_xyzc(gr,nums,x,y,&z,&z,sch,0);\r
 }\r
@@ -133,7 +133,7 @@ void MGL_EXPORT mgl_triplot_xy_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, ui
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_quadplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, const char *opt)\r
 {\r
-       long n = x->GetNx(), m = nums->GetNy();\r
+       long n = x->GetNN(), m = nums->GetNy();\r
        if(mgl_check_trig(gr,nums,x,y,z,a,"QuadPlot",4))        return;\r
 \r
        long ss=gr->AddTexture(sch);\r
@@ -141,21 +141,21 @@ void MGL_EXPORT mgl_quadplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HC
        static int cgid=1;      gr->StartGroup("QuadPlot",cgid++);\r
        mglPoint p1,p2,p3,p4;\r
 \r
-       long nc = a->GetNx();\r
+       long nc = a->GetNN();\r
        bool wire = mglchr(sch,'#');\r
        if(nc!=n && nc>=m)      // colors per triangle\r
        {\r
                gr->Reserve(m*4);\r
-               for(long i=0;i<m;i++)\r
+               for(long i=0;i<m;i++)   if(nums->v(0,i)>=0 && nums->v(1,i)>=0 && nums->v(2,i)>=0 && nums->v(3,i)>=0)\r
                {\r
                        register long k1 = long(nums->v(0,i)+0.5);\r
-                       p1 = mglPoint(x->v(k1), y->v(k1), z->v(k1));\r
+                       p1.Set(x->v(k1), y->v(k1), z->v(k1));\r
                        register long k2 = long(nums->v(1,i)+0.5);\r
-                       p2 = mglPoint(x->v(k2), y->v(k2), z->v(k2));\r
+                       p2.Set(x->v(k2), y->v(k2), z->v(k2));\r
                        register long k3 = long(nums->v(2,i)+0.5);\r
-                       p3 = mglPoint(x->v(k3), y->v(k3), z->v(k3));\r
-                       register long k4 = floor(nums->v(3,i)+0.5);\r
-                       p4 = mglPoint(x->v(k4), y->v(k4), z->v(k4));\r
+                       p3.Set(x->v(k3), y->v(k3), z->v(k3));\r
+                       register long k4 = long(nums->v(3,i)+0.5);\r
+                       p4.Set(x->v(k4), y->v(k4), z->v(k4));\r
                        mglPoint q = wire ? mglPoint(NAN,NAN):(p2-p1) ^ (p3-p1);\r
                        k1 = gr->AddPnt(p1,gr->GetC(ss,a->v(k1)),q);\r
                        k2 = gr->AddPnt(p2,gr->GetC(ss,a->v(k2)),q);\r
@@ -169,16 +169,16 @@ void MGL_EXPORT mgl_quadplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HC
                gr->Reserve(n);\r
                long *kk = new long[n];\r
                mglPoint *pp = new mglPoint[n];\r
-               for(long i=0;i<m;i++)   // add averaged normales\r
-               {\r
+               for(long i=0;i<m;i++)   if(nums->v(0,i)>=0 && nums->v(1,i)>=0 && nums->v(2,i)>=0 && nums->v(3,i)>=0)\r
+               {       // add averaged normales\r
                        register long k1 = long(nums->v(0,i)+0.5);\r
-                       p1 = mglPoint(x->v(k1), y->v(k1), z->v(k1));\r
+                       p1.Set(x->v(k1), y->v(k1), z->v(k1));\r
                        register long k2 = long(nums->v(1,i)+0.5);\r
-                       p2 = mglPoint(x->v(k2), y->v(k2), z->v(k2));\r
+                       p2.Set(x->v(k2), y->v(k2), z->v(k2));\r
                        register long k3 = long(nums->v(2,i)+0.5);\r
-                       p3 = mglPoint(x->v(k3), y->v(k3), z->v(k3));\r
-                       register long k4 = floor(nums->v(3,i)+0.5);\r
-                       p4 = mglPoint(x->v(k4), y->v(k4), z->v(k4));\r
+                       p3.Set(x->v(k3), y->v(k3), z->v(k3));\r
+                       register long k4 = long(nums->v(3,i)+0.5);\r
+                       p4.Set(x->v(k4), y->v(k4), z->v(k4));\r
 \r
                        if(wire)        pp[k1]=pp[k2]=pp[k3]=pp[k4]=mglPoint(NAN,NAN);\r
                        else\r
@@ -192,12 +192,12 @@ void MGL_EXPORT mgl_quadplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HC
                }\r
                for(long i=0;i<n;i++)   // add points\r
                        kk[i] = gr->AddPnt(mglPoint(x->v(i), y->v(i), z->v(i)),gr->GetC(ss,a->v(i)), pp[i]);\r
-               for(long i=0;i<m;i++)   // draw quads\r
-               {\r
-                       register long k1 = floor(nums->v(0,i)+0.5);\r
-                       register long k2 = floor(nums->v(1,i)+0.5);\r
-                       register long k3 = floor(nums->v(2,i)+0.5);\r
-                       register long k4 = floor(nums->v(3,i)+0.5);\r
+               for(long i=0;i<m;i++)   if(nums->v(0,i)>=0 && nums->v(1,i)>=0 && nums->v(2,i)>=0 && nums->v(3,i)>=0)\r
+               {       // draw quads\r
+                       register long k1 = long(nums->v(0,i)+0.5);\r
+                       register long k2 = long(nums->v(1,i)+0.5);\r
+                       register long k3 = long(nums->v(2,i)+0.5);\r
+                       register long k4 = long(nums->v(3,i)+0.5);\r
                        if(wire)\r
                        {\r
                                gr->line_plot(kk[k1],kk[k2]);   gr->line_plot(kk[k1],kk[k3]);\r
@@ -216,7 +216,7 @@ void MGL_EXPORT mgl_quadplot_xyz(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, con
 void MGL_EXPORT mgl_quadplot_xy(HMGL gr, HCDT nums, HCDT x, HCDT y, const char *sch, const char *opt)\r
 {\r
        gr->SaveState(opt);\r
-       mglData z(x->GetNx());  z.Fill(gr->Min.z,gr->Min.z);\r
+       mglData z(x->GetNN());  z.Fill(gr->Min.z,gr->Min.z);\r
        mgl_quadplot_xyzc(gr,nums,x,y,&z,&z,sch,0);\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -245,30 +245,29 @@ void MGL_EXPORT mgl_quadplot_xy_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, u
 //-----------------------------------------------------------------------------\r
 std::vector<mglSegment> MGL_NO_EXPORT mgl_tri_lines(mreal val, HCDT nums, HCDT a, HCDT x, HCDT y, HCDT z)\r
 {\r
-       long n = x->GetNx(), m = nums->GetNy();\r
+       long n = x->GetNN(), m = nums->GetNy();\r
        std::vector<mglSegment> lines;\r
        for(long i=0;i<m;i++)\r
        {\r
-               register long k1 = long(nums->v(0,i)+0.1);      if(k1<0 || k1>=n)       continue;\r
-               register long k2 = long(nums->v(1,i)+0.1);      if(k2<0 || k2>=n)       continue;\r
-               register long k3 = long(nums->v(2,i)+0.1);      if(k3<0 || k3>=n)       continue;\r
+               long k1 = long(nums->v(0,i)+0.5), k2 = long(nums->v(1,i)+0.5), k3 = long(nums->v(2,i)+0.5);\r
+               if(k1<0 || k1>=n || k2<0 || k2>=n || k3<0 || k3>=n)     continue;\r
                register mreal v1 = a->v(k1), v2 = a->v(k2), v3 = a->v(k3);\r
                register mreal d1 = mgl_d(val,v1,v2), d2 = mgl_d(val,v1,v3), d3 = mgl_d(val,v2,v3);\r
                mglSegment line;\r
                if(d1>=0 && d1<=1 && d2>=0 && d2<=1)\r
                {\r
-                       line.p1 = mglPoint(x->v(k1)*(1-d1)+x->v(k2)*d1, y->v(k1)*(1-d1)+y->v(k2)*d1, z->v(k1)*(1-d1)+z->v(k2)*d1);\r
-                       line.p2 = mglPoint(x->v(k1)*(1-d2)+x->v(k3)*d2, y->v(k1)*(1-d2)+y->v(k3)*d2, z->v(k1)*(1-d2)+z->v(k3)*d2);\r
+                       line.p1.Set(x->v(k1)*(1-d1)+x->v(k2)*d1, y->v(k1)*(1-d1)+y->v(k2)*d1, z->v(k1)*(1-d1)+z->v(k2)*d1);\r
+                       line.p2.Set(x->v(k1)*(1-d2)+x->v(k3)*d2, y->v(k1)*(1-d2)+y->v(k3)*d2, z->v(k1)*(1-d2)+z->v(k3)*d2);\r
                }\r
                else if(d1>=0 && d1<=1 && d3>=0 && d3<=1)\r
                {\r
-                       line.p1 = mglPoint(x->v(k1)*(1-d1)+x->v(k2)*d1, y->v(k1)*(1-d1)+y->v(k2)*d1, z->v(k1)*(1-d1)+z->v(k2)*d1);\r
-                       line.p2 = mglPoint(x->v(k2)*(1-d3)+x->v(k3)*d3, y->v(k2)*(1-d3)+y->v(k3)*d3, z->v(k2)*(1-d3)+z->v(k3)*d3);\r
+                       line.p1.Set(x->v(k1)*(1-d1)+x->v(k2)*d1, y->v(k1)*(1-d1)+y->v(k2)*d1, z->v(k1)*(1-d1)+z->v(k2)*d1);\r
+                       line.p2.Set(x->v(k2)*(1-d3)+x->v(k3)*d3, y->v(k2)*(1-d3)+y->v(k3)*d3, z->v(k2)*(1-d3)+z->v(k3)*d3);\r
                }\r
                else if(d3>=0 && d3<=1 && d2>=0 && d2<=1)\r
                {\r
-                       line.p1 = mglPoint(x->v(k1)*(1-d2)+x->v(k3)*d2, y->v(k1)*(1-d2)+y->v(k3)*d2, z->v(k1)*(1-d2)+z->v(k3)*d2);\r
-                       line.p2 = mglPoint(x->v(k2)*(1-d3)+x->v(k3)*d3, y->v(k2)*(1-d3)+y->v(k3)*d3, z->v(k2)*(1-d3)+z->v(k3)*d3);\r
+                       line.p1.Set(x->v(k1)*(1-d2)+x->v(k3)*d2, y->v(k1)*(1-d2)+y->v(k3)*d2, z->v(k1)*(1-d2)+z->v(k3)*d2);\r
+                       line.p2.Set(x->v(k2)*(1-d3)+x->v(k3)*d3, y->v(k2)*(1-d3)+y->v(k3)*d3, z->v(k2)*(1-d3)+z->v(k3)*d3);\r
                }\r
                if(line.p1!=line.p2)    lines.push_back(line);\r
        }\r
@@ -277,7 +276,7 @@ std::vector<mglSegment> MGL_NO_EXPORT mgl_tri_lines(mreal val, HCDT nums, HCDT a
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_tricont_xyzcv(HMGL gr, HCDT v, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, const char *opt)\r
 {\r
-       mglDataV zz(x->GetNx(),x->GetNy());\r
+       mglDataV zz(x->GetNN());\r
        if(!z)  z = &zz;\r
        if(mgl_check_trig(gr,nums,x,y,z,a,"TriCont"))   return;\r
 \r
@@ -342,7 +341,7 @@ void MGL_EXPORT mgl_tricont_xyc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, u
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_tricontv_xyzcv(HMGL gr, HCDT v, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, const char *opt)\r
 {\r
-       mglDataV zz(x->GetNx(),x->GetNy());\r
+       mglDataV zz(x->GetNN());\r
        if(!z)  z = &zz;\r
        if(mgl_check_trig(gr,nums,x,y,z,a,"TriContV"))  return;\r
 \r
@@ -439,7 +438,7 @@ void MGL_EXPORT mgl_dots_ca(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, HCDT a, con
 \r
        for(long i=0;i<n;i+=d)\r
        {\r
-               mglPoint p = mglPoint(x->vthr(i),y->vthr(i),z->vthr(i));\r
+               mglPoint p(x->vthr(i),y->vthr(i),z->vthr(i));\r
                long pp = gr->AddPnt(p,gr->GetC(ss,c->vthr(i)),mglPoint(NAN),a?gr->GetA(a->vthr(i)):-1);\r
                gr->mark_plot(pp, mk);\r
        }\r
@@ -475,11 +474,11 @@ long MGL_NO_EXPORT mgl_crust(long n,mglPoint *pp,long **nn,mreal ff);
 HMDT MGL_EXPORT mgl_triangulation_3d(HCDT x, HCDT y, HCDT z)\r
 {\r
        mglData *nums=0;\r
-       long n = x->GetNx(), m;\r
-       if(y->GetNx()!=n || z->GetNx()!=n)      return nums;\r
+       long n = x->GetNN(), m;\r
+       if(y->GetNN()!=n || z->GetNN()!=n)      return nums;\r
        mglPoint *pp = new mglPoint[n];\r
        long *nn=0;\r
-       for(long i=0;i<n;i++)   pp[i] = mglPoint(x->v(i), y->v(i), z->v(i));\r
+       for(long i=0;i<n;i++)   pp[i].Set(x->v(i), y->v(i), z->v(i));\r
        m = mgl_crust(n,pp,&nn,0);\r
 \r
        if(m>0)\r
@@ -552,12 +551,12 @@ MGL_NO_EXPORT void *mgl_grid_t(void *par)
 #if !MGL_HAVE_PTHREAD\r
 #pragma omp parallel for\r
 #endif\r
-       for(long i0=t->id;i0<t->n;i0+=mglNumThr)\r
+       for(long i0=t->id;i0<t->n;i0+=mglNumThr)        if(d[3*i0]>=0 && d[3*i0+1]>=0 && d[3*i0+2]>=0)\r
        {\r
                register long k1 = long(d[3*i0]+0.5), k2 = long(d[3*i0+1]+0.5), k3 = long(d[3*i0+2]+0.5);\r
                mreal dxu,dxv,dyu,dyv;\r
                mreal z1=zdat->vthr(k1), z2=zdat->vthr(k2), z3=zdat->vthr(k3);\r
-               mglPoint d1=mglPoint(x[k2]-x[k1],y[k2]-y[k1],z2-z1), d2=mglPoint(x[k3]-x[k1],y[k3]-y[k1],z3-z1), p;\r
+               mglPoint d1(x[k2]-x[k1],y[k2]-y[k1],z2-z1), d2(x[k3]-x[k1],y[k3]-y[k1],z3-z1), p;\r
 \r
                dxu = d2.x*d1.y - d1.x*d2.y;\r
                if(fabs(dxu)<1e-5) continue; // points lies on the same line\r
@@ -633,7 +632,7 @@ void MGL_EXPORT mgl_data_grid_(uintptr_t *gr, uintptr_t *d, uintptr_t *x, uintpt
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_crust(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt)\r
 {\r
-       if(y->GetNx()!=x->GetNx() || z->GetNx()!=x->GetNx())\r
+       if(y->GetNN()!=x->GetNN() || z->GetNN()!=x->GetNN())\r
        {       gr->SetWarn(mglWarnDim,"Crust");        return; }\r
        HMDT nums = mgl_triangulation_3d(x, y, z);\r
        mgl_triplot_xyzc(gr,nums,x,y,z,z,sch,opt);\r
index 0ab785912b2b3e11d13a4063d02aafb7a5c79a45..fca5a20f793d8044c5f1b28e82795d819a860a8f 100644 (file)
@@ -116,13 +116,13 @@ void MGL_EXPORT mglStartThreadV(void *(*func)(void *), long n, mreal *a, const v
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
-mreal MGL_EXPORT_PURE mglSpline3s(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z)\r
+mreal MGL_EXPORT mglSpline3s(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z)\r
 {      return mglSpline3st<mreal>(a,nx,ny,nz,x,y,z);   }\r
 //-----------------------------------------------------------------------------\r
-mreal MGL_EXPORT_PURE mglSpline3(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z,mreal *dx, mreal *dy, mreal *dz)\r
+mreal MGL_EXPORT mglSpline3(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z,mreal *dx, mreal *dy, mreal *dz)\r
 {      return mglSpline3t<mreal>(a,nx,ny,nz,x,y,z,dx,dy,dz);   }\r
 //-----------------------------------------------------------------------------\r
-mreal MGL_EXPORT_PURE mglLinear(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z)\r
+mreal MGL_EXPORT mglLinear(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z)\r
 {      return mglLineart<mreal>(a,nx,ny,nz,x,y,z);     }\r
 //-----------------------------------------------------------------------------\r
 double MGL_EXPORT_CONST mgl_ipow(double x,int n)\r
@@ -136,7 +136,7 @@ double MGL_EXPORT_CONST mgl_ipow(double x,int n)
        if(n%2==1)      t *= x;\r
        return t;\r
 }\r
-double MGL_EXPORT_PURE mgl_ipow_(mreal *x,int *n)      {       return mgl_ipow(*x,*n); }\r
+double MGL_EXPORT mgl_ipow_(mreal *x,int *n)   {       return mgl_ipow(*x,*n); }\r
 //-----------------------------------------------------------------------------\r
 double mgl_get_time(const char *time, const char *fmt)\r
 {\r
@@ -649,7 +649,7 @@ void MGL_EXPORT mgl_data_roll(HMDT dd, char dir, long num)
        mreal *b,*a=dd->a;\r
        if(dir=='z' && nz>1)\r
        {\r
-               d = num>0 ? num%nz : (num+nz*(1+num/nz))%nz;\r
+               d = num>0 ? num%nz : (num+nz*(1-num/nz))%nz;\r
                if(d==0)        return;         // nothing to do\r
                b = new mreal[nx*ny*nz];\r
                memcpy(b,a+nx*ny*d,nx*ny*(nz-d)*sizeof(mreal));\r
@@ -658,7 +658,7 @@ void MGL_EXPORT mgl_data_roll(HMDT dd, char dir, long num)
        }\r
        if(dir=='y' && ny>1)\r
        {\r
-               d = num>0 ? num%ny : (num+ny*(1+num/ny))%ny;\r
+               d = num>0 ? num%ny : (num+ny*(1-num/ny))%ny;\r
                if(d==0)        return;         // nothing to do\r
                b = new mreal[nx*ny*nz];\r
                memcpy(b,a+nx*d,(nx*ny*nz-nx*d)*sizeof(mreal));\r
@@ -669,7 +669,7 @@ void MGL_EXPORT mgl_data_roll(HMDT dd, char dir, long num)
        }\r
        if(dir=='x' && nx>1)\r
        {\r
-               d = num>0 ? num%nx : (num+nx*(1+num/nx))%nx;\r
+               d = num>0 ? num%nx : (num+nx*(1-num/nx))%nx;\r
                if(d==0)        return;         // nothing to do\r
                b = new mreal[nx*ny*nz];\r
                memcpy(b,a+d,(nx*ny*nz-d)*sizeof(mreal));\r
@@ -921,7 +921,7 @@ HMDT MGL_EXPORT mgl_data_solve(HCDT dat, mreal val, char dir, HCDT i0, int norm)
        return r;\r
 }\r
 //-----------------------------------------------------------------------------\r
-mreal MGL_EXPORT_PURE mgl_data_solve_1d(HCDT d, mreal val, int spl, long i0)\r
+mreal MGL_EXPORT mgl_data_solve_1d(HCDT d, mreal val, int spl, long i0)\r
 {\r
        mreal x=0, y1, y2, a, a0, dx=0, da = 1e-5*(val?fabs(val):1);\r
        long nx = d->GetNx();\r
@@ -974,7 +974,7 @@ mreal MGL_EXPORT_PURE mgl_data_solve_1d(HCDT d, mreal val, int spl, long i0)
        return NAN;\r
 }\r
 //-----------------------------------------------------------------------------\r
-mreal MGL_EXPORT_PURE mgl_data_linear_ext(HCDT d, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz)\r
+mreal MGL_EXPORT mgl_data_linear_ext(HCDT d, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz)\r
 {\r
        if(!d)  return NAN;\r
        long kx=long(x), ky=long(y), kz=long(z);\r
@@ -1047,52 +1047,53 @@ mreal MGL_EXPORT_PURE mgl_data_linear_ext(HCDT d, mreal x,mreal y,mreal z, mreal
        return b0 + z*(b1-b0);\r
 }\r
 //-----------------------------------------------------------------------------\r
-mreal MGL_EXPORT_PURE mgl_data_linear(HCDT d, mreal x,mreal y,mreal z)\r
+mreal MGL_EXPORT mgl_data_linear(HCDT d, mreal x,mreal y,mreal z)\r
 {      return mgl_data_linear_ext(d, x,y,z, 0,0,0);    }\r
 //-----------------------------------------------------------------------------\r
-mreal MGL_EXPORT_PURE mgl_data_spline(HCDT d, mreal x,mreal y,mreal z)\r
+mreal MGL_EXPORT mgl_data_spline(HCDT d, mreal x,mreal y,mreal z)\r
 {\r
        if(mgl_isbad(x) || mgl_isbad(y) || mgl_isbad(z))        return NAN;\r
+       mreal res = 0;\r
        const mglData *dd=dynamic_cast<const mglData *>(d);\r
-       if(dd)  return dd->ny*dd->nz==1?mglSpline1st<mreal>(dd->a,dd->nx,x):mglSpline3st<mreal>(dd->a,dd->nx,dd->ny,dd->nz,x,y,z);\r
+       if(dd)  res = dd->ny*dd->nz==1?mglSpline1st<mreal>(dd->a,dd->nx,x):mglSpline3st<mreal>(dd->a,dd->nx,dd->ny,dd->nz,x,y,z);\r
        const mglDataC *dc=dynamic_cast<const mglDataC *>(d);\r
-       if(dc)  return abs(dc->ny*dc->nz==1?mglSpline1st<dual>(dc->a,dc->nx,x):mglSpline3st<dual>(dc->a,dc->nx,dc->ny,dc->nz,x,y,z));\r
+       if(dc)  res = abs(dc->ny*dc->nz==1?mglSpline1st<dual>(dc->a,dc->nx,x):mglSpline3st<dual>(dc->a,dc->nx,dc->ny,dc->nz,x,y,z));\r
        const mglDataV *dv=dynamic_cast<const mglDataV *>(d);\r
-       if(dv)  return dv->value(x,y,z);\r
+       if(dv)  res = dv->value(x,y,z);\r
        const mglDataF *df=dynamic_cast<const mglDataF *>(d);\r
-       if(df)  return df->value(x,y,z);\r
-       return 0;       // TODO non-mglData: spline mglDataT, mglDataR\r
+       if(df)  res = df->value(x,y,z);\r
+       return res;     // TODO non-mglData: spline mglDataT, mglDataR\r
 }\r
 //-----------------------------------------------------------------------------\r
-mreal MGL_EXPORT_PURE mgl_data_spline_ext(HCDT d, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz)\r
+mreal MGL_EXPORT mgl_data_spline_ext(HCDT d, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz)\r
 {\r
        if(mgl_isbad(x) || mgl_isbad(y) || mgl_isbad(z))        return NAN;\r
+       mreal res = 0;\r
        const mglData *dd=dynamic_cast<const mglData *>(d);\r
-       if(dd)  return mglSpline3t<mreal>(dd->a,dd->nx,dd->ny,dd->nz,x,y,z,dx,dy,dz);\r
+       if(dd)  res = mglSpline3t<mreal>(dd->a,dd->nx,dd->ny,dd->nz,x,y,z,dx,dy,dz);\r
        const mglDataC *dc=dynamic_cast<const mglDataC *>(d);\r
        if(dc)\r
        {       dual a,ax,ay,az;        mreal res;\r
                a = mglSpline3t<dual>(dc->a,dc->nx,dc->ny,dc->nz,x,y,z,&ax,&ay,&az);    res = abs(a);\r
                if(dx)  *dx = res?(real(a)*real(ax)+imag(a)*imag(ax))/res:0;\r
                if(dy)  *dy = res?(real(a)*real(ay)+imag(a)*imag(ay))/res:0;\r
-               if(dz)  *dz = res?(real(a)*real(az)+imag(a)*imag(az))/res:0;\r
-               return res;     }\r
+               if(dz)  *dz = res?(real(a)*real(az)+imag(a)*imag(az))/res:0;    }\r
        const mglDataV *dv=dynamic_cast<const mglDataV *>(d);\r
-       if(dv)  return dv->value(x,y,z,dx,dy,dz);\r
+       if(dv)  res = dv->value(x,y,z,dx,dy,dz);\r
        const mglDataF *df=dynamic_cast<const mglDataF *>(d);\r
-       if(df)  return df->value(x,y,z,dx,dy,dz);\r
-       return 0;       // TODO non-mglData: spline mglDataT, mglDataR\r
+       if(df)  res = df->value(x,y,z,dx,dy,dz);\r
+       return res;     // TODO non-mglData: spline mglDataT, mglDataR\r
 }\r
 //-----------------------------------------------------------------------------\r
-mreal MGL_EXPORT_PURE mgl_data_spline_(uintptr_t *d, mreal *x,mreal *y,mreal *z)\r
+mreal MGL_EXPORT mgl_data_spline_(uintptr_t *d, mreal *x,mreal *y,mreal *z)\r
 {      return mgl_data_spline(_DA_(d),*x,*y,*z);       }\r
-mreal MGL_EXPORT_PURE mgl_data_linear_(uintptr_t *d, mreal *x,mreal *y,mreal *z)\r
+mreal MGL_EXPORT mgl_data_linear_(uintptr_t *d, mreal *x,mreal *y,mreal *z)\r
 {      return mgl_data_linear(_DA_(d),*x,*y,*z);       }\r
-mreal MGL_EXPORT_PURE mgl_data_spline_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz)\r
+mreal MGL_EXPORT mgl_data_spline_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz)\r
 {      return mgl_data_spline_ext(_DA_(d),*x,*y,*z,dx,dy,dz);  }\r
-mreal MGL_EXPORT_PURE mgl_data_linear_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz)\r
+mreal MGL_EXPORT mgl_data_linear_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz)\r
 {      return mgl_data_linear_ext(_DA_(d),*x,*y,*z,dx,dy,dz);  }\r
-mreal MGL_EXPORT_PURE mgl_data_solve_1d_(uintptr_t *d, mreal *val, int *spl, int *i0)\r
+mreal MGL_EXPORT mgl_data_solve_1d_(uintptr_t *d, mreal *val, int *spl, int *i0)\r
 {      return mgl_data_solve_1d(_DA_(d),*val, *spl, *i0);      }\r
 uintptr_t MGL_EXPORT mgl_data_solve_(uintptr_t *d, mreal *val, const char *dir, uintptr_t *i0, int *norm,int)\r
 {      return uintptr_t(mgl_data_solve(_DA_(d),*val, *dir, _DA_(i0), *norm));  }\r
@@ -1105,6 +1106,7 @@ void MGL_EXPORT mgl_data_crop(HMDT d, long n1, long n2, char dir)
        switch(dir)\r
        {\r
        case 'x':\r
+               if(n1>=nx)      break;\r
                n2 = n2>0 ? n2 : nx+n2;\r
                if(n2<0 || n2>=nx || n2<n1)     n2 = nx;\r
                nn = n2-n1;     b = new mreal[nn*ny*nz];\r
@@ -1115,6 +1117,7 @@ void MGL_EXPORT mgl_data_crop(HMDT d, long n1, long n2, char dir)
                d->a = b;       d->link=false;  d->NewId();\r
                break;\r
        case 'y':\r
+               if(n1>=ny)      break;\r
                n2 = n2>0 ? n2 : ny+n2;\r
                if(n2<0 || n2>=ny || n2<n1)     n2 = ny;\r
                nn = n2-n1;     b = new mreal[nn*nx*nz];\r
@@ -1125,6 +1128,7 @@ void MGL_EXPORT mgl_data_crop(HMDT d, long n1, long n2, char dir)
                d->a = b;       d->link=false;\r
                break;\r
        case 'z':\r
+               if(n1>=nz)      break;\r
                n2 = n2>0 ? n2 : nz+n2;\r
                if(n2<0 || n2>=nz || n2<n1)     n2 = nz;\r
                nn = n2-n1;     b = new mreal[nn*nx*ny];\r
@@ -1891,7 +1895,7 @@ mreal MGL_EXPORT mgl_data_get_value(HCDT dat, long i, long j, long k)
 mreal MGL_EXPORT mgl_data_get_value_(uintptr_t *d, int *i, int *j, int *k)\r
 {      return mgl_data_get_value(_DA_(d),*i,*j,*k);    }\r
 //-----------------------------------------------------------------------------\r
-MGL_EXPORT_PURE mreal *mgl_data_data(HMDT dat) {       return dat->a;  }\r
+MGL_EXPORT mreal *mgl_data_data(HMDT dat)      {       return dat->a;  }\r
 //-----------------------------------------------------------------------------\r
 MGL_EXPORT mreal *mgl_data_value(HMDT dat, long i,long j,long k)\r
 {      register long ii=i*dat->nx*(j+dat->ny*k);\r
@@ -1908,45 +1912,25 @@ void MGL_EXPORT mgl_data_join(HMDT d, HCDT v)
 {\r
        long nx=d->nx, ny=d->ny, nz=d->nz, k=nx*ny*nz;\r
        const mglData *mv = dynamic_cast<const mglData *>(v);\r
-       long vx=v->GetNx(), vy=v->GetNy(), vz=v->GetNz();\r
+       long vx=v->GetNx(), vy=v->GetNy(), vz=v->GetNz(), m = vx*vy*vz;\r
 \r
-       if(nx==vx && ny==vy && (nz>1 || vz>1))\r
-       {\r
-               mreal *b = new mreal[nx*ny*(nz+vz)];\r
-               memcpy(b,d->a,nx*ny*nz*sizeof(mreal));\r
-               if(mv)  memcpy(b+nx*ny*nz,mv->a,nx*ny*vz*sizeof(mreal));\r
-               else\r
-#pragma omp parallel for\r
-                       for(long i=0;i<nx*ny*vz;i++)    b[k+i] = v->vthr(i);\r
-               if(!d->link)    delete []d->a;  d->nz += vz;\r
-               d->a = b;       d->link=false;  d->NewId();\r
-       }\r
-       else if(nx==vx && (ny>1 || vy>1))\r
+       if(nx==vx && ny==vy && (nz>1 || vz>1))  d->nz += vz;\r
+       else\r
        {\r
                ny *= nz;       vy *= vz;\r
-               mreal *b = new mreal[nx*(ny+vy)];\r
-               memcpy(b,d->a,nx*ny*sizeof(mreal));\r
-               if(mv)  memcpy(b+nx*ny,mv->a,nx*vy*sizeof(mreal));\r
+               if(nx==vx && (ny>1 || vy>1))\r
+               {       d->nz = 1;      d->ny = ny+vy;  }\r
                else\r
-#pragma omp parallel for\r
-                       for(long i=0;i<nx*vy;i++)       b[k+i] = v->vthr(i);\r
-               if(!d->link)    delete []d->a;\r
-               d->nz = 1;      d->ny = ny+vy;\r
-               d->a = b;       d->link=false;  d->NewId();\r
+               {       d->ny = d->nz = 1;      d->nx = k+m;    }\r
        }\r
+       mreal *b = new mreal[k+m];\r
+       memcpy(b,d->a,k*sizeof(mreal));\r
+       if(mv)  memcpy(b+k,mv->a,m*sizeof(mreal));\r
        else\r
-       {\r
-               nx *= ny*nz;    vx *= vy*vz;\r
-               mreal *b = new mreal[nx+vx];\r
-               memcpy(b,d->a,nx*sizeof(mreal));\r
-               if(mv)  memcpy(b+nx,mv->a,vx*sizeof(mreal));\r
-               else\r
 #pragma omp parallel for\r
-                       for(long i=0;i<vx;i++)  b[k+i] = v->vthr(i);\r
-               if(!d->link)    delete []d->a;\r
-               d->nz = d->ny = 1;      d->nx = nx+vx;\r
-               d->a = b;       d->link=false;  d->NewId();\r
-       }\r
+               for(long i=0;i<m;i++)   b[k+i] = v->vthr(i);\r
+       if(!d->link)    delete []d->a;\r
+       d->a = b;       d->link=false;  d->NewId();\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_data_join_(uintptr_t *d, uintptr_t *val)\r
index 4a394281d82ca623381ae61d427434cb6436d592..031c0b1261dc43fa67479d5fcc6c8782a3158f4b 100644 (file)
@@ -21,7 +21,7 @@
 #include "mgl2/data.h"\r
 #include "mgl2/eval.h"\r
 #include "mgl2/thread.h"\r
-mglData MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector<mglDataA*> &head);\r
+HMDT MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector<mglDataA*> &head);\r
 //-----------------------------------------------------------------------------\r
 HMDT MGL_EXPORT mgl_data_trace(HCDT d)\r
 {\r
@@ -475,9 +475,8 @@ HMDT MGL_EXPORT mgl_data_momentum(HCDT dat, char dir, const char *how)
        mglData u(dat); u.s=L"u";       // NOTE slow !!!\r
        std::vector<mglDataA*> list;\r
        list.push_back(&x);     list.push_back(&y);     list.push_back(&z);     list.push_back(&u);\r
-       mglData res=mglFormulaCalc(how,list);\r
+       HMDT res=mglFormulaCalc(how,list), b=0;\r
 \r
-       mglData *b=0;\r
        if(dir=='x')\r
        {\r
                b=new mglData(nx);\r
@@ -488,7 +487,7 @@ HMDT MGL_EXPORT mgl_data_momentum(HCDT dat, char dir, const char *how)
                        for(long j=0;j<ny*nz;j++)\r
                        {\r
                                register mreal u=dat->vthr(i+nx*j);\r
-                               i0 += u;        i1 += u*res.a[i+nx*j];\r
+                               i0 += u;        i1 += u*res->a[i+nx*j];\r
                        }\r
                        b->a[i] = i0>0 ? i1/i0 : 0;\r
                }\r
@@ -503,7 +502,7 @@ HMDT MGL_EXPORT mgl_data_momentum(HCDT dat, char dir, const char *how)
                        for(long k=0;k<nz;k++)  for(long j=0;j<nx;j++)\r
                        {\r
                                register mreal u=dat->v(j,i,k);\r
-                               i0 += u;        i1 += u*res.a[j+nx*(i+ny*k)];\r
+                               i0 += u;        i1 += u*res->a[j+nx*(i+ny*k)];\r
                        }\r
                        b->a[i] = i0>0 ? i1/i0 : 0;\r
                }\r
@@ -519,12 +518,12 @@ HMDT MGL_EXPORT mgl_data_momentum(HCDT dat, char dir, const char *how)
                        for(long j=0;j<nn;j++)\r
                        {\r
                                register mreal u=dat->vthr(j+nn*i);\r
-                               i0 += u;        i1 += u*res.a[j+nn*i];\r
+                               i0 += u;        i1 += u*res->a[j+nn*i];\r
                        }\r
                        b->a[i] = i0>0 ? i1/i0 : 0;\r
                }\r
        }\r
-       return b;\r
+       mgl_delete_data(res);   return b;\r
 }\r
 uintptr_t MGL_EXPORT mgl_data_momentum_(uintptr_t *d, char *dir, const char *how, int,int l)\r
 {      char *s=new char[l+1];  memcpy(s,how,l);        s[l]=0;\r
@@ -541,26 +540,22 @@ void MGL_EXPORT mgl_data_mul_dat(HMDT d, HCDT a)
                for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
                        d->a[i+nx*(j+ny*k)] *= v;\r
        }\r
-       else if(mz==1 && my==1 && nx==mx)\r
-#pragma omp parallel for collapse(3)\r
-               for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
-                       d->a[i+nx*(j+ny*k)] *= a->v(i);\r
-       else if(mz==1 && ny==my && nx==mx)\r
-#pragma omp parallel for collapse(3)\r
-               for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
-                       d->a[i+nx*(j+ny*k)] *= a->v(i,j);\r
-       else if(nz==mz && ny==my && nx==mx)\r
-#pragma omp parallel for collapse(3)\r
-               for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
-                       d->a[i+nx*(j+ny*k)] *= a->v(i,j,k);\r
+       else\r
+       {\r
+               long n=0, m=0;\r
+               if(nz*ny*nx==mz*my*mx)  {       n=nx*ny*nz;     m=1;    }\r
+               else if(ny*nx==my*mx)   {       n=nx*ny;        m=nz;   }\r
+               else if(nx==mx)                 {       n=nx;   m=ny*nz;        }\r
+#pragma omp parallel for collapse(2)\r
+               for(long k=0;k<m;k++)   for(long i=0;i<n;i++)   d->a[i+n*k] *= a->vthr(i);\r
+       }\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_data_mul_num(HMDT d, mreal a)\r
 {\r
-       long nx=d->nx, ny=d->ny, nz=d->nz;\r
-#pragma omp parallel for collapse(3)\r
-       for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
-               d->a[i+nx*(j+ny*k)] *= a;\r
+       long n=d->GetNN();\r
+#pragma omp parallel for\r
+       for(long i=0;i<n;i++)   d->a[i] *= a;\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_data_div_dat(HMDT d, HCDT a)\r
@@ -574,26 +569,22 @@ void MGL_EXPORT mgl_data_div_dat(HMDT d, HCDT a)
                for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
                        d->a[i+nx*(j+ny*k)] /= v;\r
        }\r
-       else if(mz==1 && my==1 && nx==mx)\r
-#pragma omp parallel for collapse(3)\r
-               for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
-                       d->a[i+nx*(j+ny*k)] /= a->v(i);\r
-       else if(mz==1 && ny==my && nx==mx)\r
-#pragma omp parallel for collapse(3)\r
-               for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
-                       d->a[i+nx*(j+ny*k)] /= a->v(i,j);\r
-       else if(nz==mz && ny==my && nx==mx)\r
-#pragma omp parallel for collapse(3)\r
-               for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
-                       d->a[i+nx*(j+ny*k)] /= a->v(i,j,k);\r
+       else\r
+       {\r
+               long n=0, m=0;\r
+               if(nz*ny*nx==mz*my*mx)  {       n=nx*ny*nz;     m=1;    }\r
+               else if(ny*nx==my*mx)   {       n=nx*ny;        m=nz;   }\r
+               else if(nx==mx)                 {       n=nx;   m=ny*nz;        }\r
+#pragma omp parallel for collapse(2)\r
+               for(long k=0;k<m;k++)   for(long i=0;i<n;i++)   d->a[i+n*k] /= a->vthr(i);\r
+       }\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_data_div_num(HMDT d, mreal a)\r
 {\r
-       long nx=d->nx, ny=d->ny, nz=d->nz;\r
-#pragma omp parallel for collapse(3)\r
-       for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
-               d->a[i+nx*(j+ny*k)] /= a;\r
+       long n=d->GetNN();\r
+#pragma omp parallel for\r
+       for(long i=0;i<n;i++)   d->a[i] /= a;\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_data_add_dat(HMDT d, HCDT a)\r
@@ -607,26 +598,22 @@ void MGL_EXPORT mgl_data_add_dat(HMDT d, HCDT a)
                for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
                        d->a[i+nx*(j+ny*k)] += v;\r
        }\r
-       else if(mz==1 && my==1 && nx==mx)\r
-#pragma omp parallel for collapse(3)\r
-               for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
-                       d->a[i+nx*(j+ny*k)] += a->v(i);\r
-       else if(mz==1 && ny==my && nx==mx)\r
-#pragma omp parallel for collapse(3)\r
-               for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
-                       d->a[i+nx*(j+ny*k)] += a->v(i,j);\r
-       else if(nz==mz && ny==my && nx==mx)\r
-#pragma omp parallel for collapse(3)\r
-               for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
-                       d->a[i+nx*(j+ny*k)] += a->v(i,j,k);\r
+       else\r
+       {\r
+               long n=0, m=0;\r
+               if(nz*ny*nx==mz*my*mx)  {       n=nx*ny*nz;     m=1;    }\r
+               else if(ny*nx==my*mx)   {       n=nx*ny;        m=nz;   }\r
+               else if(nx==mx)                 {       n=nx;   m=ny*nz;        }\r
+#pragma omp parallel for collapse(2)\r
+               for(long k=0;k<m;k++)   for(long i=0;i<n;i++)   d->a[i+n*k] += a->vthr(i);\r
+       }\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_data_add_num(HMDT d, mreal a)\r
 {\r
-       long nx=d->nx, ny=d->ny, nz=d->nz;\r
-#pragma omp parallel for collapse(3)\r
-       for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
-               d->a[i+nx*(j+ny*k)] += a;\r
+       long n=d->GetNN();\r
+#pragma omp parallel for\r
+       for(long i=0;i<n;i++)   d->a[i] += a;\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_data_sub_dat(HMDT d, HCDT a)\r
@@ -640,26 +627,22 @@ void MGL_EXPORT mgl_data_sub_dat(HMDT d, HCDT a)
                for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
                        d->a[i+nx*(j+ny*k)] -= v;\r
        }\r
-       else if(mz==1 && my==1 && nx==mx)\r
-#pragma omp parallel for collapse(3)\r
-               for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
-                       d->a[i+nx*(j+ny*k)] -= a->v(i);\r
-       else if(mz==1 && ny==my && nx==mx)\r
-#pragma omp parallel for collapse(3)\r
-               for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
-                       d->a[i+nx*(j+ny*k)] -= a->v(i,j);\r
-       else if(nz==mz && ny==my && nx==mx)\r
-#pragma omp parallel for collapse(3)\r
-               for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
-                       d->a[i+nx*(j+ny*k)] -= a->v(i,j,k);\r
+       else\r
+       {\r
+               long n=0, m=0;\r
+               if(nz*ny*nx==mz*my*mx)  {       n=nx*ny*nz;     m=1;    }\r
+               else if(ny*nx==my*mx)   {       n=nx*ny;        m=nz;   }\r
+               else if(nx==mx)                 {       n=nx;   m=ny*nz;        }\r
+#pragma omp parallel for collapse(2)\r
+               for(long k=0;k<m;k++)   for(long i=0;i<n;i++)   d->a[i+n*k] -= a->vthr(i);\r
+       }\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_data_sub_num(HMDT d, mreal a)\r
 {\r
-       long nx=d->nx, ny=d->ny, nz=d->nz;\r
-#pragma omp parallel for collapse(3)\r
-       for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
-               d->a[i+nx*(j+ny*k)] -= a;\r
+       long n=d->GetNN();\r
+#pragma omp parallel for\r
+       for(long i=0;i<n;i++)   d->a[i] -= a;\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_data_mul_dat_(uintptr_t *d, uintptr_t *b)  {       mgl_data_mul_dat(_DT_, _DA_(b));        }\r
index 1afc6302c8befcbe5c804ccf67d5ebd9a10ccc65..82a4bebd374957589fecf698b38f647552c29c6c 100644 (file)
@@ -28,8 +28,8 @@
 #include "mgl2/thread.h"
 #include "mgl2/base.h"
 //-----------------------------------------------------------------------------
-mglData MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector<mglDataA*> &head);
-mglDataC MGL_NO_EXPORT mglFormulaCalcC(const char *str, const std::vector<mglDataA*> &head);
+HMDT MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector<mglDataA*> &head);
+HADT MGL_NO_EXPORT mglFormulaCalcC(const char *str, const std::vector<mglDataA*> &head);
 //-----------------------------------------------------------------------------
 void MGL_EXPORT mgl_data_refill_gr(HMGL gr, HMDT dat, HCDT xdat, HCDT ydat, HCDT zdat, HCDT vdat, long sl, const char *opt)
 {
@@ -45,6 +45,20 @@ void MGL_EXPORT mgl_data_refill_gr(HMGL gr, HMDT dat, HCDT xdat, HCDT ydat, HCDT
        gr->LoadState();
 }
 //-----------------------------------------------------------------------------
+void MGL_EXPORT mgl_datac_refill_gr(HMGL gr, HADT dat, HCDT xdat, HCDT ydat, HCDT zdat, HCDT vdat, long sl, const char *opt)
+{
+       if(!vdat)       return;
+       gr->SaveState(opt);
+       if(!ydat && !zdat)      mgl_datac_refill_x(dat,xdat,vdat,gr->Min.x,gr->Max.x,sl);
+//     else if(!xdat && !zdat) mgl_datac_refill_x(dat,ydat,vdat,gr->Min.y,gr->Max.y,sl);
+//     else if(!xdat && !ydat) mgl_datac_refill_x(dat,zdat,vdat,gr->Min.z,gr->Max.z,sl);
+       else if(!zdat)  mgl_datac_refill_xy(dat,xdat,ydat,vdat,gr->Min.x,gr->Max.x,gr->Min.y,gr->Max.y,sl);
+//     else if(!ydat)  mgl_datac_refill_xy(dat,xdat,zdat,vdat,gr->Min.x,gr->Max.x,gr->Min.z,gr->Max.z,sl);
+//     else if(!xdat)  mgl_datac_refill_xy(dat,ydat,zdat,vdat,gr->Min.y,gr->Max.y,gr->Min.z,gr->Max.z,sl);
+       else    mgl_datac_refill_xyz(dat,xdat,ydat,zdat,vdat,gr->Min.x,gr->Max.x,gr->Min.y,gr->Max.y,gr->Min.z,gr->Max.z);
+       gr->LoadState();
+}
+//-----------------------------------------------------------------------------
 void MGL_EXPORT mgl_data_refill_x_(uintptr_t *d, uintptr_t *xdat, uintptr_t *vdat, mreal *x1, mreal *x2, long *sl)
 {      mgl_data_refill_x(_DT_,_DA_(xdat),_DA_(vdat),*x1,*x2,*sl);      }
 void MGL_EXPORT mgl_data_refill_xy_(uintptr_t *d, uintptr_t *xdat, uintptr_t *ydat, uintptr_t *vdat, mreal *x1, mreal *x2, mreal *y1, mreal *y2, long *sl)
@@ -55,6 +69,16 @@ void MGL_EXPORT mgl_data_refill_gr_(uintptr_t *gr, uintptr_t *d, uintptr_t *xdat
 {      char *s=new char[l+1];  memcpy(s,opt,l);        s[l]=0;
        mgl_data_refill_gr(_GR_,_DT_,_DA_(xdat),_DA_(ydat),_DA_(zdat),_DA_(vdat),*sl,s);        delete []s;     }
 //-----------------------------------------------------------------------------
+void MGL_EXPORT mgl_datac_refill_x_(uintptr_t *d, uintptr_t *xdat, uintptr_t *vdat, mreal *x1, mreal *x2, long *sl)
+{      mgl_datac_refill_x(_DC_,_DA_(xdat),_DA_(vdat),*x1,*x2,*sl);     }
+void MGL_EXPORT mgl_datac_refill_xy_(uintptr_t *d, uintptr_t *xdat, uintptr_t *ydat, uintptr_t *vdat, mreal *x1, mreal *x2, mreal *y1, mreal *y2, long *sl)
+{      mgl_datac_refill_xy(_DC_,_DA_(xdat),_DA_(ydat),_DA_(vdat),*x1,*x2,*y1,*y2,*sl); }
+void MGL_EXPORT mgl_datac_refill_xyz_(uintptr_t *d, uintptr_t *xdat, uintptr_t *ydat, uintptr_t *zdat, uintptr_t *vdat, mreal *x1, mreal *x2, mreal *y1, mreal *y2, mreal *z1, mreal *z2)
+{      mgl_datac_refill_xyz(_DC_,_DA_(xdat),_DA_(ydat),_DA_(zdat),_DA_(vdat),*x1,*x2,*y1,*y2,*z1,*z2); }
+void MGL_EXPORT mgl_datac_refill_gr_(uintptr_t *gr, uintptr_t *d, uintptr_t *xdat, uintptr_t *ydat, uintptr_t *zdat, uintptr_t *vdat, long *sl, const char *opt,int l)
+{      char *s=new char[l+1];  memcpy(s,opt,l);        s[l]=0;
+       mgl_datac_refill_gr(_GR_,_DC_,_DA_(xdat),_DA_(ydat),_DA_(zdat),_DA_(vdat),*sl,s);       delete []s;     }
+//-----------------------------------------------------------------------------
 void MGL_EXPORT mgl_data_fill_eq(HMGL gr, HMDT d, const char *eq, HCDT vdat, HCDT wdat, const char *opt)
 {
        if(vdat && vdat->GetNN()!=d->GetNN())   return; // incompatible dimesions
@@ -73,8 +97,7 @@ void MGL_EXPORT mgl_data_fill_eq(HMGL gr, HMDT d, const char *eq, HCDT vdat, HCD
        list.push_back(&x);     list.push_back(&y);     list.push_back(&z);     list.push_back(&r);
        list.push_back(d);      list.push_back(&v);     list.push_back(&w);
        list.push_back(&i);     list.push_back(&j);     list.push_back(&k);
-       d->Set(mglFormulaCalc(eq,list));        d->s = s;
-       gr->LoadState();
+       d->Move(mglFormulaCalc(eq,list));       d->s = s;       gr->LoadState();
 }
 void MGL_EXPORT mgl_data_fill_eq_(uintptr_t *gr, uintptr_t *d, const char *eq, uintptr_t *v, uintptr_t *w, const char *opt,int l,int lo)
 {      char *s=new char[l+1];  memcpy(s,eq,l); s[l]=0;
@@ -99,8 +122,7 @@ void MGL_EXPORT mgl_datac_fill_eq(HMGL gr, HADT d, const char *eq, HCDT vdat, HC
        list.push_back(&x);     list.push_back(&y);     list.push_back(&z);     list.push_back(&r);
        list.push_back(d);      list.push_back(&v);     list.push_back(&w);
        list.push_back(&i);     list.push_back(&j);     list.push_back(&k);
-       d->Set(mglFormulaCalcC(eq,list));       d->s = s;
-       gr->LoadState();
+       d->Move(mglFormulaCalcC(eq,list));      d->s = s;       gr->LoadState();
 }
 void MGL_EXPORT mgl_datac_fill_eq_(uintptr_t *gr, uintptr_t *d, const char *eq, uintptr_t *v, uintptr_t *w, const char *opt,int l,int lo)
 {      char *s=new char[l+1];  memcpy(s,eq,l); s[l]=0;
index f1a44396f0957c5b662db9c62f6266cac85a2976..576125652e08039caa9931c18e5bb1476a271611 100644 (file)
@@ -40,7 +40,7 @@
 #endif\r
 \r
 inline bool isn(char ch)       {return ch=='\n';}\r
-mglData MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector<mglDataA*> &head);\r
+HMDT MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector<mglDataA*> &head);\r
 //-----------------------------------------------------------------------------\r
 HMDT MGL_EXPORT mgl_create_data()      {       return new mglData;     }\r
 HMDT MGL_EXPORT mgl_create_data_size(long nx, long ny, long nz){       return new mglData(nx,ny,nz);   }\r
@@ -903,7 +903,7 @@ void MGL_EXPORT mgl_data_modify_vw(HMDT d, const char *eq,HCDT vdat,HCDT wdat)
        list.push_back(&x);     list.push_back(&y);     list.push_back(&z);     list.push_back(d);\r
        list.push_back(&v);     list.push_back(&w);     list.push_back(&r);\r
        list.push_back(&i);     list.push_back(&j);     list.push_back(&k);\r
-       d->Set(mglFormulaCalc(eq,list));        d->s = s;\r
+       d->Move(mglFormulaCalc(eq,list));       d->s = s;\r
 }\r
 void MGL_EXPORT mgl_data_modify_vw_(uintptr_t *d, const char *eq, uintptr_t *v, uintptr_t *w,int l)\r
 {      char *s=new char[l+1];  memcpy(s,eq,l); s[l]=0;\r
@@ -1181,8 +1181,7 @@ HMDT MGL_EXPORT mgl_data_column(HCDT dat, const char *eq)
        if(list.size()==0)      return 0;       // no named columns\r
        mglDataV *t = new mglDataV(dat->GetNy(),dat->GetNz());\r
        t->s=L"#$mgl";  list.push_back(t);\r
-       mglData *r = new mglData;\r
-       r->Set(mglFormulaCalc(eq,list));\r
+       HMDT r = mglFormulaCalc(eq,list);\r
        for(size_t i=0;i<list.size();i++)       delete list[i];\r
        return r;\r
 }\r
index 2773487d787e074156327a4fb08e6430459b49ad..d6a15be64cc24085f0404d88b4eeec9eaebb1b3d 100644 (file)
@@ -41,7 +41,7 @@ MGL_NO_EXPORT unsigned char *mgl_create_scheme(const char *scheme,long &num)
        mglColor col;\r
        for(size_t i=0;i<l;i++)\r
        {\r
-               col = mglColor(scheme[i]);\r
+               col.Set(scheme[i]);\r
                if(col.Valid())\r
                {       cc[3*np]=255*col.r;     cc[3*np+1]=255*col.g;   cc[3*np+2]=255*col.b;   np++;   }\r
        }\r
diff --git a/src/def_font.cc b/src/def_font.cc
new file mode 100644 (file)
index 0000000..4497e52
--- /dev/null
@@ -0,0 +1,1239 @@
+const long mgl_numg=411, mgl_cur=243136;
+const float mgl_fact=35.7143;
+long mgl_gen_fnt[411][6] = {
+       {0x21,166,41,0,39,164},
+       {0x22,204,43,398,38,570},
+       {0x23,250,33,798,32,930},
+       {0x24,250,81,1122,80,1446},
+       {0x25,373,130,1926,129,2446},
+       {0x26,388,128,3220,127,3732},
+       {0x27,89,20,4494,19,4574},
+       {0x28,166,22,4688,20,4776},
+       {0x29,166,22,4896,21,4984},
+       {0x2a,250,154,5110,169,5726},
+       {0x2b,342,12,6740,8,6788},
+       {0x2c,125,34,6836,34,6972},
+       {0x2d,166,4,7176,2,7192},
+       {0x2e,125,21,7204,18,7288},
+       {0x2f,138,4,7396,2,7412},
+       {0x30,250,43,7424,41,7596},
+       {0x31,250,28,7842,27,7954},
+       {0x32,250,43,8116,41,8288},
+       {0x33,250,91,8534,90,8898},
+       {0x34,250,15,9438,12,9498},
+       {0x35,250,72,9570,77,9858},
+       {0x36,250,68,10320,66,10592},
+       {0x37,250,13,10988,11,11040},
+       {0x38,250,85,11106,83,11446},
+       {0x39,250,68,11944,67,12216},
+       {0x3a,138,43,12618,36,12790},
+       {0x3b,138,57,13006,52,13234},
+       {0x3c,342,7,13546,5,13574},
+       {0x3d,342,9,13604,4,13640},
+       {0x3e,342,7,13664,5,13692},
+       {0x3f,222,77,13722,73,14030},
+       {0x40,460,136,14468,136,15012},
+       {0x41,361,47,15828,50,16016},
+       {0x42,333,90,16316,90,16676},
+       {0x43,333,72,17216,72,17504},
+       {0x44,361,67,17936,68,18204},
+       {0x45,305,57,18612,54,18840},
+       {0x46,277,51,19164,47,19368},
+       {0x47,361,88,19650,86,20002},
+       {0x48,361,60,20518,56,20758},
+       {0x49,166,27,21094,26,21202},
+       {0x4a,186,45,21358,43,21538},
+       {0x4b,361,70,21796,69,22076},
+       {0x4c,305,37,22490,39,22638},
+       {0x4d,444,49,22872,47,23068},
+       {0x4e,361,47,23350,50,23538},
+       {0x4f,361,63,23838,60,24090},
+       {0x50,278,66,24450,69,24714},
+       {0x51,361,85,25128,83,25468},
+       {0x52,333,69,25966,69,26242},
+       {0x53,277,91,26656,94,27020},
+       {0x54,305,32,27584,30,27712},
+       {0x55,361,68,27892,68,28164},
+       {0x56,361,42,28572,41,28740},
+       {0x57,472,72,28986,75,29274},
+       {0x58,361,82,29724,80,30052},
+       {0x59,361,55,30532,54,30752},
+       {0x5a,305,32,31076,30,31204},
+       {0x5b,166,18,31384,16,31456},
+       {0x5c,138,4,31552,2,31568},
+       {0x5d,166,17,31580,16,31648},
+       {0x5e,234,7,31744,5,31772},
+       {0x5f,250,4,31802,2,31818},
+       {0x60,166,17,31830,16,31898},
+       {0x61,222,112,31994,115,32442},
+       {0x62,250,70,33132,71,33412},
+       {0x63,222,62,33838,60,34086},
+       {0x64,250,72,34446,79,34734},
+       {0x65,222,53,35208,53,35420},
+       {0x66,166,57,35738,53,35966},
+       {0x67,250,139,36284,149,36840},
+       {0x68,250,60,37734,67,37974},
+       {0x69,138,45,38376,44,38556},
+       {0x6a,138,71,38820,71,39104},
+       {0x6b,250,69,39530,72,39806},
+       {0x6c,138,30,40238,30,40358},
+       {0x6d,388,102,40538,108,40946},
+       {0x6e,250,66,41594,67,41858},
+       {0x6f,250,53,42260,50,42472},
+       {0x70,250,68,42772,72,43044},
+       {0x71,250,64,43476,68,43732},
+       {0x72,166,61,44140,61,44384},
+       {0x73,194,79,44750,86,45066},
+       {0x74,138,47,45582,49,45770},
+       {0x75,250,54,46064,56,46280},
+       {0x76,250,54,46616,53,46832},
+       {0x77,361,72,47150,81,47438},
+       {0x78,250,83,47924,89,48256},
+       {0x79,250,74,48790,79,49086},
+       {0x7a,222,27,49560,25,49668},
+       {0x7b,239,55,49818,54,50038},
+       {0x7c,99,4,50362,2,50378},
+       {0x7d,239,55,50390,55,50610},
+       {0x7e,270,41,50940,40,51104},
+       {0xa1,165,41,51344,39,51508},
+       {0xa2,250,81,51742,84,52066},
+       {0xa3,250,135,52570,148,53110},
+       {0xa4,250,73,53998,72,54290},
+       {0xa5,250,71,54722,69,55006},
+       {0xa6,99,9,55420,4,55456},
+       {0xa7,250,152,55480,156,56088},
+       {0xa8,166,43,57024,36,57196},
+       {0xa9,380,92,57412,87,57780},
+       {0xaa,137,95,58302,103,58682},
+       {0xab,250,69,59300,73,59576},
+       {0xac,300,6,60014,4,60038},
+       {0xad,166,4,60062,2,60078},
+       {0xae,380,106,60090,106,60514},
+       {0xaf,166,4,61150,2,61166},
+       {0xb0,199,43,61178,41,61350},
+       {0xb1,342,17,61596,10,61664},
+       {0xb2,150,41,61724,41,61888},
+       {0xb3,150,74,62134,75,62430},
+       {0xb4,166,16,62880,16,62944},
+       {0xb5,250,68,63040,67,63312},
+       {0xb6,295,48,63714,47,63906},
+       {0xb7,125,21,64188,18,64272},
+       {0xb8,166,40,64380,43,64540},
+       {0xb9,150,23,64798,26,64890},
+       {0xba,155,46,65046,45,65230},
+       {0xbb,250,73,65500,72,65792},
+       {0xbc,375,43,66224,40,66396},
+       {0xbd,375,74,66636,69,66932},
+       {0xbe,375,95,67346,89,67726},
+       {0xbf,222,86,68260,82,68604},
+       {0xc0,361,65,69096,66,69356},
+       {0xc1,361,65,69752,66,70012},
+       {0xc2,361,55,70408,55,70628},
+       {0xc3,361,89,70958,92,71314},
+       {0xc4,361,91,71866,86,72230},
+       {0xc5,361,91,72746,90,73110},
+       {0xc6,444,86,73650,85,73994},
+       {0xc7,333,108,74504,116,74936},
+       {0xc8,305,74,75632,70,75928},
+       {0xc9,305,74,76348,70,76644},
+       {0xca,305,65,77064,59,77324},
+       {0xcb,305,101,77678,90,78082},
+       {0xcc,166,45,78622,42,78802},
+       {0xcd,166,45,79054,42,79234},
+       {0xce,166,36,79486,31,79630},
+       {0xcf,166,72,79816,62,80104},
+       {0xd0,361,70,80476,69,80756},
+       {0xd1,361,88,81170,92,81522},
+       {0xd2,361,80,82074,76,82394},
+       {0xd3,361,81,82850,76,83174},
+       {0xd4,361,71,83630,65,83914},
+       {0xd5,361,104,84304,102,84720},
+       {0xd6,361,107,85332,96,85760},
+       {0xd7,319,12,86336,10,86384},
+       {0xd8,361,78,86444,80,86756},
+       {0xd9,361,87,87236,84,87584},
+       {0xda,361,87,88088,84,88436},
+       {0xdb,361,76,88940,73,89244},
+       {0xdc,361,112,89682,104,90130},
+       {0xdd,361,73,90754,70,91046},
+       {0xde,277,70,91466,75,91746},
+       {0xdf,250,98,92196,98,92588},
+       {0xe0,222,130,93176,131,93696},
+       {0xe1,222,129,94482,131,94998},
+       {0xe2,222,120,95784,120,96264},
+       {0xe3,222,155,96984,157,97604},
+       {0xe4,222,156,98546,151,99170},
+       {0xe5,222,156,100076,155,100700},
+       {0xe6,333,127,101630,132,102138},
+       {0xe7,222,97,102930,99,103318},
+       {0xe8,222,71,103912,69,104196},
+       {0xe9,222,72,104610,69,104898},
+       {0xea,222,61,105312,58,105556},
+       {0xeb,222,97,105904,89,106292},
+       {0xec,138,40,106826,42,106986},
+       {0xed,138,41,107238,42,107402},
+       {0xee,138,33,107654,31,107786},
+       {0xef,138,70,107972,62,108252},
+       {0xf0,250,74,108624,72,108920},
+       {0xf1,250,109,109352,109,109788},
+       {0xf2,250,71,110442,66,110726},
+       {0xf3,250,71,111122,66,111406},
+       {0xf4,250,61,111802,55,112046},
+       {0xf5,250,94,112376,92,112752},
+       {0xf6,250,97,113304,86,113692},
+       {0xf7,281,48,114208,38,114400},
+       {0xf8,250,73,114628,76,114920},
+       {0xf9,250,73,115376,72,115668},
+       {0xfa,250,73,116100,72,116392},
+       {0xfb,250,62,116824,61,117072},
+       {0xfc,250,98,117438,92,117830},
+       {0xfd,250,92,118382,95,118750},
+       {0xfe,250,71,119320,72,119604},
+       {0xff,250,118,120036,115,120508},
+       {0x300,0,15,121198,16,121258},
+       {0x301,0,16,121354,16,121418},
+       {0x302,0,7,121514,5,121542},
+       {0x303,0,40,121572,40,121732},
+       {0x304,0,4,121972,2,121988},
+       {0x305,0,4,122000,2,122016},
+       {0x306,0,22,122028,20,122116},
+       {0x307,0,21,122236,18,122320},
+       {0x308,0,43,122428,36,122600},
+       {0x309,0,44,122816,43,122992},
+       {0x30a,0,43,123250,40,123422},
+       {0x30b,0,36,123662,32,123806},
+       {0x30c,0,7,123998,5,124026},
+       {0x30d,0,4,124056,2,124072},
+       {0x30e,0,9,124084,4,124120},
+       {0x30f,0,36,124144,32,124288},
+       {0x391,361,45,124480,46,124660},
+       {0x392,333,71,124936,70,125220},
+       {0x393,293,35,125640,33,125780},
+       {0x394,361,8,125978,7,126010},
+       {0x395,305,56,126052,52,126276},
+       {0x396,305,32,126588,30,126716},
+       {0x397,361,60,126896,56,127136},
+       {0x398,361,105,127472,104,127892},
+       {0x399,166,27,128516,26,128624},
+       {0x39a,365,70,128780,69,129060},
+       {0x39b,351,41,129474,40,129638},
+       {0x39c,444,49,129878,47,130074},
+       {0x39d,361,47,130356,50,130544},
+       {0x39e,321,62,130844,54,131092},
+       {0x39f,361,63,131416,60,131668},
+       {0x3a0,361,52,132028,52,132236},
+       {0x3a1,278,66,132548,69,132812},
+       {0x3a2,0,0,133226,0,133226},
+       {0x3a3,311,24,133226,22,133322},
+       {0x3a4,305,32,133454,30,133582},
+       {0x3a5,361,55,133762,56,133982},
+       {0x3a6,381,76,134318,77,134622},
+       {0x3a7,361,82,135084,80,135412},
+       {0x3a8,372,81,135892,81,136216},
+       {0x3a9,372,62,136702,60,136950},
+       {0x3aa,166,71,137310,62,137594},
+       {0x3ab,361,99,137966,92,138362},
+       {0x3ac,271,84,138914,80,139250},
+       {0x3ad,219,111,139730,110,140174},
+       {0x3ae,256,71,140834,72,141118},
+       {0x3af,137,52,141550,54,141758},
+       {0x3b0,262,119,142082,110,142558},
+       {0x3b1,271,66,143218,64,143482},
+       {0x3b2,247,96,143866,99,144250},
+       {0x3b3,237,47,144844,48,145032},
+       {0x3b4,250,83,145320,80,145652},
+       {0x3b5,219,94,146132,94,146508},
+       {0x3b6,220,100,147072,101,147472},
+       {0x3b7,256,55,148078,56,148298},
+       {0x3b8,247,57,148634,56,148862},
+       {0x3b9,137,34,149198,38,149334},
+       {0x3ba,250,64,149562,66,149818},
+       {0x3bb,248,48,150214,47,150406},
+       {0x3bc,263,64,150688,63,150944},
+       {0x3bd,227,33,151322,35,151454},
+       {0x3be,220,137,151664,139,152212},
+       {0x3bf,252,43,153046,41,153218},
+       {0x3c0,250,67,153464,69,153732},
+       {0x3c1,247,55,154146,53,154366},
+       {0x3c2,220,79,154684,79,155000},
+       {0x3c3,273,45,155474,43,155654},
+       {0x3c4,238,46,155912,44,156096},
+       {0x3c5,262,58,156360,58,156592},
+       {0x3c6,311,73,156940,72,157232},
+       {0x3c7,250,52,157664,51,157872},
+       {0x3c8,347,54,158178,55,158394},
+       {0x3c9,312,91,158724,90,159088},
+       {0x3d1,276,96,159628,99,160012},
+       {0x3d5,311,63,160606,64,160858},
+       {0x3d6,381,95,161242,96,161622},
+       {0x3f0,275,77,162198,76,162506},
+       {0x3f1,250,63,162962,62,163214},
+       {0x3f5,219,51,163586,50,163790},
+       {0x410,356,47,164090,50,164278},
+       {0x411,305,63,164578,60,164830},
+       {0x412,325,92,165190,90,165558},
+       {0x413,285,38,166098,38,166250},
+       {0x414,332,71,166478,73,166762},
+       {0x415,314,56,167200,54,167424},
+       {0x416,510,145,167748,143,168328},
+       {0x417,287,90,169186,89,169546},
+       {0x418,361,58,170080,55,170312},
+       {0x419,361,107,170642,104,171070},
+       {0x41a,344,100,171694,99,172094},
+       {0x41b,341,64,172688,64,172944},
+       {0x41c,446,48,173328,47,173520},
+       {0x41d,362,60,173802,56,174042},
+       {0x41e,364,63,174378,60,174630},
+       {0x41f,362,52,174990,52,175198},
+       {0x420,285,65,175510,69,175770},
+       {0x421,338,71,176184,72,176468},
+       {0x422,309,32,176900,30,177028},
+       {0x423,355,75,177208,78,177508},
+       {0x424,384,76,177976,77,178280},
+       {0x425,358,82,178742,80,179070},
+       {0x426,357,59,179550,63,179786},
+       {0x427,328,64,180164,63,180420},
+       {0x428,497,71,180798,78,181082},
+       {0x429,497,81,181550,89,181874},
+       {0x42a,368,53,182408,50,182620},
+       {0x42b,441,80,182920,75,183240},
+       {0x42c,305,51,183690,48,183894},
+       {0x42d,325,76,184182,76,184486},
+       {0x42e,450,93,184942,89,185314},
+       {0x42f,318,64,185848,64,186104},
+       {0x430,224,113,186488,114,186940},
+       {0x431,253,79,187624,78,187940},
+       {0x432,237,84,188408,84,188744},
+       {0x433,196,34,189248,32,189384},
+       {0x434,231,59,189576,64,189812},
+       {0x435,233,49,190196,48,190392},
+       {0x436,360,144,190680,148,191256},
+       {0x437,194,85,192144,88,192484},
+       {0x438,262,56,193012,55,193236},
+       {0x439,262,106,193566,103,193990},
+       {0x43a,251,85,194608,87,194948},
+       {0x43b,249,63,195470,64,195722},
+       {0x43c,308,48,196106,48,196298},
+       {0x43d,262,58,196586,56,196818},
+       {0x43e,256,53,197154,50,197366},
+       {0x43f,262,52,197666,52,197874},
+       {0x440,249,71,198186,72,198470},
+       {0x441,228,63,198902,60,199154},
+       {0x442,217,40,199514,38,199674},
+       {0x443,245,69,199902,73,200178},
+       {0x444,338,134,200616,136,201152},
+       {0x445,244,77,201968,81,202276},
+       {0x446,262,57,202762,59,202990},
+       {0x447,256,62,203344,63,203592},
+       {0x448,383,76,203970,78,204274},
+       {0x449,383,82,204742,85,205070},
+       {0x44a,269,56,205580,54,205804},
+       {0x44b,334,77,206128,75,206436},
+       {0x44c,228,49,206886,48,207082},
+       {0x44d,222,54,207370,55,207586},
+       {0x44e,368,81,207916,79,208240},
+       {0x44f,235,59,208714,59,208950},
+       {0x210f,289,94,209304,101,209680},
+       {0x2111,381,130,210286,125,210806},
+       {0x2113,0,0,211556,0,211556},
+       {0x211c,436,132,211556,135,212084},
+       {0x2190,463,40,212894,44,213054},
+       {0x2191,255,39,213318,44,213474},
+       {0x2192,463,41,213738,44,213902},
+       {0x2193,255,38,214166,44,214318},
+       {0x2194,463,75,214582,86,214882},
+       {0x2195,255,74,215398,86,215694},
+       {0x2196,463,50,216210,66,216410},
+       {0x2197,463,50,216806,65,217006},
+       {0x2198,463,45,217396,63,217576},
+       {0x2199,463,49,217954,64,218150},
+       {0x2200,280,12,218534,11,218582},
+       {0x2201,231,48,218648,47,218840},
+       {0x2202,235,70,219122,72,219402},
+       {0x2203,280,12,219834,10,219882},
+       {0x2204,280,30,219942,30,220062},
+       {0x2205,381,70,220242,70,220522},
+       {0x2206,365,8,220942,7,220974},
+       {0x2207,365,8,221016,7,221048},
+       {0x2208,342,29,221090,27,221206},
+       {0x2209,342,52,221368,56,221576},
+       {0x220a,242,29,221912,27,222028},
+       {0x220b,342,30,222190,27,222310},
+       {0x220c,342,56,222472,55,222696},
+       {0x220d,242,29,223026,28,223142},
+       {0x220e,272,4,223310,2,223326},
+       {0x220f,500,49,223338,47,223534},
+       {0x2210,500,49,223816,47,224012},
+       {0x2211,457,22,224294,20,224382},
+       {0x2212,342,4,224502,2,224518},
+       {0x2213,342,17,224530,10,224598},
+       {0x2214,342,34,224658,26,224794},
+       {0x2215,261,4,224950,2,224966},
+       {0x2216,213,4,224978,2,224994},
+       {0x2217,261,135,225006,133,225546},
+       {0x2218,175,43,226344,40,226516},
+       {0x2219,175,21,226756,18,226840},
+       {0x221a,463,19,226948,18,227024},
+       {0x221b,463,93,227132,93,227504},
+       {0x221c,463,35,228062,30,228202},
+       {0x221d,342,65,228382,65,228642},
+       {0x221e,463,85,229032,85,229372},
+       {0x221f,342,6,229882,4,229906},
+       {0x2220,342,6,229930,4,229954},
+       {0x2221,342,33,229978,42,230110},
+       {0x2222,342,48,230362,52,230554},
+       {0x2223,132,4,230866,2,230882},
+       {0x2224,202,12,230894,8,230942},
+       {0x2225,261,9,230990,4,231026},
+       {0x2226,304,20,231050,14,231130},
+       {0x2227,310,7,231214,5,231242},
+       {0x2228,310,7,231272,5,231300},
+       {0x2229,310,26,231330,25,231434},
+       {0x222a,310,26,231584,24,231688},
+       {0x222b,229,67,231832,70,232100},
+       {0x222c,350,137,232520,140,233068},
+       {0x222d,471,205,233908,210,234728},
+       {0x222e,249,117,235988,126,236456},
+       {0x222f,370,209,237212,232,238048},
+       {0x2260,342,20,239440,18,239520},
+       {0x2261,342,14,239628,6,239684},
+       {0x2262,342,28,239720,26,239832},
+       {0x2263,342,19,239988,8,240064},
+       {0x2264,342,12,240112,7,240160},
+       {0x2265,342,12,240202,7,240250},
+       {0x2266,342,17,240292,9,240360},
+       {0x2267,342,17,240414,9,240482},
+       {0x2268,342,28,240536,23,240648},
+       {0x2269,342,28,240786,23,240898},
+       {0x226a,466,15,241036,10,241096},
+       {0x226b,466,15,241156,10,241216},
+       {0x226c,233,80,241276,84,241596},
+       {0x226d,342,55,242100,60,242320},
+       {0x226e,342,20,242680,19,242760},
+       {0x226f,342,20,242874,19,242954},
+       {0x27c2,346,8,243068,6,243100}
+};
+short mgl_buf_fnt[243136] = {
+88,88,94,88,117,278,117,282,118,286,118,297,117,311,113,322,108,331,101,336,92,338,81,336,74,331,69,323,66,312,65,300,65,289,66,284,66,278,16383,16383,118,21,116,30,113,37,107,43,100,47,92,49,83,47,76,43,70,37,66,30,65,22,66,13,70,6,75,0,82,-2,91,-3,100,-2,107,0,113,6,116,13,118,21,150,215,154,243,158,268,162,289,165,306,166,318,165,324,162,330,157,334,151,337,145,338,138,337,132,334,127,330,124,324,123,316,124,307,126,291,129,270,134,244,139,215,16383,16383,65,215,70,243,75,268,78,289,80,306,81,318,80,324,77,330,73,334,67,337,60,338,53,337,47,334,42,330,40,324,39,316,39,307,42,291,45,270,
+107,43,107,0,113,37,113,37,107,0,113,6,113,37,113,6,116,30,116,30,113,6,116,13,116,30,116,13,118,21,65,22,66,13,66,30,66,30,66,13,70,6,66,30,70,6,70,37,70,37,70,6,75,0,70,37,75,0,76,43,76,43,75,0,82,-2,76,43,82,-2,83,47,83,47,82,-2,91,-3,83,47,91,-3,92,49,92,49,91,-3,100,-2,92,49,100,-2,100,47,100,47,100,-2,107,0,100,47,107,0,107,43,118,297,117,311,117,278,118,297,117,278,117,282,118,297,117,282,118,286,118,297,118,286,118,290,118,297,118,290,118,294,117,278,117,311,113,322,117,278,113,322,108,331,117,278,108,331,101,336,117,278,101,336,94,88,92,338,81,336,88,88,92,338,88,88,94,88,92,338,94,88,101,336,66,284,66,278,69,323,69,323,66,278,88,88,69,323,88,88,74,331,74,331,88,88,81,336,66,312,65,300,65,297,66,312,65,297,65,293,66,312,65,293,65,289,66,312,65,289,66,284,66,312,66,284,69,323,
+150,215,154,243,158,268,162,289,165,306,166,318,165,324,162,330,157,334,151,337,145,338,138,337,132,334,127,330,124,324,123,316,124,307,126,291,129,270,134,244,139,215,16383,16383,65,215,70,243,75,268,78,289,80,306,81,318,80,324,77,330,73,334,67,337,60,338,53,337,47,334,42,330,40,324,39,316,39,307,42,291,45,270,50,244,55,215,248,203,248,230,200,230,214,331,185,331,171,230,104,230,119,331,90,331,75,230,17,230,17,203,71,203,60,136,3,136,3,108,56,108,40,0,69,0,85,108,152,108,137,0,166,0,181,108,235,108,235,136,185,136,195,203,16383,16383,166,203,156,136,89,136,100,203,132,319,154,314,172,304,186,291,197,273,205,250,213,250,213,305,202,314,189,321,
+123,316,124,307,124,324,124,324,124,307,126,291,124,324,126,291,127,330,127,330,126,291,129,270,127,330,129,270,132,334,132,334,129,270,134,244,132,334,134,244,138,337,138,337,134,244,139,215,138,337,139,215,145,338,145,338,139,215,150,215,145,338,150,215,151,337,151,337,150,215,154,243,151,337,154,243,157,334,157,334,154,243,158,268,157,334,158,268,162,330,162,330,158,268,162,289,162,330,162,289,165,324,165,324,162,289,165,306,165,324,165,306,166,318,39,316,39,307,40,324,40,324,39,307,42,291,40,324,42,291,42,330,42,330,42,291,45,270,42,330,45,270,47,334,47,334,45,270,50,244,47,334,50,244,53,337,53,337,50,244,55,215,53,337,55,215,60,338,60,338,55,215,65,215,60,338,65,215,67,337,67,337,65,215,70,243,67,337,70,243,73,334,73,334,70,243,75,268,73,334,75,268,77,330,77,330,75,268,78,289,77,330,78,289,80,324,80,324,78,289,80,306,80,324,80,306,81,318,
+248,203,248,230,200,230,214,331,185,331,171,230,104,230,119,331,90,331,75,230,17,230,17,203,71,203,60,136,3,136,3,108,56,108,40,0,69,0,85,108,152,108,137,0,166,0,181,108,235,108,235,136,185,136,195,203,16383,16383,166,203,156,136,89,136,100,203,132,319,154,314,172,304,186,291,197,273,205,250,213,250,213,305,202,314,189,321,173,326,155,330,132,332,132,363,115,363,115,332,88,328,64,319,44,304,31,283,26,257,29,234,38,214,54,196,79,177,115,155,115,14,90,17,69,27,52,42,38,63,30,90,22,90,
+90,331,75,230,85,108,85,108,75,230,71,203,85,108,71,203,69,0,69,0,71,203,60,136,69,0,60,136,56,108,56,108,60,136,3,136,56,108,3,136,3,108,17,230,17,203,71,203,17,230,71,203,75,230,90,331,85,108,89,136,90,331,89,136,100,203,90,331,100,203,104,230,90,331,104,230,119,331,185,331,171,230,181,108,181,108,171,230,166,203,181,108,166,203,166,0,166,0,166,203,156,136,166,0,156,136,152,108,152,108,156,136,89,136,152,108,89,136,85,108,104,230,100,203,166,203,104,230,166,203,171,230,200,230,214,331,195,203,195,203,214,331,185,331,195,203,185,331,185,136,185,136,185,331,181,108,185,136,181,108,235,108,200,230,195,203,248,203,200,230,248,203,248,230,185,136,235,108,235,136,166,0,152,108,137,0,69,0,56,108,40,0,
+132,319,154,314,172,304,186,291,197,273,205,250,213,250,213,305,202,314,189,321,173,326,155,330,132,332,132,363,115,363,115,332,88,328,64,319,44,304,31,283,26,257,29,234,38,214,54,196,79,177,115,155,115,14,90,17,69,27,52,42,38,63,30,90,22,90,22,26,38,16,54,9,71,4,91,1,115,0,115,-43,132,-43,132,0,164,6,191,17,211,32,224,54,229,85,228,96,227,105,225,115,222,123,219,130,210,141,199,152,185,164,163,178,132,195,16383,16383,115,204,93,219,79,232,69,243,64,254,63,266,65,281,71,293,81,304,96,313,115,319,16383,16383,132,147,156,132,172,118,182,105,188,90,189,74,187,55,181,40,170,28,154,20,132,14,343,107,341,127,335,143,325,155,312,163,295,165,267,159,241,143,220,120,206,91,200,60,203,38,212,18,225,4,242,-5,261,-8,286,-2,309,14,327,39,339,71,343,107,16383,16383,331,108,328,77,318,48,303,25,285,10,265,4,255,6,248,10,242,18,238,27,237,38,239,59,244,82,252,103,263,123,276,140,280,144,284,147,290,149,295,151,300,151,311,149,319,143,326,134,330,122,331,108,16383,16383,310,353,289,353,265,331,248,317,235,309,221,305,194,305,185,307,176,311,167,317,157,324,150,330,144,334,138,336,133,338,127,338,97,332,71,317,50,293,36,264,31,232,34,209,42,191,54,176,70,166,89,163,99,164,108,166,116,169,132,181,146,197,157,215,
+132,319,154,314,155,330,155,330,154,314,172,304,155,330,172,304,173,326,173,326,172,304,186,291,173,326,186,291,189,321,189,321,186,291,197,273,189,321,197,273,202,314,202,314,197,273,205,250,202,314,205,250,213,305,213,305,205,250,213,250,228,96,227,105,229,85,229,85,227,105,225,115,229,85,225,115,224,54,224,54,225,115,222,123,224,54,222,123,219,130,211,32,224,54,219,130,211,32,219,130,210,141,211,32,210,141,199,152,211,32,199,152,191,17,191,17,199,152,189,74,191,17,189,74,187,55,191,17,187,55,181,40,191,17,181,40,170,28,191,17,170,28,164,6,188,90,189,74,199,152,188,90,199,152,185,164,188,90,185,164,182,105,132,147,156,132,163,178,163,178,156,132,172,118,163,178,172,118,185,164,185,164,172,118,182,105,132,14,132,147,132,195,132,14,132,195,115,155,132,14,115,155,132,-43,132,332,132,363,115,155,132,332,115,155,132,195,132,332,132,195,132,319,132,332,132,319,155,330,115,0,115,155,115,14,115,0,115,14,91,1,91,1,115,14,90,17,91,1,90,17,71,4,71,4,90,17,69,27,71,4,69,27,54,9,54,9,69,27,52,42,54,9,52,42,38,63,38,16,54,9,38,63,38,16,38,63,30,90,38,16,30,90,22,90,38,16,22,90,22,26,132,363,115,363,115,319,115,319,115,363,115,332,115,319,115,155,132,363,71,293,81,304,88,328,88,328,81,304,96,313,88,328,96,313,115,332,115,332,96,313,115,319,64,319,44,304,54,196,64,319,54,196,63,266,64,319,63,266,65,281,64,319,65,281,71,293,64,319,71,293,88,328,63,266,54,196,64,254,64,254,54,196,79,177,64,254,79,177,69,243,69,243,79,177,79,232,26,257,29,234,31,283,31,283,29,234,38,214,31,283,38,214,44,304,44,304,38,214,54,196,79,232,79,177,93,219,93,219,79,177,115,155,93,219,115,155,115,204,115,204,115,155,115,319,164,6,170,28,154,20,164,6,154,20,132,14,164,6,132,14,132,0,132,-43,115,155,115,0,132,-43,115,0,115,-43,132,195,132,147,163,178,
+343,107,341,127,335,143,325,155,312,163,295,165,267,159,241,143,220,120,206,91,200,60,203,38,212,18,225,4,242,-5,261,-8,286,-2,309,14,327,39,339,71,343,107,16383,16383,331,108,328,77,318,48,303,25,285,10,265,4,255,6,248,10,242,18,238,27,237,38,239,59,244,82,252,103,263,123,276,140,280,144,284,147,290,149,295,151,300,151,311,149,319,143,326,134,330,122,331,108,16383,16383,310,353,289,353,265,331,248,317,235,309,221,305,194,305,185,307,176,311,167,317,157,324,150,330,144,334,138,336,133,338,127,338,97,332,71,317,50,293,36,264,31,232,34,209,42,191,54,176,70,166,89,163,99,164,108,166,116,169,132,181,146,197,157,215,165,234,171,255,172,276,172,289,171,294,171,299,179,296,187,294,194,292,201,292,209,291,223,292,236,295,247,301,258,309,269,320,72,-8,95,-8,16383,16383,161,285,157,251,148,222,133,198,115,182,94,176,85,178,77,183,71,190,67,200,66,211,67,228,70,245,75,262,82,278,90,293,95,302,101,309,107,314,115,319,126,325,135,316,140,312,144,310,148,307,153,305,157,301,159,297,160,292,161,285,368,55,359,45,350,38,342,33,332,30,321,29,304,31,288,36,274,46,259,58,246,75,260,96,273,115,284,134,296,152,309,173,316,184,323,192,332,198,342,201,355,203,355,213,248,213,248,203,261,201,270,197,276,193,279,187,280,179,278,165,273,150,264,133,251,113,234,89,218,107,205,126,192,146,180,167,168,192,199,207,221,222,235,238,243,256,246,276,242,298,233,315,218,328,199,335,177,338,153,335,132,325,116,309,105,288,101,263,101,250,103,237,106,223,111,207,118,189,99,177,72,158,50,138,34,116,24,92,21,69,25,42,36,20,53,5,77,-3,107,-6,130,-4,151,0,172,9,193,22,214,39,233,22,250,9,266,0,283,-4,300,-6,319,-3,336,3,352,14,365,30,375,50,16383,16383,219,278,217,261,211,246,200,233,183,220,161,208,152,225,146,239,143,253,141,266,141,281,142,294,148,306,156,315,167,320,180,322,193,320,204,314,212,304,217,292,219,278,16383,16383,202,52,185,40,170,31,155,25,142,21,129,20,109,23,92,31,79,45,70,64,67,87,69,106,75,124,86,140,103,155,126,171,142,141,156,115,170,92,202,52,50,215,56,244,
+326,134,330,122,335,143,335,143,330,122,331,108,339,71,331,108,328,77,339,71,328,77,327,39,327,39,328,77,318,48,327,39,318,48,309,14,309,14,318,48,303,25,309,14,303,25,286,-2,286,-2,303,25,285,10,286,-2,285,10,265,4,265,4,255,6,261,-8,261,-8,255,6,248,10,261,-8,248,10,242,18,242,-5,261,-8,242,18,242,-5,242,18,238,27,242,-5,238,27,237,38,242,-5,237,38,225,4,244,82,252,103,267,159,267,159,252,103,263,123,267,159,263,123,276,140,276,140,280,144,295,165,295,165,280,144,284,147,295,165,284,147,290,149,241,143,220,120,225,4,241,143,225,4,237,38,241,143,237,38,239,59,241,143,239,59,244,82,241,143,244,82,267,159,200,60,203,38,206,91,206,91,203,38,212,18,206,91,212,18,220,120,220,120,212,18,225,4,326,134,325,155,319,143,319,143,325,155,312,163,319,143,312,163,311,149,311,149,312,163,300,151,295,151,300,151,295,165,295,151,295,165,290,149,295,165,267,159,276,140,312,163,295,165,300,151,339,71,343,107,341,127,339,71,341,127,335,143,339,71,335,143,331,108,265,4,261,-8,286,-2,67,228,70,245,71,317,71,317,70,245,75,262,71,317,75,262,97,332,97,332,75,262,82,278,97,332,82,278,90,293,90,293,95,302,97,332,97,332,95,302,101,309,97,332,101,309,127,338,127,338,101,309,107,314,127,338,107,314,115,319,77,183,89,163,85,178,85,178,89,163,94,176,115,182,94,176,99,164,115,182,99,164,108,166,71,190,67,200,70,166,71,190,70,166,89,163,71,190,89,163,77,183,67,200,66,211,70,166,70,166,66,211,54,176,54,176,66,211,71,317,71,317,66,211,67,228,148,307,153,305,150,330,148,307,150,330,144,310,144,310,150,330,144,334,144,310,144,334,140,312,140,312,144,334,138,336,140,312,138,336,135,316,135,316,138,336,133,338,135,316,133,338,131,320,131,320,133,338,127,338,131,320,127,338,126,325,247,301,248,317,236,295,236,295,248,317,235,309,236,295,235,309,223,292,223,292,235,309,221,305,223,292,221,305,209,291,209,291,221,305,205,305,194,305,185,307,187,294,194,305,187,294,194,292,194,305,194,292,201,292,194,305,201,292,205,305,176,311,171,299,179,296,176,311,179,296,185,307,185,307,179,296,187,294,167,317,157,324,157,301,167,317,157,301,159,297,167,317,159,297,160,292,167,317,160,292,161,285,167,317,161,285,165,234,167,317,165,234,171,255,167,317,171,255,171,299,167,317,171,299,176,311,124,175,132,181,133,198,133,198,132,181,146,197,133,198,146,197,148,222,148,222,146,197,157,215,148,222,157,215,157,251,157,251,157,215,165,234,157,251,165,234,161,285,310,353,289,353,269,320,269,320,289,353,265,331,269,320,265,331,258,309,258,309,265,331,248,317,258,309,248,317,247,301,269,320,72,-8,95,-8,269,320,95,-8,310,353,172,276,172,281,172,285,172,276,172,285,172,289,172,276,172,289,171,294,172,276,171,294,171,299,172,276,171,299,171,255,116,169,124,175,133,198,116,169,133,198,115,182,116,169,115,182,108,166,157,324,150,330,153,305,157,324,153,305,157,301,31,232,34,209,36,264,36,264,34,209,42,191,36,264,42,191,50,293,50,293,42,191,54,176,50,293,54,176,71,317,94,176,89,163,99,164,127,338,115,319,126,325,209,291,205,305,201,292,325,155,326,134,335,143,
+368,55,359,45,350,38,342,33,332,30,321,29,304,31,288,36,274,46,259,58,246,75,260,96,273,115,284,134,296,152,309,173,316,184,323,192,332,198,342,201,355,203,355,213,248,213,248,203,261,201,270,197,276,193,279,187,280,179,278,165,273,150,264,133,251,113,234,89,218,107,205,126,192,146,180,167,168,192,199,207,221,222,235,238,243,256,246,276,242,298,233,315,218,328,199,335,177,338,153,335,132,325,116,309,105,288,101,263,101,250,103,237,106,223,111,207,118,189,99,177,72,158,50,138,34,116,24,92,21,69,25,42,36,20,53,5,77,-3,107,-6,130,-4,151,0,172,9,193,22,214,39,233,22,250,9,266,0,283,-4,300,-6,319,-3,336,3,352,14,365,30,375,50,16383,16383,219,278,217,261,211,246,200,233,183,220,161,208,152,225,146,239,143,253,141,266,141,281,142,294,148,306,156,315,167,320,180,322,193,320,204,314,212,304,217,292,219,278,16383,16383,202,52,185,40,170,31,155,25,142,21,129,20,109,23,92,31,79,45,70,64,67,87,69,106,75,124,86,140,103,155,126,171,142,141,156,115,170,92,202,52,50,215,56,244,60,269,64,290,66,306,66,324,63,330,59,334,53,337,46,338,39,337,33,334,28,330,25,324,24,317,25,306,27,289,31,268,35,243,40,215,152,-79,116,-44,92,-8,77,31,69,76,67,127,69,180,77,223,92,261,116,295,152,330,147,338,104,307,69,270,44,227,29,179,24,126,29,75,44,27,69,-17,103,-56,146,-88,15,330,51,295,76,259,90,219,97,174,99,122,97,69,90,26,75,-11,51,-45,15,-79,19,-88,62,-56,97,-19,122,23,137,71,142,123,137,174,121,222,96,267,63,306,21,338,134,235,147,243,158,248,178,254,190,256,200,258,207,261,212,265,215,270,216,277,215,284,213,289,209,293,204,295,198,296,190,294,183,288,174,281,166,272,159,264,154,259,144,251,130,243,130,262,131,270,133,278,135,287,140,302,142,307,143,312,144,316,144,320,143,326,140,331,136,335,131,337,126,338,120,337,115,335,111,331,109,326,108,321,108,317,110,307,111,301,113,295,115,285,118,276,121,249,121,243,110,249,101,255,93,262,85,270,76,280,70,286,65,290,60,293,56,295,51,296,46,295,41,292,38,288,36,283,
+153,335,132,325,142,294,142,294,132,325,141,281,142,141,141,281,132,325,142,141,132,325,126,171,118,189,103,155,126,171,118,189,126,171,132,325,118,189,132,325,116,309,118,189,116,309,111,207,99,177,72,158,75,124,99,177,75,124,86,140,99,177,86,140,103,155,99,177,103,155,118,189,72,158,50,138,53,5,72,158,53,5,67,87,72,158,67,87,69,106,72,158,69,106,75,124,79,45,70,64,77,-3,77,-3,70,64,67,87,53,5,50,138,36,20,36,20,50,138,34,116,36,20,34,116,25,42,25,42,34,116,24,92,25,42,24,92,21,69,101,250,103,237,105,288,105,288,103,237,106,223,105,288,106,223,116,309,116,309,106,223,111,207,185,40,170,31,172,9,172,9,170,31,155,25,172,9,155,25,151,0,151,0,155,25,142,21,151,0,142,21,130,-4,130,-4,142,21,129,20,109,23,92,31,107,-6,109,23,107,-6,130,-4,109,23,130,-4,129,20,79,45,77,-3,107,-6,79,45,107,-6,92,31,246,75,251,113,234,89,246,75,234,89,250,9,250,9,234,89,233,22,233,22,234,89,218,107,233,22,218,107,214,39,214,39,218,107,205,126,214,39,205,126,202,52,202,52,205,126,192,146,202,52,192,146,186,72,186,72,192,146,180,167,186,72,180,167,170,92,170,92,180,167,168,192,170,92,168,192,161,208,156,115,170,92,161,208,156,115,161,208,152,225,156,115,152,225,146,239,156,115,146,239,143,253,156,115,143,253,142,141,141,266,141,281,142,141,141,266,142,141,143,253,142,294,148,306,153,335,153,335,148,306,156,315,153,335,156,315,177,338,177,338,156,315,167,320,177,338,167,320,180,322,180,322,193,320,199,335,199,335,193,320,204,314,199,335,204,314,218,328,218,328,204,314,212,304,218,328,212,304,217,292,217,261,221,222,219,278,219,278,221,222,233,315,233,315,221,222,235,238,233,315,235,238,242,298,242,298,235,238,243,256,242,298,243,256,246,276,218,328,217,292,219,278,218,328,219,278,233,315,199,335,177,338,180,322,183,220,168,192,199,207,183,220,199,207,200,233,200,233,199,207,221,222,200,233,221,222,211,246,211,246,221,222,217,261,183,220,161,208,168,192,193,22,214,39,202,52,193,22,202,52,185,40,193,22,185,40,172,9,246,75,250,9,259,58,259,58,250,9,266,0,259,58,266,0,274,46,274,46,266,0,283,-4,274,46,283,-4,288,36,288,36,283,-4,300,-6,288,36,300,-6,304,31,304,31,300,-6,319,-3,304,31,319,-3,321,29,321,29,319,-3,336,3,321,29,336,3,332,30,270,197,276,193,355,213,355,213,276,193,279,187,355,213,279,187,280,179,280,179,284,134,296,152,280,179,296,152,309,173,309,173,316,184,280,179,280,179,316,184,323,192,280,179,323,192,332,198,342,201,355,203,355,213,342,201,355,213,332,198,332,198,355,213,280,179,261,201,270,197,355,213,261,201,355,213,248,213,261,201,248,213,248,203,280,179,278,165,284,134,284,134,278,165,273,150,284,134,273,150,273,115,273,115,273,150,264,133,273,115,264,133,260,96,260,96,264,133,251,113,260,96,251,113,246,75,375,50,368,55,365,30,365,30,368,55,359,45,365,30,359,45,352,14,352,14,359,45,350,38,352,14,350,38,342,33,342,33,332,30,336,3,342,33,336,3,352,14,77,-3,67,87,53,5,101,250,105,288,101,263,
+50,215,56,244,60,269,64,290,66,306,66,324,63,330,59,334,53,337,46,338,39,337,33,334,28,330,25,324,24,317,25,306,27,289,31,268,35,243,40,215,152,-79,116,-44,92,-8,77,31,69,76,67,127,69,180,77,223,92,261,116,295,152,330,147,338,104,307,69,270,44,227,29,179,24,126,29,75,44,27,69,-17,
+24,317,25,306,25,324,25,324,25,306,27,289,25,324,27,289,28,330,28,330,27,289,31,268,28,330,31,268,33,334,33,334,31,268,35,243,33,334,35,243,39,337,39,337,35,243,40,215,39,337,40,215,46,338,46,338,40,215,50,215,46,338,50,215,53,337,53,337,50,215,56,244,53,337,56,244,59,334,59,334,56,244,60,269,59,334,60,269,63,330,63,330,60,269,64,290,63,330,64,290,66,324,66,324,64,290,66,306,66,324,66,306,66,318,
+152,-79,116,-44,92,-8,77,31,69,76,67,127,69,180,77,223,92,261,116,295,152,330,147,338,104,307,69,270,44,227,29,179,24,126,29,75,44,27,69,-17,103,-56,146,-88,15,330,51,295,76,259,90,219,97,174,99,122,97,69,90,26,75,-11,51,-45,15,-79,19,-88,62,-56,97,-19,122,23,137,71,142,123,137,174,121,222,96,267,63,306,21,338,
+24,126,29,75,29,179,29,179,29,75,44,27,29,179,44,27,44,227,44,227,44,27,69,-17,44,227,69,-17,67,127,67,127,69,270,44,227,116,295,152,330,147,338,116,295,147,338,104,307,116,295,104,307,92,261,67,127,69,180,69,270,69,270,69,180,77,223,69,270,77,223,104,307,104,307,77,223,92,261,116,-44,92,-8,103,-56,116,-44,103,-56,146,-88,116,-44,146,-88,152,-79,77,31,69,76,69,-17,77,31,69,-17,103,-56,77,31,103,-56,92,-8,67,127,69,-17,69,76,
+15,330,51,295,76,259,90,219,97,174,99,122,97,69,90,26,75,-11,51,-45,15,-79,19,-88,62,-56,97,-19,122,23,137,71,142,123,137,174,121,222,96,267,63,306,21,338,134,235,147,243,158,248,178,254,190,256,200,258,207,261,212,265,215,270,216,277,215,284,213,289,209,293,204,295,198,296,190,294,183,288,174,281,166,272,159,264,154,259,144,251,
+97,174,99,122,99,122,122,23,99,122,97,69,122,23,97,69,97,-19,97,-19,97,69,90,26,97,-19,90,26,75,-11,97,174,99,122,121,222,121,222,99,122,122,23,121,222,122,23,137,174,137,174,122,23,137,71,137,174,137,71,142,123,96,267,63,306,76,259,96,267,76,259,90,219,96,267,90,219,97,174,96,267,97,174,121,222,51,295,76,259,63,306,51,295,63,306,21,338,51,295,21,338,15,330,15,-79,19,-88,51,-45,51,-45,19,-88,62,-56,51,-45,62,-56,75,-11,75,-11,62,-56,97,-19,
+134,235,147,243,158,248,178,254,190,256,200,258,207,261,212,265,215,270,216,277,215,284,213,289,209,293,204,295,198,296,190,294,183,288,174,281,166,272,159,264,154,259,144,251,130,243,130,262,131,270,133,278,135,287,140,302,142,307,143,312,144,316,144,320,143,326,140,331,136,335,131,337,126,338,120,337,115,335,111,331,109,326,108,321,108,317,110,307,111,301,113,295,115,285,118,276,121,249,121,243,110,249,101,255,93,262,85,270,76,280,70,286,65,290,60,293,56,295,51,296,46,295,41,292,38,288,36,283,35,277,36,270,40,265,46,261,56,257,69,254,78,252,87,249,97,246,106,242,117,235,106,229,97,224,88,221,78,218,65,215,53,213,45,210,39,205,35,200,34,193,35,187,37,182,41,178,46,176,52,175,57,176,61,177,65,179,74,188,81,196,92,207,94,210,97,212,105,218,112,222,121,228,121,224,120,212,119,201,118,192,115,183,113,174,111,169,109,163,108,159,107,154,107,151,108,145,110,140,114,136,119,133,124,132,130,133,136,136,140,141,143,146,145,152,144,154,144,157,143,161,141,164,140,169,136,179,130,212,130,228,134,225,140,221,147,217,153,212,161,205,169,196,175,188,182,182,187,178,193,175,199,175,205,176,210,178,216,188,217,194,215,201,212,206,206,210,198,213,186,215,176,218,165,220,147,228,138,233,318,110,318,143,188,143,188,273,155,273,155,143,24,143,24,110,155,110,155,-20,188,-20,188,110,41,-69,60,-58,76,-44,88,-27,95,-10,98,7,96,22,90,34,81,43,70,49,57,51,47,49,39,46,33,40,29,32,27,22,29,13,32,6,38,1,46,-1,56,-2,60,-2,63,-1,66,-1,68,0,73,0,75,-1,78,-4,78,-6,76,-16,71,-27,63,-38,51,-49,36,-60,142,97,142,128,20,128,20,97,90,22,89,30,85,38,79,44,71,49,63,50,54,49,46,45,40,39,37,31,35,22,37,13,40,6,46,0,54,-3,63,-5,71,-3,79,0,85,6,89,13,90,22,143,338,110,338,-3,-6,30,-6,238,165,232,222,218,270,194,307,164,330,127,338,84,329,52,304,29,266,16,220,12,168,16,118,27,71,48,31,80,3,125,-6,168,2,200,29,222,67,234,114,238,165,16383,16383,190,162,187,108,179,65,166,33,148,13,125,6,102,13,84,33,71,65,63,109,60,165,63,220,71,265,84,298,101,318,124,325,148,318,166,298,179,265,187,219,190,162,197,0,197,7,178,8,164,12,155,18,151,27,150,38,150,336,145,338,55,292,55,286,69,291,74,293,84,295,88,296,92,296,97,295,101,293,104,288,106,281,107,272,107,47,105,33,100,22,92,14,78,10,59,7,59,0,237,69,230,71,221,57,212,48,203,42,193,39,182,38,65,38,
+69,254,69,254,78,252,69,254,78,252,70,286,69,254,70,286,65,290,69,254,65,290,60,293,69,254,60,293,56,295,69,254,56,295,56,257,51,296,46,295,46,261,51,296,46,261,56,257,51,296,56,257,56,295,36,283,36,270,38,288,38,288,36,270,40,265,38,288,40,265,41,292,41,292,40,265,46,261,41,292,46,261,46,295,81,196,86,201,88,221,88,221,86,201,89,204,88,221,89,204,97,224,97,224,89,204,92,207,97,224,92,207,94,210,94,210,97,212,97,224,97,224,97,212,106,229,78,218,65,215,69,183,78,218,69,183,74,188,78,218,74,188,81,196,78,218,81,196,88,221,110,140,114,136,111,169,111,169,114,136,113,174,115,183,113,174,114,136,115,183,114,136,119,133,144,157,143,161,143,146,144,157,143,146,145,152,144,157,145,152,144,154,141,164,140,169,140,141,141,164,140,141,143,146,141,164,143,146,143,161,136,179,134,190,136,136,136,179,136,136,140,141,136,179,140,141,140,169,134,190,132,201,136,136,136,136,132,201,130,212,136,136,130,212,130,133,130,133,130,212,130,224,126,338,120,337,120,258,126,338,120,258,121,249,126,338,121,249,121,228,126,338,121,228,124,132,126,338,124,132,130,133,126,338,130,133,130,224,126,338,130,224,130,243,126,338,130,243,130,255,126,338,130,255,131,337,121,243,121,228,121,249,120,337,115,335,115,285,120,337,115,285,118,276,120,337,118,276,119,267,120,337,119,267,120,258,113,295,115,285,115,335,113,295,115,335,111,331,113,295,111,331,111,301,204,295,198,296,200,258,200,258,198,296,190,294,200,258,190,294,190,256,190,256,190,294,183,288,190,256,183,288,178,254,178,254,183,288,174,281,178,254,174,281,168,251,168,251,174,281,166,272,168,251,166,272,159,264,159,264,154,259,158,248,158,248,154,259,149,255,158,248,149,255,147,243,147,243,149,255,144,251,147,243,144,251,137,247,130,243,130,228,134,225,130,243,134,225,134,235,130,243,134,235,137,247,137,247,134,235,147,243,176,218,165,220,169,196,176,218,169,196,175,188,176,218,175,188,182,182,176,218,182,182,186,215,199,175,205,176,206,210,206,210,205,176,210,178,206,210,210,178,212,206,212,206,210,178,213,183,212,206,213,183,215,201,215,201,213,183,216,188,215,201,216,188,217,194,198,213,186,215,187,178,198,213,187,178,193,175,198,213,193,175,199,175,198,213,199,175,206,210,216,277,215,284,215,270,215,270,215,284,213,289,215,270,213,289,212,265,212,265,213,289,209,293,212,265,209,293,207,261,207,261,209,293,204,295,207,261,204,295,200,258,159,264,158,248,168,251,161,205,169,196,165,220,161,205,165,220,156,224,161,205,156,224,153,212,147,228,138,233,140,221,147,228,140,221,147,217,147,228,147,217,153,212,147,228,153,212,156,224,143,326,140,331,142,307,143,326,142,307,143,312,143,326,143,312,144,316,143,326,144,316,144,320,133,278,135,287,136,335,136,335,135,287,138,296,136,335,138,296,140,331,140,331,138,296,140,302,140,331,140,302,142,307,131,337,130,255,130,262,131,337,130,262,131,270,131,337,131,270,133,278,131,337,133,278,136,335,134,235,134,225,140,221,134,235,140,221,138,233,124,132,121,228,121,224,124,132,121,224,120,212,124,132,120,212,119,201,124,132,119,201,119,133,118,192,115,183,119,133,118,192,119,133,119,201,101,215,105,218,106,229,106,229,105,218,112,222,106,229,112,222,117,235,117,235,112,222,121,228,117,235,121,228,121,243,76,280,78,252,85,270,85,270,78,252,87,249,85,270,87,249,93,262,93,262,87,249,97,246,93,262,97,246,101,255,101,255,97,246,106,242,101,255,106,242,110,249,110,249,106,242,117,235,110,249,117,235,121,243,108,317,109,312,109,326,109,326,109,312,110,307,109,326,110,307,111,331,111,331,110,307,111,301,111,169,109,163,110,140,110,140,109,163,108,159,110,140,108,159,108,145,108,145,108,159,107,154,108,145,107,154,107,151,65,215,53,213,57,176,65,215,57,176,61,177,65,215,61,177,65,179,65,215,65,179,69,183,34,193,35,187,35,200,35,200,35,187,37,182,35,200,37,182,39,205,39,205,37,182,41,178,39,205,41,178,45,210,45,210,41,178,46,176,45,210,46,176,53,213,53,213,46,176,52,175,53,213,52,175,57,176,70,286,78,252,76,280,106,229,97,212,101,215,108,317,109,326,108,321,187,178,186,215,182,182,36,270,36,283,35,277,
+318,110,318,143,188,143,188,273,155,273,155,143,24,143,24,110,155,110,155,-20,188,-20,188,110,41,-69,60,-58,76,-44,88,-27,95,-10,98,7,96,22,90,34,81,43,70,49,57,51,47,49,
+188,273,155,273,188,-20,188,-20,155,273,155,143,188,-20,155,143,155,110,155,110,155,143,24,143,155,110,24,143,24,110,188,110,318,110,188,143,188,143,318,110,318,143,188,-20,155,110,155,-20,
+41,-69,60,-58,76,-44,88,-27,95,-10,98,7,96,22,90,34,81,43,70,49,57,51,47,49,39,46,33,40,29,32,27,22,29,13,32,6,38,1,46,-1,56,-2,60,-2,63,-1,66,-1,68,0,73,0,75,-1,78,-4,78,-6,76,-16,71,-27,63,-38,51,-49,36,-60,142,97,142,128,20,128,20,97,90,22,89,30,85,38,79,44,71,49,63,50,54,49,46,45,40,39,37,31,35,22,37,13,40,6,46,0,54,-3,63,-5,71,-3,79,0,85,6,89,13,90,22,143,338,110,338,-3,-6,30,-6,238,165,232,222,218,270,194,307,164,330,
+63,-1,66,-1,70,49,70,49,66,-1,68,0,70,49,68,0,71,0,71,0,73,0,81,43,81,43,73,0,75,-1,81,43,75,-1,77,-3,27,22,29,13,29,32,29,32,29,13,32,6,29,32,32,6,33,40,33,40,32,6,38,1,33,40,38,1,39,46,39,46,38,1,46,-1,39,46,46,-1,47,49,47,49,46,-1,56,-2,47,49,56,-2,57,51,57,51,56,-2,60,-2,57,51,60,-2,70,49,70,49,60,-2,63,-1,98,7,96,22,95,-10,95,-10,96,22,90,34,95,-10,90,34,88,-27,88,-27,90,34,81,43,88,-27,81,43,78,-6,78,-6,76,-16,88,-27,88,-27,76,-16,76,-44,81,43,77,-3,78,-4,81,43,78,-4,78,-6,81,43,70,49,71,0,36,-60,41,-69,51,-49,51,-49,41,-69,60,-58,51,-49,60,-58,63,-38,63,-38,60,-58,76,-44,63,-38,76,-44,71,-27,71,-27,76,-44,76,-16,
+142,97,142,128,20,128,20,97,90,22,89,30,85,38,79,44,
+142,97,142,128,20,128,142,97,20,128,20,97,
+90,22,89,30,85,38,79,44,71,49,63,50,54,49,46,45,40,39,37,31,35,22,37,13,40,6,46,0,54,-3,63,-5,71,-3,79,0,85,6,89,13,90,22,143,338,110,338,-3,-6,30,-6,238,165,232,222,218,270,194,307,164,330,127,338,84,329,52,304,29,266,16,220,12,168,16,118,27,71,48,31,80,3,125,-6,168,2,
+35,22,37,13,37,31,37,31,37,13,40,6,37,31,40,6,40,39,40,39,40,6,46,0,40,39,46,0,46,45,46,45,46,0,54,-3,46,45,54,-3,54,49,54,49,54,-3,62,-5,54,49,62,-5,63,50,63,50,62,-5,71,-3,63,50,71,-3,71,49,71,49,71,-3,79,0,71,49,79,0,79,44,79,44,79,0,85,6,79,44,85,6,85,38,85,38,85,6,89,13,85,38,89,13,89,30,89,30,89,13,90,22,
+143,338,110,338,-3,-6,30,-6,238,165,232,222,218,270,194,307,
+143,338,110,338,-3,-6,143,338,-3,-6,30,-6,
+238,165,232,222,218,270,194,307,164,330,127,338,84,329,52,304,29,266,16,220,12,168,16,118,27,71,48,31,80,3,125,-6,168,2,200,29,222,67,234,114,238,165,16383,16383,190,162,187,108,179,65,166,33,148,13,125,6,102,13,84,33,71,65,63,109,60,165,63,220,71,265,84,298,101,318,124,325,148,318,166,298,179,265,187,219,190,162,197,0,197,7,178,8,164,12,155,18,151,27,150,38,150,336,145,338,55,292,55,286,69,291,74,293,84,295,88,296,92,296,97,295,101,293,104,288,106,281,107,272,107,47,105,33,100,22,92,14,78,10,59,7,59,0,237,69,230,71,221,57,212,48,203,42,193,39,182,38,65,38,147,126,171,153,189,179,202,203,209,226,211,250,207,278,
+101,318,124,325,124,325,127,338,124,325,148,318,127,338,148,318,164,330,164,330,148,318,166,298,164,330,166,298,194,307,194,307,166,298,179,265,194,307,179,265,187,219,166,33,168,2,179,65,179,65,168,2,200,29,179,65,200,29,187,108,187,108,200,29,190,162,194,307,190,162,200,29,194,307,200,29,218,270,218,270,200,29,222,67,218,270,222,67,232,222,232,222,222,67,234,114,232,222,234,114,238,165,125,6,125,-6,148,13,148,13,125,-6,168,2,148,13,168,2,166,33,71,265,84,298,84,329,84,329,84,298,101,318,84,329,101,318,127,338,127,338,101,318,124,325,12,168,16,118,16,220,16,220,16,118,27,71,16,220,27,71,29,266,29,266,27,71,48,31,29,266,48,31,52,304,52,304,48,31,63,109,52,304,63,109,60,165,60,165,63,220,52,304,52,304,63,220,71,265,52,304,71,265,84,329,102,13,84,33,80,3,102,13,80,3,125,-6,102,13,125,-6,125,6,80,3,84,33,71,65,80,3,71,65,63,109,80,3,63,109,48,31,194,307,187,219,190,162,
+197,0,197,7,178,8,164,12,155,18,151,27,150,38,150,336,145,338,55,292,55,286,69,291,74,293,84,295,88,296,92,296,97,295,101,293,104,288,106,281,107,272,107,47,105,33,100,22,92,14,78,10,59,7,59,0,237,69,230,71,221,57,212,48,203,42,193,39,182,38,65,38,147,126,171,153,189,179,202,203,209,226,211,250,207,278,195,302,176,321,150,334,119,338,86,333,59,320,39,299,24,271,15,238,26,236,38,262,50,280,63,292,
+100,22,92,14,197,0,197,0,92,14,78,10,197,0,78,10,59,7,79,294,84,295,145,338,145,338,84,295,88,296,145,338,88,296,92,296,92,296,97,295,145,338,145,338,97,295,101,293,145,338,101,293,104,288,164,12,155,18,107,47,107,47,155,18,151,27,107,47,151,27,107,272,106,281,107,272,145,338,106,281,145,338,104,288,145,338,55,292,69,291,145,338,69,291,74,293,145,338,74,293,79,294,150,38,150,336,145,338,150,38,145,338,107,272,150,38,107,272,151,27,197,0,197,7,178,8,197,0,178,8,164,12,197,0,164,12,105,33,197,0,105,33,100,22,197,0,59,7,59,0,105,33,164,12,107,47,69,291,55,292,55,286,
+237,69,230,71,221,57,212,48,203,42,193,39,182,38,65,38,147,126,171,153,189,179,202,203,209,226,211,250,207,278,195,302,176,321,150,334,119,338,86,333,59,320,39,299,24,271,15,238,26,236,38,262,50,280,63,292,79,299,99,301,123,298,142,289,156,275,165,255,169,230,166,205,159,181,146,155,128,129,103,100,15,6,15,0,210,0,31,255,43,275,57,290,71,300,87,306,105,308,123,306,138,300,149,290,157,275,159,257,157,240,152,224,143,211,132,199,118,190,112,186,105,183,96,179,87,176,76,172,76,165,92,165,104,164,113,163,121,162,127,160,146,152,161,141,171,127,178,109,180,88,176,63,167,42,153,26,135,15,114,11,106,11,99,13,90,15,82,20,71,26,64,31,
+26,236,38,262,39,299,39,299,38,262,50,280,39,299,50,280,59,320,59,320,50,280,63,292,59,320,63,292,86,333,86,333,63,292,79,299,86,333,79,299,99,301,99,301,123,298,119,338,119,338,123,298,150,334,24,271,15,238,26,236,24,271,26,236,39,299,166,205,171,153,169,230,169,230,171,153,176,321,176,321,171,153,189,179,176,321,189,179,195,302,195,302,189,179,202,203,195,302,202,203,207,278,207,278,202,203,209,226,207,278,209,226,211,250,176,321,150,334,156,275,176,321,156,275,165,255,176,321,165,255,169,230,150,334,123,298,142,289,150,334,142,289,156,275,159,181,146,155,147,126,159,181,147,126,171,153,159,181,171,153,166,205,15,0,210,0,15,6,15,6,210,0,65,38,15,6,65,38,103,100,103,100,65,38,147,126,103,100,147,126,128,129,128,129,147,126,146,155,119,338,86,333,99,301,212,48,203,42,210,0,210,0,203,42,193,39,210,0,193,39,182,38,210,0,182,38,65,38,237,69,230,71,221,57,237,69,221,57,212,48,237,69,212,48,210,0,
+31,255,43,275,57,290,71,300,87,306,105,308,123,306,138,300,149,290,157,275,159,257,157,240,152,224,143,211,132,199,118,190,112,186,105,183,96,179,87,176,76,172,76,165,92,165,104,164,113,163,121,162,127,160,146,152,161,141,171,127,178,109,180,88,176,63,167,42,153,26,135,15,114,11,106,11,99,13,90,15,82,20,71,26,64,31,57,35,51,38,41,40,34,39,29,36,25,32,22,27,21,22,23,12,30,4,41,-1,57,-5,76,-6,103,-4,130,0,154,9,175,22,193,40,200,52,207,65,211,79,214,94,215,109,214,125,212,139,207,152,201,164,194,174,187,180,181,185,173,190,164,195,152,200,170,213,183,226,192,241,197,255,199,270,195,292,184,311,168,326,146,335,121,338,92,334,68,323,48,306,33,284,22,257,237,84,237,116,185,116,185,338,163,338,6,116,6,84,146,84,146,0,185,0,185,84,16383,16383,146,116,26,116,146,287,219,340,214,344,210,339,206,335,202,333,197,331,87,331,32,213,32,208,34,206,38,206,65,204,89,199,110,191,129,182,145,171,156,159,166,146,172,131,177,114,178,96,174,71,164,48,149,29,131,16,110,12,104,12,98,14,90,17,83,21,75,27,66,34,58,39,51,41,45,43,38,43,30,42,24,40,19,36,17,31,16,24,19,13,27,5,40,-1,58,-5,79,-6,99,-5,117,-2,134,1,149,8,164,17,182,33,196,51,206,71,211,95,213,122,213,137,211,150,207,162,202,174,195,185,178,205,159,220,137,232,108,241,70,249,90,291,188,291,192,292,198,294,200,296,201,298,223,342,185,337,152,329,123,317,
+22,257,31,255,33,284,33,284,31,255,43,275,33,284,43,275,48,306,48,306,43,275,57,290,48,306,57,290,68,323,68,323,57,290,71,300,68,323,71,300,92,334,92,334,71,300,87,306,92,334,87,306,105,308,105,308,123,306,121,338,121,338,123,306,146,335,123,306,138,300,146,335,146,335,138,300,149,290,146,335,149,290,168,326,168,326,149,290,157,275,168,326,157,275,159,257,159,257,157,240,170,213,170,213,157,240,152,200,170,213,183,226,184,311,184,311,183,226,192,241,184,311,192,241,195,292,195,292,192,241,197,255,195,292,197,255,199,270,170,213,184,311,168,326,170,213,168,326,159,257,152,200,157,240,152,224,152,200,152,224,146,152,152,200,146,152,161,141,152,200,161,141,164,195,164,195,171,127,173,190,173,190,171,127,178,109,173,190,178,109,181,185,181,185,178,109,180,88,193,40,180,88,176,63,193,40,176,63,175,22,175,22,176,63,167,42,175,22,167,42,154,9,154,9,167,42,153,26,154,9,153,26,135,15,132,199,127,160,146,152,132,199,146,152,143,211,143,211,146,152,152,224,215,109,214,125,214,94,214,94,214,125,212,139,214,94,212,139,211,79,211,79,212,139,207,152,211,79,207,152,207,65,207,65,207,152,201,164,207,65,201,164,200,52,200,52,201,164,194,174,200,52,194,174,193,40,193,40,194,174,187,180,193,40,187,180,181,185,103,-4,130,0,106,11,106,11,130,0,114,11,135,15,114,11,130,0,135,15,130,0,154,9,87,176,76,172,92,165,87,176,92,165,96,179,96,179,92,165,104,164,96,179,104,164,105,183,105,183,104,164,113,163,105,183,113,163,112,186,112,186,113,163,118,190,132,199,118,190,121,162,132,199,121,162,127,160,121,338,92,334,105,308,118,190,113,163,121,162,103,-4,106,11,99,13,103,-4,99,13,90,15,103,-4,90,15,82,20,103,-4,82,20,76,-6,76,-6,82,20,71,26,76,-6,71,26,64,31,76,-6,64,31,57,35,76,-6,57,35,57,-5,57,35,51,38,57,-5,57,-5,51,38,46,39,57,-5,46,39,41,-1,41,-1,46,39,41,40,41,-1,41,40,34,39,30,4,41,-1,34,39,30,4,34,39,29,36,30,4,29,36,25,32,30,4,25,32,23,12,22,27,21,22,23,12,22,27,23,12,25,32,92,165,76,172,76,165,180,88,193,40,181,185,164,195,161,141,171,127,
+237,84,237,116,185,116,185,338,163,338,6,116,6,84,146,84,146,0,185,0,185,84,16383,16383,146,116,26,116,146,287,219,340,214,344,210,339,206,335,202,333,197,331,87,331,32,213,32,208,34,206,38,206,65,204,89,199,110,191,129,182,
+6,84,146,84,6,116,6,116,146,84,26,116,6,116,26,116,163,338,163,338,26,116,146,287,163,338,146,287,185,0,185,0,146,287,146,116,185,0,146,116,146,84,146,84,146,116,26,116,163,338,185,0,185,338,185,116,185,84,237,84,185,116,237,84,237,116,185,0,146,84,146,0,
+219,340,214,344,210,339,206,335,202,333,197,331,87,331,32,213,32,208,34,206,38,206,65,204,89,199,110,191,129,182,145,171,156,159,166,146,172,131,177,114,178,96,174,71,164,48,149,29,131,16,110,12,104,12,98,14,90,17,83,21,75,27,66,34,58,39,51,41,45,43,38,43,30,42,24,40,19,36,17,31,16,24,19,13,27,5,40,-1,58,-5,79,-6,99,-5,117,-2,134,1,149,8,164,17,182,33,196,51,206,71,211,95,213,122,213,137,211,150,207,162,202,174,195,185,178,205,159,220,137,232,108,241,70,249,90,291,188,291,192,292,198,294,200,296,201,298,223,342,185,337,152,329,123,317,97,300,71,277,52,254,37,229,26,201,19,171,17,140,18,118,21,98,26,78,33,60,41,44,53,26,68,12,86,1,106,-4,129,-6,148,-5,166,0,182,7,196,17,209,30,218,43,225,57,230,73,233,91,234,109,230,145,217,174,198,196,172,209,140,214,127,213,115,211,103,207,90,201,76,191,89,234,111,270,142,300,180,321,224,334,16383,16383,189,94,187,65,180,41,169,23,154,11,134,7,109,13,89,30,75,56,66,91,64,133,67,157,76,173,89,184,105,189,122,191,146,187,165,175,179,156,187,128,189,94,224,323,224,331,40,331,10,257,
+211,95,213,122,213,137,211,95,213,137,211,150,211,95,211,150,207,162,211,95,207,162,206,71,178,205,178,96,182,33,178,205,182,33,195,185,195,185,182,33,196,51,195,185,196,51,202,174,202,174,196,51,206,71,202,174,206,71,207,162,149,8,164,17,164,48,164,48,164,17,182,33,164,48,182,33,174,71,174,71,182,33,178,96,110,12,117,-2,131,16,131,16,117,-2,134,1,131,16,134,1,149,29,149,29,134,1,149,8,149,29,149,8,164,48,202,333,197,331,198,294,202,333,198,294,200,296,202,333,200,296,201,298,202,333,201,298,219,340,202,333,219,340,206,335,190,331,192,292,197,331,197,331,192,292,195,293,197,331,195,293,198,294,210,339,206,335,219,340,210,339,219,340,214,344,87,331,70,249,90,291,87,331,90,291,190,331,190,331,90,291,188,291,190,331,188,291,192,292,38,206,65,204,70,249,70,249,65,204,89,199,70,249,89,199,108,241,108,241,89,199,110,191,108,241,110,191,137,232,137,232,110,191,129,182,137,232,129,182,145,171,145,171,156,159,159,220,159,220,156,159,166,146,159,220,166,146,178,205,178,205,166,146,172,131,178,205,172,131,177,114,87,331,32,213,33,207,87,331,33,207,34,206,87,331,34,206,36,206,87,331,36,206,38,206,87,331,38,206,70,249,32,213,32,212,33,207,33,207,32,212,32,208,32,208,32,212,32,211,79,-6,99,-5,83,21,79,-6,83,21,75,27,79,-6,75,27,66,34,79,-6,66,34,58,39,79,-6,58,39,58,-5,58,39,51,41,58,-5,58,-5,51,41,45,43,58,-5,45,43,40,-1,40,-1,45,43,38,43,40,-1,38,43,30,42,27,5,40,-1,30,42,27,5,30,42,24,40,27,5,24,40,19,36,27,5,19,36,19,13,17,31,16,24,19,13,17,31,19,13,19,36,104,12,98,14,99,-5,104,12,99,-5,117,-2,104,12,117,-2,110,12,159,220,137,232,145,171,90,17,83,21,99,-5,90,17,99,-5,98,14,178,205,177,114,178,96,32,208,32,211,32,210,
+223,342,185,337,152,329,123,317,97,300,71,277,52,254,37,229,26,201,19,171,17,140,18,118,21,98,26,78,33,60,41,44,53,26,68,12,86,1,106,-4,129,-6,148,-5,166,0,182,7,196,17,209,30,218,43,225,57,230,73,233,91,234,109,230,145,217,174,198,196,172,209,140,214,127,213,115,211,103,207,90,201,76,191,89,234,111,270,142,300,180,321,224,334,16383,16383,189,94,187,65,180,41,169,23,154,11,134,7,109,13,89,30,75,56,66,91,64,133,67,157,76,173,89,184,105,189,122,191,146,187,165,175,179,156,187,128,189,94,224,323,224,331,40,331,10,257,19,253,30,270,40,282,51,289,62,293,78,294,185,294,86,-3,118,-3,223,78,220,100,213,121,199,141,177,162,145,185,171,200,190,215,203,229,210,246,212,267,208,289,197,309,179,324,156,334,128,338,97,335,70,324,49,308,36,287,31,260,33,242,38,225,49,208,67,189,93,166,66,145,47,127,35,111,30,94,28,75,32,48,45,25,66,8,92,-2,124,-6,157,-2,185,8,205,26,218,49,223,78,16383,16383,177,267,176,249,171,234,162,220,149,207,131,195,107,210,90,225,77,240,70,257,68,275,71,292,78,305,
+140,214,127,213,146,187,146,187,127,213,122,191,105,189,122,191,115,211,105,189,115,211,103,207,64,133,67,157,71,277,71,277,67,157,76,173,71,277,76,173,76,191,76,191,76,173,89,184,76,191,89,184,90,201,90,201,89,184,105,189,90,201,105,189,103,207,127,213,115,211,122,191,187,65,180,41,182,7,182,7,180,41,169,23,182,7,169,23,166,0,166,0,169,23,154,11,166,0,154,11,148,-5,148,-5,154,11,134,7,148,-5,134,7,129,-6,129,-6,134,7,109,13,129,-6,109,13,106,-4,106,-4,109,13,89,30,106,-4,89,30,86,1,86,1,89,30,75,56,86,1,75,56,68,12,68,12,75,56,66,91,68,12,66,91,64,133,53,26,68,12,64,133,64,133,71,277,53,26,53,26,71,277,52,254,53,26,52,254,41,44,41,44,52,254,37,229,41,44,37,229,33,60,33,60,37,229,26,78,218,43,225,57,230,145,230,145,225,57,230,73,230,145,230,73,234,109,234,109,230,73,233,91,189,94,196,17,198,196,198,196,196,17,209,30,198,196,209,30,217,174,217,174,209,30,218,43,217,174,218,43,230,145,146,187,165,175,172,209,172,209,165,175,179,156,172,209,179,156,198,196,198,196,179,156,187,128,198,196,187,128,189,94,187,65,182,7,196,17,187,65,196,17,189,94,76,191,89,234,97,300,97,300,89,234,111,270,97,300,111,270,123,317,123,317,111,270,142,300,123,317,142,300,152,329,152,329,142,300,180,321,152,329,180,321,185,337,185,337,180,321,224,334,185,337,224,334,223,342,97,300,71,277,76,191,17,140,18,118,19,171,19,171,18,118,21,98,19,171,21,98,26,201,26,201,21,98,26,78,26,201,26,78,37,229,140,214,146,187,172,209,
+224,323,224,331,40,331,10,257,19,253,30,270,40,282,51,289,62,293,78,294,185,294,86,-3,118,-3,223,78,220,100,213,121,199,141,177,162,145,185,171,200,190,215,203,229,210,246,212,267,208,289,197,309,
+118,-3,224,323,185,294,185,294,224,323,224,331,185,294,224,331,78,294,62,293,78,294,224,331,62,293,224,331,40,331,40,331,10,257,19,253,40,331,19,253,30,270,40,331,30,270,40,282,40,331,40,282,51,289,40,331,51,289,62,293,118,-3,185,294,86,-3,
+223,78,220,100,213,121,199,141,177,162,145,185,171,200,190,215,203,229,210,246,212,267,208,289,197,309,179,324,156,334,128,338,97,335,70,324,49,308,36,287,31,260,33,242,38,225,49,208,67,189,93,166,66,145,47,127,35,111,30,94,28,75,32,48,45,25,66,8,92,-2,124,-6,157,-2,185,8,205,26,218,49,223,78,16383,16383,177,267,176,249,171,234,162,220,149,207,131,195,107,210,90,225,77,240,70,257,68,275,71,292,78,305,89,316,104,322,123,324,142,322,157,314,168,302,175,286,177,267,16383,16383,136,136,154,122,167,109,177,95,183,79,185,62,182,44,175,29,163,17,148,10,129,7,108,10,91,19,77,34,69,54,66,79,67,97,71,113,79,128,90,142,106,156,30,-10,65,-4,95,3,121,13,145,28,170,49,191,72,208,100,220,130,227,163,229,197,228,221,224,244,217,265,209,284,198,300,185,313,171,324,155,332,138,337,119,338,85,332,57,316,35,291,20,258,15,220,19,186,31,158,50,137,75,123,105,118,122,119,138,122,153,128,167,136,180,147,164,101,140,63,109,33,71,12,28,0,16383,16383,181,177,177,163,167,153,153,146,137,141,123,140,102,144,85,157,72,177,64,204,61,237,62,253,64,269,68,284,73,297,79,307,84,313,91,318,98,321,106,323,115,324,139,319,157,304,170,278,178,243,181,197,96,201,95,210,91,218,85,224,77,228,69,229,60,228,52,224,46,218,42,211,41,201,42,193,46,185,52,179,60,176,69,174,77,176,
+167,109,177,162,154,122,154,122,177,162,145,185,154,122,145,185,136,136,136,136,145,185,149,207,136,136,149,207,131,195,131,195,107,210,136,136,136,136,107,210,106,156,90,142,106,156,93,166,66,8,69,54,66,79,66,79,67,97,66,145,66,145,67,97,71,113,66,145,71,113,93,166,93,166,71,113,79,128,93,166,79,128,90,142,30,94,32,48,35,111,35,111,32,48,45,25,35,111,45,25,47,127,47,127,45,25,66,8,47,127,66,8,66,145,66,145,66,8,66,79,107,210,90,225,93,166,107,210,93,166,106,156,90,225,77,240,93,166,93,166,77,240,70,257,93,166,70,257,67,189,67,189,70,257,68,275,70,324,68,275,71,292,70,324,71,292,78,305,128,338,123,324,142,322,128,338,142,322,156,334,156,334,142,322,157,314,156,334,157,314,179,324,179,324,157,314,168,302,179,324,168,302,175,286,182,44,175,29,185,8,185,8,175,29,163,17,185,8,163,17,157,-2,157,-2,163,17,148,10,157,-2,148,10,129,7,129,7,108,10,124,-6,124,-6,108,10,92,-2,92,-2,108,10,91,19,92,-2,91,19,77,34,92,-2,77,34,69,54,92,-2,69,54,66,8,78,305,89,316,97,335,97,335,89,316,104,322,97,335,104,322,128,338,128,338,104,322,123,324,49,308,36,287,38,225,49,308,38,225,49,208,49,308,49,208,67,189,49,308,67,189,68,275,49,308,68,275,70,324,36,287,31,260,33,242,36,287,33,242,38,225,171,200,190,215,176,249,176,249,190,215,177,267,179,324,177,267,190,215,179,324,190,215,197,309,197,309,190,215,203,229,197,309,203,229,208,289,208,289,203,229,210,246,208,289,210,246,212,267,171,200,176,249,171,234,171,200,171,234,162,220,171,200,162,220,149,207,171,200,149,207,145,185,223,78,220,100,218,49,218,49,220,100,213,121,218,49,213,121,205,26,205,26,213,121,199,141,205,26,199,141,185,62,185,62,199,141,183,79,177,95,183,79,199,141,177,95,199,141,177,162,177,95,177,162,167,109,185,62,185,8,205,26,129,7,124,-6,157,-2,182,44,185,8,185,62,179,324,175,286,177,267,70,324,78,305,97,335,32,48,30,94,28,75,
+30,-10,65,-4,95,3,121,13,145,28,170,49,191,72,208,100,220,130,227,163,229,197,228,221,224,244,217,265,209,284,198,300,185,313,171,324,155,332,138,337,119,338,85,332,57,316,35,291,20,258,15,220,19,186,31,158,50,137,75,123,105,118,122,119,138,122,153,128,167,136,180,147,164,101,140,63,109,33,71,12,28,0,16383,16383,181,177,177,163,167,153,153,146,137,141,123,140,102,144,85,157,72,177,64,204,61,237,62,253,64,269,68,284,73,297,79,307,84,313,91,318,98,321,106,323,115,324,139,319,157,304,170,278,178,243,181,197,96,201,95,210,91,218,85,224,77,228,69,229,60,228,52,224,46,218,42,211,41,201,42,193,46,185,52,179,60,176,69,174,77,176,85,179,91,185,95,193,96,201,16383,16383,96,22,95,31,91,38,85,45,77,49,69,50,60,49,52,45,46,39,42,31,41,22,42,13,46,6,52,0,60,-3,69,-5,77,-3,85,0,91,6,95,13,96,22,95,201,94,210,90,218,84,224,77,228,68,229,59,228,51,224,45,218,42,211,40,201,42,193,46,185,52,179,59,176,68,174,77,176,84,179,90,185,94,193,95,201,16383,16383,54,-69,73,-58,88,-44,
+62,253,64,269,57,316,57,316,64,269,68,284,57,316,68,284,85,332,85,332,68,284,73,297,85,332,73,297,79,307,79,307,84,313,85,332,85,332,84,313,91,318,85,332,91,318,119,338,119,338,91,318,98,321,119,338,98,321,106,323,119,338,106,323,115,324,115,324,139,319,119,338,119,338,139,319,138,337,123,140,105,118,122,119,123,140,122,119,138,122,123,140,102,144,105,118,85,157,72,177,75,123,85,157,75,123,105,118,85,157,105,118,102,144,61,237,62,253,57,316,61,237,57,316,50,137,61,237,50,137,64,204,64,204,50,137,75,123,64,204,75,123,72,177,15,220,19,186,20,258,20,258,19,186,31,158,20,258,31,158,35,291,35,291,31,158,50,137,35,291,50,137,57,316,137,141,123,140,138,122,137,141,138,122,153,146,153,146,138,122,153,128,153,146,153,128,167,153,167,153,153,128,167,136,167,153,167,136,177,163,177,163,167,136,180,147,177,163,180,147,181,177,181,177,180,147,191,72,181,177,191,72,181,197,178,243,181,197,185,313,178,243,185,313,171,324,138,337,139,319,155,332,155,332,139,319,157,304,155,332,157,304,171,324,171,324,157,304,170,278,171,324,170,278,178,243,229,197,228,221,227,163,227,163,228,221,224,244,227,163,224,244,220,130,220,130,224,244,217,265,220,130,217,265,209,284,220,130,209,284,208,100,208,100,209,284,198,300,208,100,198,300,191,72,191,72,198,300,185,313,191,72,185,313,181,197,30,-10,65,-4,71,12,71,12,65,-4,95,3,71,12,95,3,109,33,109,33,95,3,121,13,109,33,121,13,140,63,140,63,121,13,145,28,140,63,145,28,164,101,164,101,145,28,170,49,164,101,170,49,180,147,180,147,170,49,191,72,71,12,28,0,30,-10,
+96,201,95,210,91,218,85,224,77,228,69,229,60,228,52,224,46,218,42,211,41,201,42,193,46,185,52,179,60,176,69,174,77,176,85,179,91,185,95,193,96,201,16383,16383,96,22,95,31,91,38,85,45,77,49,69,50,60,49,52,45,46,39,42,31,41,22,42,13,46,6,52,0,60,-3,69,-5,77,-3,85,0,91,6,95,13,96,22,95,201,94,210,90,218,84,224,77,228,68,229,59,228,51,224,45,218,42,211,40,201,42,193,46,185,52,179,59,176,68,174,77,176,84,179,90,185,94,193,95,201,16383,16383,54,-69,73,-58,88,-44,100,-28,107,-11,109,7,107,22,102,34,93,43,82,49,70,51,60,49,52,46,46,40,42,32,40,23,41,14,45,7,51,2,59,-1,69,-2,
+42,211,42,193,46,218,46,218,42,193,46,185,46,218,46,185,52,224,52,224,46,185,52,179,52,224,52,179,60,228,60,228,52,179,60,176,60,228,60,176,69,229,69,229,60,176,69,174,69,229,69,174,77,228,77,228,69,174,77,176,77,228,77,176,85,224,85,224,77,176,85,179,85,224,85,179,91,218,91,218,85,179,91,185,91,218,91,185,95,210,95,210,91,185,95,193,95,210,95,193,96,201,42,31,42,13,46,39,46,39,42,13,46,6,46,39,46,6,52,45,52,45,46,6,52,0,52,45,52,0,60,49,60,49,52,0,60,-3,60,49,60,-3,69,50,69,50,60,-3,69,-5,69,50,69,-5,77,49,77,49,69,-5,77,-3,77,49,77,-3,85,45,85,45,77,-3,85,0,85,45,85,0,91,38,91,38,85,0,91,6,91,38,91,6,95,31,95,31,91,6,95,13,95,31,95,13,96,22,42,13,42,31,41,22,42,193,42,211,41,201,
+95,201,94,210,90,218,84,224,77,228,68,229,59,228,51,224,45,218,42,211,40,201,42,193,46,185,52,179,59,176,68,174,77,176,84,179,90,185,94,193,95,201,16383,16383,54,-69,73,-58,88,-44,100,-28,107,-11,109,7,107,22,102,34,93,43,82,49,70,51,60,49,52,46,46,40,42,32,40,23,41,14,45,7,51,2,59,-1,69,-2,72,-2,75,-1,78,-1,81,0,85,0,87,-2,89,-3,90,-5,90,-7,88,-17,83,-28,75,-38,63,-49,49,-60,310,-11,310,20,94,127,310,234,310,267,28,129,28,124,319,160,319,193,24,193,24,160,16383,16383,319,60,319,93,24,93,24,60,310,124,310,129,28,267,28,234,244,127,28,20,28,-11,122,82,126,101,131,118,137,133,145,147,155,161,176,187,191,208,201,226,206,242,207,259,202,286,189,308,169,324,144,335,116,338,89,335,66,325,49,310,38,290,34,267,35,255,38,246,44,239,50,235,58,233,65,234,71,237,75,242,78,248,79,255,77,264,72,270,66,276,
+42,211,42,193,45,218,45,218,42,193,46,185,45,218,46,185,51,224,51,224,46,185,52,179,51,224,52,179,59,228,59,228,52,179,59,176,59,228,59,176,68,229,68,229,59,176,68,174,68,229,68,174,77,228,77,228,68,174,77,176,77,228,77,176,84,224,84,224,77,176,84,179,84,224,84,179,90,218,90,218,84,179,90,185,90,218,90,185,94,210,94,210,90,185,94,193,94,210,94,193,95,201,75,-1,78,-1,82,49,82,49,78,-1,81,0,82,49,81,0,83,0,83,0,85,0,93,43,93,43,85,0,87,-2,93,43,87,-2,89,-3,40,23,41,14,42,32,42,32,41,14,45,7,42,32,45,7,46,40,46,40,45,7,51,2,46,40,51,2,52,46,52,46,51,2,59,-1,52,46,59,-1,60,49,60,49,59,-1,69,-2,60,49,69,-2,70,51,70,51,69,-2,72,-2,70,51,72,-2,82,49,82,49,72,-2,75,-1,109,7,107,22,107,-11,107,-11,107,22,102,34,107,-11,102,34,100,-28,100,-28,102,34,93,43,100,-28,93,43,90,-7,90,-7,88,-44,100,-28,93,43,89,-3,90,-5,93,43,90,-5,90,-7,93,43,82,49,83,0,88,-44,90,-7,88,-17,88,-44,88,-17,83,-28,88,-44,83,-28,75,-38,88,-44,75,-38,73,-58,63,-49,49,-60,54,-69,63,-49,54,-69,73,-58,63,-49,73,-58,75,-38,42,193,42,211,40,201,
+310,-11,310,20,94,127,310,234,310,267,28,129,28,124,319,160,319,193,24,193,24,160,16383,16383,319,60,319,93,
+94,127,310,234,310,267,94,127,310,267,28,129,94,127,28,129,310,-11,94,127,310,-11,310,20,310,-11,28,129,28,124,
+319,160,319,193,24,193,24,160,16383,16383,319,60,319,93,24,93,24,60,310,124,310,129,28,267,28,234,244,127,28,20,28,-11,122,82,126,101,
+24,193,24,160,319,160,24,193,319,160,319,193,24,93,24,60,319,60,24,93,319,60,319,93,
+310,124,310,129,28,267,28,234,244,127,28,20,28,-11,122,82,126,101,131,118,137,133,145,147,155,161,176,187,
+310,124,310,129,28,267,310,124,28,267,28,234,310,124,28,234,244,127,310,124,244,127,28,20,310,124,28,20,28,-11,
+122,82,126,101,131,118,137,133,145,147,155,161,176,187,191,208,201,226,206,242,207,259,202,286,189,308,169,324,144,335,116,338,89,335,66,325,49,310,38,290,34,267,35,255,38,246,44,239,50,235,58,233,65,234,71,237,75,242,78,248,79,255,77,264,72,270,66,276,62,283,60,292,62,301,69,310,80,317,92,321,107,323,124,320,139,312,151,300,159,283,161,264,160,246,156,227,150,209,136,171,126,147,120,127,116,109,114,95,113,82,16383,16383,145,22,144,30,140,38,134,44,127,48,119,49,110,48,103,44,97,38,93,31,92,22,93,14,97,7,102,1,110,-2,119,-3,127,-2,135,1,140,7,144,14,145,22,344,36,323,27,303,20,283,16,263,13,243,12,196,19,156,40,126,71,107,112,100,161,101,184,105,206,112,227,120,247,131,265,148,285,167,301,189,313,214,320,241,323,286,316,326,296,357,267,377,229,384,186,381,157,372,130,358,108,341,94,321,88,314,89,308,92,304,96,301,103,300,112,300,115,301,117,301,120,334,247,300,247,295,228,294,228,289,238,284,245,276,250,268,253,257,254,242,252,229,248,216,241,204,231,194,219,183,203,174,185,167,167,162,147,161,128,163,109,169,93,179,82,191,75,204,72,219,74,232,78,245,86,257,96,267,108,268,108,271,96,279,86,288,78,300,73,313,71,341,78,366,95,386,121,
+60,292,60,292,60,292,60,292,66,325,49,310,60,292,49,310,50,235,60,292,50,235,58,233,144,335,116,338,124,320,124,320,116,338,107,323,92,321,107,323,116,338,92,321,116,338,89,335,60,292,62,301,66,325,66,325,62,301,69,310,66,325,69,310,89,335,89,335,69,310,80,317,89,335,80,317,92,321,34,267,35,255,38,290,38,290,35,255,38,246,38,290,38,246,49,310,49,310,38,246,44,239,49,310,44,239,50,235,62,283,65,234,66,276,66,276,65,234,71,237,66,276,71,237,72,270,72,270,71,237,75,242,72,270,75,242,77,264,77,264,75,242,78,248,77,264,78,248,79,255,65,234,62,283,60,292,65,234,60,292,58,233,119,49,119,-3,127,48,127,48,119,-3,127,-2,127,48,127,-2,134,44,134,44,127,-2,135,1,134,44,135,1,140,38,140,38,135,1,140,7,140,38,140,7,144,30,144,30,140,7,144,14,144,30,144,14,145,22,92,22,93,14,93,31,93,31,93,14,97,7,93,31,97,7,97,38,97,38,97,7,102,1,97,38,102,1,103,44,103,44,102,1,110,-2,103,44,110,-2,110,48,110,48,110,-2,119,-3,110,48,119,-3,119,49,124,320,139,312,144,335,144,335,139,312,151,300,144,335,151,300,169,324,169,324,151,300,159,283,169,324,159,283,161,264,161,264,160,246,176,187,176,187,160,246,156,227,176,187,156,227,155,161,155,161,156,227,150,209,155,161,150,209,145,147,145,147,150,209,143,190,145,147,143,190,137,133,137,133,143,190,136,171,137,133,136,171,131,118,131,118,136,171,126,147,131,118,126,147,126,101,126,101,126,147,122,82,202,286,189,308,191,208,202,286,191,208,201,226,202,286,201,226,206,242,202,286,206,242,207,259,176,187,191,208,189,308,176,187,189,308,169,324,176,187,169,324,161,264,122,82,126,147,120,127,122,82,120,127,116,109,122,82,116,109,114,95,122,82,114,95,113,82,
+344,36,323,27,303,20,283,16,263,13,243,12,196,19,156,40,126,71,107,112,100,161,101,184,105,206,112,227,120,247,131,265,148,285,167,301,189,313,214,320,241,323,286,316,326,296,357,267,377,229,384,186,381,157,372,130,358,108,341,94,321,88,314,89,308,92,304,96,301,103,300,112,300,115,301,117,301,120,334,247,300,247,295,228,294,228,289,238,284,245,276,250,268,253,257,254,242,252,229,248,216,241,204,231,194,219,183,203,174,185,167,167,162,147,161,128,163,109,169,93,179,82,191,75,204,72,219,74,232,78,245,86,257,96,267,108,268,108,271,96,279,86,288,78,300,73,313,71,341,78,366,95,386,121,400,154,405,191,396,238,374,279,338,310,293,331,241,338,215,337,191,333,169,326,148,316,128,304,105,282,86,257,71,228,61,197,58,164,67,108,93,61,132,24,182,1,241,-6,261,-5,281,-2,302,2,324,10,350,22,16383,16383,286,202,285,187,282,171,277,155,271,138,264,123,257,113,250,105,242,99,234,95,226,94,216,96,207,101,201,110,197,122,196,137,197,150,199,163,203,175,208,186,214,197,223,209,234,219,244,226,254,231,263,232,271,231,277,227,282,221,285,213,286,202,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,211,175,225,178,236,182,245,185,259,195,266,203,272,213,276,224,279,235,280,248,274,277,258,300,232,317,195,327,148,331,8,331,8,321,29,320,43,316,51,308,55,295,56,275,56,56,55,37,51,24,42,16,29,11,8,9,8,0,177,0,217,4,250,15,275,34,291,58,296,89,295,102,292,115,287,126,281,137,272,147,263,154,254,160,242,166,229,170,211,174,16383,16383,108,183,108,303,109,307,112,310,115,312,119,313,140,313,172,309,197,301,214,287,225,268,228,245,225,223,217,205,202,193,181,186,153,183,16383,16383,108,163,139,162,162,161,181,158,198,152,215,143,224,136,231,126,235,115,238,103,239,89,238,77,236,66,232,56,227,47,220,40,207,30,194,24,179,20,161,19,138,18,126,19,118,21,112,26,109,32,
+156,40,126,71,132,24,132,24,126,71,107,112,132,24,107,112,93,61,93,61,107,112,100,161,105,282,100,161,101,184,105,282,101,184,105,206,105,206,112,227,128,304,128,304,112,227,120,247,128,304,120,247,131,265,131,265,148,285,148,316,148,316,148,285,167,301,148,316,167,301,169,326,169,326,167,301,189,313,169,326,189,313,191,333,191,333,189,313,214,320,191,333,214,320,215,337,215,337,214,320,241,323,215,337,241,323,241,338,241,338,241,323,293,331,93,61,100,161,105,282,93,61,105,282,86,257,93,61,86,257,71,228,93,61,71,228,67,108,61,197,58,164,67,108,61,197,67,108,71,228,384,186,386,121,396,238,384,186,396,238,377,229,377,229,396,238,374,279,377,229,374,279,357,267,357,267,374,279,338,310,357,267,338,310,326,296,326,296,338,310,293,331,326,296,293,331,286,316,286,316,293,331,241,323,148,316,128,304,131,265,344,36,323,27,324,10,324,10,323,27,303,20,324,10,303,20,302,2,302,2,303,20,283,16,302,2,283,16,281,-2,281,-2,283,16,263,13,281,-2,263,13,261,-5,261,-5,263,13,243,12,261,-5,243,12,241,-6,241,-6,243,12,196,19,241,-6,196,19,182,1,182,1,196,19,156,40,182,1,156,40,132,24,276,250,268,253,271,231,271,231,268,253,263,232,254,231,263,232,257,254,254,231,257,254,244,226,244,226,257,254,242,252,244,226,242,252,234,219,234,219,242,252,229,248,234,219,229,248,223,209,223,209,229,248,216,241,223,209,216,241,214,197,199,163,203,175,204,231,204,231,203,175,208,186,204,231,208,186,216,241,216,241,208,186,214,197,194,219,196,137,197,150,194,219,197,150,204,231,204,231,197,150,199,163,201,110,204,72,207,101,207,101,204,72,219,74,207,101,219,74,216,96,216,96,219,74,226,94,234,95,226,94,232,78,234,95,232,78,245,86,197,122,196,137,191,75,197,122,191,75,204,72,197,122,204,72,201,110,196,137,194,219,191,75,191,75,194,219,183,203,191,75,183,203,179,82,179,82,183,203,174,185,179,82,174,185,169,93,169,93,174,185,167,167,169,93,167,167,163,109,163,109,167,167,162,147,163,109,162,147,161,128,268,253,257,254,263,232,267,108,268,108,271,138,267,108,271,138,264,123,264,123,257,113,267,108,267,108,257,113,257,96,308,92,304,96,312,71,312,71,304,96,301,103,312,71,301,103,300,73,300,73,301,103,300,112,300,115,301,117,300,247,300,247,301,117,301,119,300,247,301,119,301,120,301,120,334,247,300,247,300,247,295,228,300,73,300,247,300,73,300,112,300,247,300,112,300,114,300,247,300,114,300,115,295,228,294,228,300,73,300,73,294,228,289,238,300,73,289,238,288,78,288,78,289,238,286,202,288,78,286,202,285,187,288,78,285,187,282,171,285,213,286,202,289,238,285,213,289,238,284,245,285,213,284,245,282,221,277,227,282,221,284,245,277,227,284,245,276,250,277,227,276,250,271,231,384,186,381,157,386,121,386,121,381,157,372,130,386,121,372,130,366,95,366,95,372,130,358,108,366,95,358,108,341,78,341,78,358,108,341,94,341,78,341,94,321,88,321,88,314,89,341,78,341,78,314,89,312,71,396,238,386,121,400,154,396,238,400,154,405,191,288,78,282,171,279,86,279,86,282,171,277,155,279,86,277,155,271,96,271,96,277,155,271,138,271,96,271,138,268,108,250,105,242,99,245,86,250,105,245,86,257,96,250,105,257,96,257,113,226,94,219,74,232,78,234,95,245,86,242,99,308,92,312,71,314,89,344,36,324,10,350,22,105,282,105,206,128,304,
+353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,211,175,225,178,236,182,245,185,259,195,266,203,272,213,276,224,279,235,280,248,274,277,258,300,232,317,195,327,148,331,8,331,8,321,29,320,43,316,51,308,55,295,56,275,56,56,55,37,51,24,42,16,29,11,8,9,8,0,177,0,217,4,250,15,275,34,291,58,296,89,295,102,292,115,287,126,281,137,272,147,263,154,254,160,242,166,229,170,211,174,16383,16383,108,183,
+55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0,
+211,175,225,178,236,182,245,185,259,195,266,203,272,213,276,224,279,235,280,248,274,277,258,300,232,317,195,327,148,331,8,331,8,321,29,320,43,316,51,308,55,295,56,275,56,56,55,37,51,24,42,16,29,11,8,9,8,0,177,0,217,4,250,15,275,34,291,58,296,89,295,102,292,115,287,126,281,137,272,147,263,154,254,160,242,166,229,170,211,174,16383,16383,108,183,108,303,109,307,112,310,115,312,119,313,140,313,172,309,197,301,214,287,225,268,228,245,225,223,217,205,202,193,181,186,153,183,16383,16383,108,163,139,162,162,161,181,158,198,152,215,143,224,136,231,126,235,115,238,103,239,89,238,77,236,66,232,56,227,47,220,40,207,30,194,24,179,20,161,19,138,18,126,19,118,21,112,26,109,32,108,41,307,65,285,47,265,32,244,23,222,17,197,15,177,17,157,21,139,28,123,38,108,51,95,68,85,88,78,112,73,140,72,171,77,219,93,260,117,291,151,311,192,318,211,316,228,311,244,304,259,293,272,280,279,272,285,263,290,252,295,240,299,224,310,224,305,338,296,338,293,332,290,328,285,324,280,322,275,321,269,322,262,324,254,326,240,330,228,333,204,337,192,338,180,338,153,336,127,330,102,320,80,305,59,286,44,266,31,243,22,218,16,191,14,162,16,133,22,106,32,80,45,57,62,37,81,22,103,9,127,0,153,-4,180,-6,214,-4,245,3,273,16,297,34,316,56,8,331,8,321,27,320,40,316,47,308,51,295,52,275,52,57,51,38,48,25,40,16,27,12,8,9,8,0,148,0,178,1,206,6,231,12,
+51,24,42,16,177,0,177,0,42,16,29,11,177,0,29,11,8,9,55,295,56,275,112,310,55,295,112,310,148,331,148,331,112,310,115,312,148,331,115,312,119,313,148,331,119,313,140,313,148,331,140,313,172,309,207,30,194,24,217,4,217,4,194,24,179,20,217,4,179,20,177,0,177,0,179,20,161,19,177,0,161,19,138,18,138,18,126,19,177,0,177,0,126,19,118,21,177,0,118,21,55,37,55,37,118,21,56,56,258,300,232,317,236,182,236,182,232,317,228,245,236,182,228,245,225,223,236,182,225,223,225,178,225,178,225,223,217,205,225,178,217,205,211,175,211,175,217,205,202,193,211,175,202,193,211,174,211,174,202,193,215,143,211,174,215,143,229,170,229,170,215,143,224,136,153,183,162,161,181,186,181,186,162,161,181,158,181,186,181,158,202,193,202,193,181,158,198,152,202,193,198,152,215,143,236,66,232,56,250,15,250,15,232,56,227,47,250,15,227,47,220,40,220,40,207,30,217,4,162,161,153,183,139,162,139,162,153,183,108,183,139,162,108,183,108,163,109,32,108,41,56,275,109,32,56,275,56,56,56,56,118,21,112,26,56,56,112,26,109,32,272,147,263,154,275,34,275,34,263,154,254,160,275,34,254,160,250,15,250,15,254,160,242,166,250,15,242,166,239,89,239,89,238,77,250,15,250,15,238,77,236,66,242,166,229,170,231,126,242,166,231,126,235,115,242,166,235,115,238,103,242,166,238,103,239,89,232,317,195,327,197,301,232,317,197,301,214,287,232,317,214,287,225,268,232,317,225,268,228,245,195,327,148,331,172,309,195,327,172,309,197,301,56,275,108,41,108,296,56,275,108,296,108,303,56,275,108,303,109,307,56,275,109,307,112,310,148,331,8,331,29,320,148,331,29,320,43,316,148,331,43,316,51,308,148,331,51,308,55,295,266,203,272,213,274,277,274,277,272,213,276,224,274,277,276,224,280,248,280,248,276,224,279,235,245,185,252,190,258,300,258,300,252,190,259,195,258,300,259,195,274,277,274,277,259,195,266,203,292,115,287,126,291,58,292,115,291,58,296,89,292,115,296,89,295,102,281,137,272,147,275,34,281,137,275,34,291,58,281,137,291,58,287,126,220,40,217,4,250,15,258,300,236,182,245,185,29,320,8,331,8,321,229,170,224,136,231,126,177,0,8,9,8,0,51,24,177,0,55,37,
+307,65,285,47,265,32,244,23,222,17,197,15,177,17,157,21,139,28,123,38,108,51,95,68,85,88,78,112,73,140,72,171,77,219,93,260,117,291,151,311,192,318,211,316,228,311,244,304,259,293,272,280,279,272,285,263,290,252,295,240,299,224,310,224,305,338,296,338,293,332,290,328,285,324,280,322,275,321,269,322,262,324,254,326,240,330,228,333,204,337,192,338,180,338,153,336,127,330,102,320,80,305,59,286,44,266,31,243,22,218,16,191,14,162,16,133,22,106,32,80,45,57,62,37,81,22,103,9,127,0,153,-4,180,-6,214,-4,245,3,273,16,297,34,316,56,8,331,8,321,27,320,40,316,47,308,51,295,52,275,52,57,51,38,48,25,40,16,27,12,8,9,8,0,148,0,178,1,206,6,231,12,254,21,275,32,299,51,318,75,331,102,340,133,343,167,341,196,334,223,324,247,310,267,293,286,270,302,244,314,214,323,180,329,143,331,16383,16383,103,291,104,300,107,306,112,310,119,312,129,313,157,311,182,308,203,301,222,291,241,278,257,260,271,241,280,219,286,193,288,164,286,132,280,104,270,81,255,61,236,45,218,34,200,27,179,22,155,19,127,18,117,19,110,22,106,26,104,33,103,42,299,84,285,84,271,57,255,38,234,26,
+62,37,73,140,72,171,72,171,80,305,62,37,62,37,80,305,59,286,62,37,59,286,45,57,45,57,59,286,44,266,45,57,44,266,32,80,32,80,44,266,31,243,32,80,31,243,22,106,22,106,31,243,22,218,22,106,22,218,16,133,16,133,22,218,16,191,16,133,16,191,14,162,78,112,81,22,85,88,85,88,81,22,103,9,85,88,103,9,95,68,95,68,103,9,108,51,123,38,108,51,127,0,123,38,127,0,139,28,139,28,127,0,153,-4,139,28,153,-4,157,21,157,21,153,-4,180,-6,157,21,180,-6,177,17,177,17,180,-6,197,15,222,17,197,15,214,-4,222,17,214,-4,245,3,73,140,62,37,81,22,73,140,81,22,78,112,108,51,103,9,127,0,254,326,259,293,262,324,262,324,259,293,272,280,262,324,272,280,269,322,269,322,272,280,275,321,280,322,275,321,279,272,280,322,279,272,285,263,275,321,272,280,279,272,228,333,228,311,240,330,240,330,228,311,244,304,240,330,244,304,247,328,247,328,244,304,259,293,247,328,259,293,254,326,216,335,204,337,211,316,216,335,211,316,228,311,216,335,228,311,228,333,204,337,192,338,211,316,211,316,192,338,192,318,151,311,192,318,153,336,151,311,153,336,127,330,310,224,305,338,299,224,299,224,305,338,296,338,299,224,296,338,295,240,295,240,296,338,293,332,295,240,293,332,290,252,290,252,293,332,290,328,290,252,290,328,285,263,285,263,290,328,285,324,285,263,285,324,280,322,316,56,307,65,297,34,297,34,307,65,285,47,297,34,285,47,273,16,273,16,285,47,265,32,273,16,265,32,245,3,245,3,265,32,244,23,245,3,244,23,222,17,197,15,180,-6,214,-4,192,318,192,338,180,338,192,318,180,338,153,336,72,171,77,219,80,305,80,305,77,219,93,260,80,305,93,260,102,320,102,320,93,260,117,291,102,320,117,291,127,330,127,330,117,291,151,311,
+8,331,8,321,27,320,40,316,47,308,51,295,52,275,52,57,51,38,48,25,40,16,27,12,8,9,8,0,148,0,178,1,206,6,231,12,254,21,275,32,299,51,318,75,331,102,340,133,343,167,341,196,334,223,324,247,310,267,293,286,270,302,244,314,214,323,180,329,143,331,16383,16383,103,291,104,300,107,306,112,310,119,312,129,313,157,311,182,308,203,301,222,291,241,278,257,260,271,241,280,219,286,193,288,164,286,132,280,104,270,81,255,61,236,45,218,34,200,27,179,22,155,19,127,18,117,19,110,22,106,26,104,33,103,42,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,273,259,271,331,6,331,6,321,25,319,38,315,45,307,49,294,50,276,50,61,
+48,25,40,16,148,0,148,0,40,16,27,12,148,0,27,12,8,9,52,57,51,38,110,22,110,22,51,38,148,0,110,22,148,0,117,19,117,19,148,0,127,18,155,19,127,18,148,0,155,19,148,0,178,1,104,300,107,306,52,275,52,275,107,306,112,310,52,275,112,310,143,331,143,331,112,310,119,312,143,331,119,312,129,313,129,313,119,312,129,312,129,313,129,312,157,311,129,313,157,311,143,331,143,331,157,311,180,329,206,6,231,12,218,34,218,34,231,12,236,45,255,61,236,45,254,21,255,61,254,21,275,32,155,19,178,1,179,22,179,22,178,1,206,6,179,22,206,6,200,27,200,27,206,6,218,34,244,314,241,278,257,260,244,314,257,260,270,302,270,302,257,260,271,241,270,302,271,241,293,286,293,286,271,241,280,219,293,286,280,219,286,193,182,308,203,301,214,323,214,323,203,301,222,291,214,323,222,291,244,314,244,314,222,291,241,278,180,329,157,311,182,308,180,329,182,308,214,323,343,167,341,196,340,133,340,133,341,196,334,223,340,133,334,223,331,102,331,102,334,223,324,247,331,102,324,247,318,75,318,75,324,247,310,267,318,75,310,267,299,51,299,51,310,267,293,286,299,51,293,286,288,164,288,164,286,132,299,51,299,51,286,132,280,104,299,51,280,104,275,32,275,32,280,104,270,81,275,32,270,81,255,61,236,45,231,12,254,21,110,22,106,26,52,57,52,57,106,26,104,33,52,57,104,33,52,275,52,275,104,33,103,42,52,275,103,42,103,291,40,316,47,308,143,331,143,331,47,308,51,295,143,331,51,295,52,275,27,320,40,316,143,331,27,320,143,331,8,331,27,320,8,331,8,321,148,0,8,9,8,0,48,25,148,0,51,38,104,300,52,275,103,291,293,286,286,193,288,164,
+299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,273,259,271,331,6,331,6,321,25,319,38,315,45,307,49,294,50,276,50,61,49,40,45,25,37,16,25,12,6,9,6,0,146,0,146,9,127,12,113,16,105,24,102,37,100,56,100,164,171,164,193,162,209,158,219,150,225,136,228,115,239,115,239,232,228,232,225,212,218,198,208,190,193,185,171,184,100,184,100,292,101,300,102,306,105,310,110,311,118,312,184,312,214,311,234,306,247,297,255,282,261,259,354,177,227,177,227,168,246,166,259,162,267,154,
+45,24,38,16,276,0,276,0,38,16,25,12,276,0,25,12,6,9,49,294,50,275,106,310,49,294,106,310,45,307,45,307,106,310,111,312,45,307,111,312,271,331,271,331,111,312,118,312,45,24,117,21,49,37,49,37,117,21,108,25,49,37,108,25,50,57,50,57,108,25,102,31,50,57,102,31,50,275,50,275,102,31,100,42,50,275,100,42,100,294,100,184,100,164,176,164,100,184,176,164,176,184,198,185,176,184,198,162,198,185,198,162,213,190,213,190,198,162,213,158,213,190,213,158,222,198,222,198,213,158,222,150,222,198,222,150,229,212,229,212,222,150,229,136,229,212,229,136,233,232,233,232,229,136,233,115,233,232,233,115,244,115,271,331,118,312,184,312,271,331,184,312,213,311,271,331,213,311,234,306,271,331,234,306,247,297,271,331,247,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,50,275,100,294,101,302,50,275,101,302,103,307,50,275,103,307,106,310,271,331,6,331,25,320,271,331,25,320,38,315,271,331,38,315,45,307,255,38,234,26,276,0,276,0,234,26,206,20,276,0,206,20,169,18,276,0,299,84,285,84,276,0,285,84,271,57,276,0,271,57,255,38,276,0,169,18,151,18,276,0,151,18,132,19,276,0,132,19,117,21,276,0,117,21,45,24,276,0,6,9,6,0,25,320,6,331,6,321,176,184,176,164,198,162,233,232,244,115,244,232,
+273,259,271,331,6,331,6,321,25,319,38,315,45,307,49,294,50,276,50,61,49,40,45,25,37,16,25,12,6,9,6,0,146,0,146,9,127,12,113,16,105,24,102,37,100,56,100,164,171,164,193,162,209,158,219,150,225,136,228,115,239,115,239,232,228,232,225,212,218,198,208,190,193,185,171,184,100,184,100,292,101,300,102,306,105,310,110,311,118,312,184,312,214,311,234,306,247,297,255,282,261,259,354,177,227,177,227,168,246,166,259,162,267,154,270,142,271,122,271,44,268,34,259,25,244,19,226,14,204,13,161,19,124,39,97,69,79,111,73,162,75,191,79,219,86,244,97,266,112,283,125,295,140,305,157,312,175,317,195,318,211,317,227,314,242,308,256,300,268,291,276,282,283,273,290,262,296,249,304,233,315,233,311,338,300,338,298,333,294,328,289,325,283,322,277,321,274,322,270,322,266,323,261,325,
+38,315,45,307,271,331,271,331,45,307,110,311,271,331,110,311,118,312,271,331,118,312,184,312,271,331,184,312,214,311,50,276,102,37,100,56,100,184,100,164,171,164,100,184,171,164,171,184,193,185,171,184,193,162,193,185,193,162,208,190,208,190,193,162,209,158,208,190,209,158,218,198,218,198,209,158,219,150,218,198,219,150,225,212,225,212,219,150,225,136,225,212,225,136,228,232,228,232,225,136,228,115,228,232,228,115,239,115,271,331,214,311,234,306,271,331,234,306,247,297,271,331,247,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,50,276,100,56,100,292,50,276,100,292,101,300,50,276,101,300,102,306,50,276,102,306,105,310,50,276,105,310,49,294,110,311,45,307,49,294,110,311,49,294,105,310,25,319,38,315,271,331,25,319,271,331,6,331,25,319,6,331,6,321,146,0,146,9,127,12,146,0,127,12,113,16,146,0,113,16,49,40,146,0,49,40,45,25,146,0,45,25,37,16,146,0,37,16,25,12,146,0,25,12,6,9,146,0,6,9,6,0,50,61,49,40,113,16,50,61,113,16,105,24,50,61,105,24,102,37,50,61,102,37,50,276,171,184,171,164,193,162,228,232,239,115,239,232,
+354,177,227,177,227,168,246,166,259,162,267,154,270,142,271,122,271,44,268,34,259,25,244,19,226,14,204,13,161,19,124,39,97,69,79,111,73,162,75,191,79,219,86,244,97,266,112,283,125,295,140,305,157,312,175,317,195,318,211,317,227,314,242,308,256,300,268,291,276,282,283,273,290,262,296,249,304,233,315,233,311,338,300,338,298,333,294,328,289,325,283,322,277,321,274,322,270,322,266,323,261,325,256,326,243,331,230,334,218,336,204,338,189,338,161,336,135,331,111,322,89,310,70,295,51,275,36,251,25,225,19,195,16,164,18,135,23,110,31,86,42,65,57,46,79,28,105,13,133,2,162,-4,193,-6,223,-5,251,0,278,6,301,16,320,28,320,128,321,144,324,156,330,162,340,166,354,168,352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,211,331,211,321,231,319,244,315,251,307,255,294,256,274,256,180,104,180,104,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,28,319,41,315,49,307,53,294,54,274,54,61,53,39,49,25,42,16,29,12,9,9,9,0,148,0,148,9,129,12,117,17,109,25,105,38,104,56,104,157,256,157,256,62,255,41,252,26,244,17,232,12,212,9,212,0,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,177,331,
+16,164,18,135,19,195,19,195,18,135,23,110,19,195,23,110,25,225,25,225,23,110,31,86,25,225,31,86,36,251,36,251,31,86,42,65,36,251,42,65,51,275,51,275,42,65,57,46,51,275,57,46,70,295,70,295,57,46,73,162,157,312,161,336,140,305,140,305,161,336,135,331,140,305,135,331,125,295,125,295,135,331,112,283,97,266,112,283,111,322,97,266,111,322,89,310,89,310,70,295,75,191,89,310,75,191,79,219,89,310,79,219,86,244,89,310,86,244,97,266,193,-6,204,13,162,-4,162,-4,204,13,161,19,162,-4,161,19,133,2,133,2,161,19,124,39,133,2,124,39,105,13,105,13,124,39,97,69,105,13,97,69,79,28,79,28,97,69,79,111,79,28,79,111,73,162,259,25,244,19,251,0,251,0,244,19,226,14,251,0,226,14,223,-5,223,-5,226,14,204,13,73,162,57,46,79,28,268,291,266,323,261,325,268,291,261,325,256,300,268,291,270,322,266,323,204,338,195,318,211,317,204,338,211,317,218,336,218,336,211,317,227,314,218,336,227,314,230,334,230,334,227,314,242,308,230,334,242,308,243,331,243,331,242,308,256,300,243,331,256,300,256,326,256,326,256,300,261,325,270,322,276,282,274,322,274,322,276,282,277,321,283,322,277,321,283,273,283,322,283,273,290,262,268,291,276,282,270,322,304,233,315,233,311,338,304,233,311,338,300,338,304,233,300,338,298,333,304,233,298,333,296,249,294,328,289,325,290,262,294,328,290,262,296,249,294,328,296,249,298,333,277,321,276,282,283,273,340,166,354,168,354,177,340,166,354,177,330,162,330,162,354,177,270,142,330,162,270,142,271,122,278,6,271,122,271,44,278,6,271,44,268,34,330,162,271,122,324,156,324,156,271,122,278,6,324,156,278,6,321,144,321,144,278,6,301,16,321,144,301,16,320,128,320,128,301,16,320,28,354,177,227,177,246,166,354,177,246,166,259,162,354,177,259,162,267,154,354,177,267,154,270,142,259,25,251,0,278,6,259,25,278,6,268,34,189,338,161,336,175,317,189,338,175,317,195,318,189,338,195,318,204,338,135,331,111,322,112,283,161,336,157,312,175,317,223,-5,204,13,193,-6,246,166,227,177,227,168,283,322,290,262,289,325,75,191,70,295,73,162,
+352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,211,331,211,321,231,319,244,315,251,307,255,294,256,274,256,180,104,180,104,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,28,319,41,315,49,307,53,294,54,274,54,61,53,39,49,25,42,16,29,12,9,9,9,0,148,0,148,9,129,12,117,17,109,25,105,38,104,56,104,157,256,157,256,62,255,41,252,26,244,17,232,12,212,9,212,0,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,177,331,33,331,33,321,54,319,67,315,75,308,79,295,80,275,80,47,79,34,78,24,75,17,69,13,61,12,56,13,53,16,51,21,48,27,46,34,42,41,38,47,33,52,28,54,22,55,14,54,7,50,2,44,-1,37,-2,29,0,16,6,6,17,0,31,-5,
+49,25,42,16,148,0,148,0,42,16,29,12,148,0,29,12,9,9,149,331,9,331,28,319,149,331,28,319,41,315,149,331,41,315,49,307,149,331,49,307,53,294,149,331,53,294,118,315,149,331,118,315,130,319,149,331,130,319,149,321,54,274,105,38,104,56,104,180,104,157,256,157,104,180,256,157,256,180,256,180,256,157,312,25,256,180,312,25,308,37,54,274,104,56,104,274,54,274,104,274,106,294,54,274,106,294,110,307,54,274,110,307,118,315,54,274,118,315,53,294,252,26,244,17,352,0,352,0,244,17,232,12,352,0,232,12,212,9,333,319,352,321,352,331,333,319,352,331,320,315,320,315,352,331,255,294,320,315,255,294,256,274,308,37,256,274,256,180,307,55,307,274,256,274,256,274,307,274,308,293,256,274,308,293,312,307,352,331,211,331,231,319,352,331,231,319,244,315,352,331,244,315,251,307,352,331,251,307,255,294,352,0,352,9,333,12,352,0,333,12,320,17,352,0,320,17,255,41,352,0,255,41,252,26,256,62,255,41,320,17,256,62,320,17,312,25,256,62,312,25,256,157,148,0,148,9,129,12,148,0,129,12,117,17,148,0,117,17,53,39,148,0,53,39,49,25,54,61,53,39,117,17,54,61,117,17,109,25,54,61,109,25,105,38,54,61,105,38,54,274,148,0,9,9,9,0,352,0,212,9,212,0,256,274,308,37,307,55,231,319,211,331,211,321,320,315,256,274,312,307,28,319,9,331,9,321,
+157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,177,331,33,331,33,321,54,319,67,315,75,308,79,295,80,275,80,47,79,34,78,24,75,17,69,13,61,12,56,13,53,16,51,21,48,27,46,34,42,41,38,47,33,52,28,54,22,55,14,54,7,50,2,44,
+52,23,44,15,157,0,157,0,44,15,30,11,157,0,30,11,9,9,157,331,9,331,30,320,157,331,30,320,44,316,157,331,44,316,53,308,157,331,53,308,57,295,157,331,57,295,122,316,157,331,122,316,136,320,157,331,136,320,157,321,122,16,114,24,57,56,57,56,114,24,109,37,57,56,109,37,57,276,57,276,109,37,108,56,57,276,108,56,108,276,57,276,108,276,109,295,57,276,109,295,113,308,57,276,113,308,122,316,57,276,122,316,57,295,157,0,157,9,137,11,157,0,137,11,122,16,157,0,122,16,56,36,157,0,56,36,52,23,157,0,9,9,9,0,56,36,122,16,57,56,30,320,9,331,9,321,
+177,331,33,331,33,321,54,319,67,315,75,308,79,295,80,275,80,47,79,34,78,24,75,17,69,13,61,12,56,13,53,16,51,21,48,27,46,34,42,41,38,47,33,52,28,54,22,55,14,54,7,50,2,44,-1,37,-2,29,0,16,6,6,17,0,31,-5,47,-6,76,-2,100,8,117,28,128,56,131,93,131,275,132,294,136,307,143,315,157,319,177,321,362,0,362,9,349,11,336,16,322,25,305,41,283,64,166,192,259,281,278,298,292,309,305,316,320,320,338,321,338,331,208,331,208,321,220,321,229,320,235,318,238,315,240,311,241,305,239,298,234,289,226,280,202,256,113,174,113,293,117,307,124,315,137,319,158,321,158,331,17,331,17,321,37,319,50,315,57,306,61,293,62,275,62,63,61,40,57,26,50,17,
+78,24,75,17,76,-2,76,-2,75,17,69,13,76,-2,69,13,61,12,61,12,56,13,76,-2,76,-2,56,13,47,-6,157,319,177,321,177,331,157,319,177,331,143,315,143,315,177,331,79,295,143,315,79,295,80,275,100,8,80,275,80,47,100,8,80,47,79,34,131,275,132,294,117,28,131,275,117,28,128,56,131,275,128,56,131,93,132,294,136,307,80,275,132,294,80,275,100,8,132,294,100,8,117,28,177,331,33,331,54,319,177,331,54,319,67,315,177,331,67,315,75,308,177,331,75,308,79,295,78,24,76,-2,100,8,78,24,100,8,79,34,47,-6,56,13,53,16,47,-6,53,16,51,21,47,-6,51,21,48,27,47,-6,48,27,46,34,47,-6,46,34,42,41,47,-6,42,41,38,47,47,-6,38,47,33,52,47,-6,33,52,31,-5,33,52,28,54,31,-5,31,-5,28,54,22,55,31,-5,22,55,17,0,17,0,22,55,14,54,17,0,14,54,7,50,17,0,7,50,6,6,6,6,7,50,2,44,6,6,2,44,0,16,0,16,2,44,-1,37,0,16,-1,37,-2,29,54,319,33,331,33,321,143,315,80,275,136,307,
+362,0,362,9,349,11,336,16,322,25,305,41,283,64,166,192,259,281,278,298,292,309,305,316,320,320,338,321,338,331,208,331,208,321,220,321,229,320,235,318,238,315,240,311,241,305,239,298,234,289,226,280,202,256,113,174,113,293,117,307,124,315,137,319,158,321,158,331,17,331,17,321,37,319,50,315,57,306,61,293,62,275,62,63,61,40,57,26,50,17,36,12,17,9,17,0,157,0,157,9,139,12,126,16,118,23,114,36,113,55,113,148,126,158,176,107,198,84,217,63,232,46,241,32,244,22,244,18,241,15,237,12,231,11,224,10,210,9,210,0,299,87,286,87,277,69,273,62,265,50,254,39,239,30,223,24,203,21,180,20,127,20,114,22,106,26,102,32,100,42,100,274,101,294,105,307,113,315,127,319,147,321,147,331,6,331,6,321,26,319,38,314,46,306,49,292,50,273,50,57,49,38,45,25,37,16,25,12,6,9,6,0,275,0,432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,6,9,6,0,123,0,123,9,
+158,321,158,321,137,319,137,319,158,321,158,331,137,319,158,331,124,315,124,315,158,331,61,293,124,315,61,293,62,275,114,36,62,275,62,63,114,36,62,63,118,23,118,23,62,63,126,16,62,275,114,36,113,55,113,174,113,148,126,158,113,174,126,158,202,256,202,256,126,158,166,192,202,256,166,192,259,281,62,275,113,55,113,274,62,275,113,274,113,293,62,275,113,293,117,307,62,275,117,307,124,315,158,331,17,331,37,319,158,331,37,319,50,315,158,331,50,315,57,306,158,331,57,306,61,293,234,289,226,280,259,281,259,281,226,280,215,269,259,281,215,269,202,256,338,331,208,331,220,321,338,331,220,321,229,320,338,331,229,320,235,318,338,331,235,318,238,315,338,331,238,315,240,311,338,331,240,311,241,305,338,331,241,305,305,316,338,331,305,316,320,320,338,331,320,320,338,321,241,305,259,281,278,298,241,305,278,298,292,309,241,305,292,309,305,316,239,298,234,289,259,281,239,298,259,281,241,305,241,15,237,12,362,0,362,0,237,12,231,11,362,0,231,11,224,10,244,22,362,0,336,16,244,22,336,16,322,25,244,22,322,25,305,41,244,22,305,41,283,64,244,22,283,64,241,32,283,64,166,192,176,107,283,64,176,107,198,84,283,64,198,84,217,63,283,64,217,63,232,46,283,64,232,46,241,32,349,11,336,16,362,0,349,11,362,0,362,9,244,18,241,15,362,0,244,18,362,0,244,22,210,9,210,0,362,0,210,9,362,0,224,10,157,0,157,9,139,12,157,0,139,12,126,16,157,0,126,16,61,40,157,0,61,40,57,26,157,0,57,26,50,17,157,0,50,17,36,12,157,0,36,12,17,9,157,0,17,9,17,0,61,40,126,16,62,63,176,107,166,192,126,158,220,321,208,331,208,321,37,319,17,331,17,321,
+299,87,286,87,277,69,273,62,265,50,254,39,239,30,223,24,203,21,180,20,127,20,114,22,106,26,102,32,100,42,100,274,101,294,105,307,113,315,127,319,147,321,147,331,6,331,6,321,26,319,38,314,46,306,49,292,50,273,50,57,49,38,45,25,37,16,25,12,6,9,6,0,275,0,432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,6,9,6,0,123,0,123,9,103,12,90,18,82,29,78,48,
+147,321,147,321,127,319,127,319,147,321,147,331,127,319,147,331,113,315,113,315,147,331,49,292,113,315,49,292,50,273,102,32,50,273,50,57,102,32,50,57,106,26,106,26,50,57,49,38,106,26,49,38,114,22,114,22,49,38,45,25,114,22,45,25,127,20,127,20,45,25,275,0,127,20,275,0,146,20,146,20,275,0,180,20,100,42,100,274,50,273,50,273,100,274,101,294,50,273,101,294,105,307,147,331,6,331,26,319,147,331,26,319,38,314,147,331,38,314,46,306,147,331,46,306,49,292,277,69,273,62,275,0,275,0,273,62,269,56,275,0,269,56,265,50,265,50,254,39,275,0,275,0,254,39,239,30,275,0,239,30,223,24,299,87,286,87,281,77,299,87,281,77,277,69,299,87,277,69,275,0,203,21,180,20,275,0,203,21,275,0,223,24,275,0,45,25,37,16,275,0,37,16,25,12,275,0,25,12,6,9,275,0,6,9,6,0,50,273,102,32,100,42,26,319,6,331,6,321,113,315,50,273,105,307,
+432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,6,9,6,0,123,0,123,9,103,12,90,18,82,29,78,48,76,75,76,275,203,0,209,0,337,286,337,61,336,40,333,26,325,17,312,12,292,9,292,0,353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,103,13,90,20,82,31,78,49,76,75,76,269,297,-5,306,-5,306,274,308,289,311,299,315,307,320,313,324,315,329,318,335,319,343,320,353,321,344,166,336,222,
+49,29,41,18,123,0,123,0,41,18,27,12,123,0,27,12,6,9,333,26,325,17,432,0,432,0,325,17,312,12,432,0,312,12,292,9,413,320,431,321,431,331,413,320,431,331,401,316,401,316,431,331,337,286,401,316,337,286,393,307,393,307,337,286,389,294,401,17,393,25,337,61,337,61,393,25,389,38,337,61,389,38,337,286,337,286,389,38,388,56,337,286,388,56,388,275,203,0,209,0,222,80,222,80,209,0,337,286,222,80,337,286,332,331,332,331,337,286,431,331,106,331,7,331,28,319,106,331,28,319,42,315,106,331,42,315,50,307,106,331,50,307,54,294,106,331,54,294,55,275,106,331,55,275,76,275,106,331,76,275,203,0,106,331,203,0,222,80,76,75,76,275,55,275,76,75,55,275,78,48,78,48,55,275,55,75,78,48,55,75,82,29,82,29,55,75,54,47,82,29,54,47,90,18,90,18,54,47,49,29,90,18,49,29,123,0,432,0,432,9,413,12,432,0,413,12,401,17,432,0,401,17,336,40,432,0,336,40,333,26,103,12,90,18,123,0,103,12,123,0,123,9,123,0,6,9,6,0,432,0,292,9,292,0,336,40,401,17,337,61,28,319,7,331,7,321,389,294,337,286,388,275,
+353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,103,13,90,20,82,31,78,49,76,75,76,269,297,-5,306,-5,306,274,308,289,311,299,315,307,320,313,324,315,329,318,335,319,343,320,353,321,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,
+49,30,41,19,123,0,123,0,41,19,27,13,123,0,27,13,6,9,256,319,263,317,353,331,353,331,263,317,269,313,353,331,269,313,275,309,275,309,278,303,353,331,353,331,278,303,281,295,353,331,281,295,324,315,324,315,281,295,320,313,324,315,320,313,320,312,320,312,320,313,315,307,315,307,320,313,284,274,315,307,284,274,284,259,297,-5,284,259,284,89,297,-5,284,89,91,331,353,331,324,315,329,318,353,331,329,318,335,319,353,331,335,319,343,320,353,331,343,320,353,321,306,-5,306,253,297,-5,297,-5,306,253,306,274,297,-5,306,274,284,259,284,259,306,274,308,289,284,259,308,289,311,299,283,285,284,274,320,313,283,285,320,313,281,295,247,320,256,319,353,331,247,320,353,331,235,331,247,320,235,331,235,321,91,331,6,331,19,321,91,331,19,321,29,318,91,331,29,318,37,313,91,331,37,313,46,306,91,331,46,306,55,295,91,331,55,295,76,269,91,331,76,269,297,-5,55,295,78,49,76,75,54,48,49,30,90,20,90,20,49,30,123,0,90,20,123,0,103,13,103,13,123,0,123,9,55,75,54,48,82,31,55,75,82,31,78,49,55,75,78,49,55,295,123,0,6,9,6,0,54,48,90,20,82,31,19,321,6,331,6,321,76,269,55,295,76,75,315,307,284,259,311,299,
+344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,8,331,8,321,27,319,39,315,46,307,49,294,50,276,50,39,47,25,40,16,27,12,8,9,8,0,148,0,148,9,128,12,114,16,106,24,102,37,101,56,101,146,109,145,115,145,122,144,136,144,164,145,188,147,208,153,225,161,243,175,253,185,260,197,266,210,270,225,271,240,270,254,267,268,262,280,255,291,246,300,231,310,213,319,191,325,166,329,137,331,16383,16383,101,295,101,302,103,307,106,310,111,312,118,313,155,310,182,302,202,288,213,266,217,238,213,213,202,192,185,177,162,167,132,164,120,164,
+149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,81,24,74,166,46,61,223,19,234,1,235,26,130,25,180,-6,142,19,
+8,331,8,321,27,319,39,315,46,307,49,294,50,276,50,39,47,25,40,16,27,12,8,9,8,0,148,0,148,9,128,12,114,16,106,24,102,37,101,56,101,146,109,145,115,145,122,144,136,144,164,145,188,147,208,153,225,161,243,175,253,185,260,197,266,210,270,225,271,240,270,254,267,268,262,280,255,291,246,300,231,310,213,319,191,325,166,329,137,331,16383,16383,101,295,101,302,103,307,106,310,111,312,118,313,155,310,182,302,202,288,213,266,217,238,213,213,202,192,185,177,162,167,132,164,120,164,114,165,108,165,101,166,350,-88,350,-78,318,-74,288,-65,261,-51,236,-30,213,-2,232,1,248,6,263,12,277,21,290,32,309,54,324,77,335,104,342,133,344,166,336,224,314,272,279,308,234,330,180,338,127,330,82,308,47,272,25,224,17,166,18,140,23,115,31,92,42,70,55,50,67,36,79,25,94,16,111,7,132,0,153,-25,177,-48,206,-66,241,-78,282,-85,326,-88,16383,16383,287,169,285,139,281,111,275,85,266,64,255,47,243,35,230,25,215,18,198,13,180,11,163,13,146,18,129,26,115,37,103,50,93,68,85,89,79,113,75,139,74,167,76,196,
+111,312,118,312,118,313,137,331,118,313,155,310,137,331,155,310,166,329,166,329,155,310,182,302,166,329,182,302,191,325,191,325,182,302,202,288,191,325,202,288,213,319,213,319,202,288,213,266,213,319,213,266,231,310,231,310,213,266,217,238,231,310,217,238,225,161,225,161,213,213,208,153,208,153,213,213,202,192,208,153,202,192,188,147,188,147,202,192,185,177,188,147,185,177,164,145,164,145,185,177,162,167,164,145,162,167,136,144,136,144,162,167,132,164,136,144,132,164,128,144,128,144,132,164,126,164,128,144,126,164,122,144,122,144,126,164,120,164,122,144,120,164,115,145,115,145,120,164,114,165,115,145,114,165,109,145,109,145,114,165,108,165,109,145,108,165,101,166,101,56,101,166,50,276,101,56,50,276,102,37,102,37,50,276,50,61,101,166,101,146,109,145,271,240,270,254,270,225,270,225,270,254,267,268,270,225,267,268,266,210,266,210,267,268,262,280,266,210,262,280,260,197,260,197,262,280,255,291,260,197,255,291,253,185,253,185,255,291,246,300,253,185,246,300,243,175,243,175,246,300,231,310,243,175,231,310,225,161,137,331,8,331,27,319,137,331,27,319,39,315,137,331,39,315,46,307,137,331,46,307,49,294,137,331,49,294,50,276,137,331,50,276,106,310,137,331,106,310,111,312,137,331,111,312,118,313,101,295,101,302,50,276,101,295,50,276,101,166,103,307,106,310,50,276,103,307,50,276,101,302,148,0,148,9,128,12,148,0,128,12,114,16,148,0,114,16,50,39,148,0,50,39,47,25,148,0,47,25,40,16,148,0,40,16,27,12,148,0,27,12,8,9,148,0,8,9,8,0,50,61,50,39,114,16,50,61,114,16,106,24,50,61,106,24,102,37,27,319,8,331,8,321,213,213,225,161,217,238,155,310,118,313,118,312,
+350,-88,350,-78,318,-74,288,-65,261,-51,236,-30,213,-2,232,1,248,6,263,12,277,21,290,32,309,54,324,77,335,104,342,133,344,166,336,224,314,272,279,308,234,330,180,338,127,330,82,308,47,272,25,224,17,166,18,140,23,115,31,92,42,70,55,50,67,36,79,25,94,16,111,7,132,0,153,-25,177,-48,206,-66,241,-78,282,-85,326,-88,16383,16383,287,169,285,139,281,111,275,85,266,64,255,47,243,35,230,25,215,18,198,13,180,11,163,13,146,18,129,26,115,37,103,50,93,68,85,89,79,113,75,139,74,167,76,196,80,222,87,247,96,268,107,285,119,297,133,307,147,314,163,318,179,320,193,319,206,316,219,312,231,306,242,297,257,280,270,258,279,232,285,202,287,169,330,0,330,9,318,11,308,13,299,17,291,24,283,33,183,160,216,168,242,180,260,197,270,217,273,242,272,255,270,268,265,281,258,292,249,301,234,311,217,319,196,326,172,330,145,331,8,331,8,321,28,319,40,315,47,307,50,294,51,276,51,62,50,40,47,25,39,16,27,12,8,9,8,0,147,0,147,9,127,12,114,16,107,24,103,37,102,56,102,153,130,154,249,0,16383,16383,102,291,103,300,106,306,111,310,118,312,127,313,161,310,186,302,205,289,215,270,219,246,218,231,214,218,208,206,200,196,190,189,177,182,163,177,147,174,128,172,102,171,234,232,224,338,213,338,211,332,209,327,206,324,202,322,197,321,194,321,190,322,185,323,175,327,164,331,154,334,134,338,123,338,
+79,113,79,25,85,89,85,89,79,25,94,16,85,89,94,16,93,68,93,68,94,16,103,50,115,37,103,50,111,7,115,37,111,7,132,0,79,113,75,139,79,25,79,25,75,139,74,167,67,36,74,167,76,196,67,36,76,196,55,50,55,50,76,196,82,308,55,50,82,308,47,272,147,314,180,338,133,307,133,307,180,338,127,330,133,307,127,330,119,297,119,297,127,330,107,285,96,268,107,285,127,330,96,268,127,330,82,308,129,26,132,0,146,18,146,18,132,0,153,-25,146,18,153,-25,163,13,163,13,153,-25,177,-48,163,13,177,-48,180,11,180,11,177,-48,206,-66,180,11,206,-66,198,13,234,330,180,338,193,319,193,319,180,338,179,320,163,318,179,320,180,338,163,318,180,338,147,314,206,316,219,312,234,330,234,330,219,312,231,306,234,330,231,306,242,297,242,297,257,280,279,308,279,308,257,280,270,258,279,308,270,258,279,232,232,1,248,6,243,35,243,35,248,6,255,47,266,64,255,47,263,12,266,64,263,12,277,21,236,-30,213,-2,241,-78,215,18,213,-2,232,1,215,18,232,1,230,25,230,25,232,1,243,35,206,-66,241,-78,213,-2,206,-66,213,-2,215,18,206,-66,215,18,198,13,336,224,314,272,324,77,336,224,324,77,335,104,336,224,335,104,342,133,336,224,342,133,344,166,285,139,290,32,287,169,287,169,290,32,314,272,314,272,290,32,309,54,314,272,309,54,324,77,285,202,287,169,314,272,285,202,314,272,279,308,285,202,279,308,279,232,279,308,234,330,242,297,281,111,275,85,277,21,281,111,277,21,290,32,281,111,290,32,285,139,255,47,248,6,263,12,326,-88,350,-88,350,-78,326,-88,350,-78,318,-74,326,-88,318,-74,288,-65,326,-88,288,-65,282,-85,261,-51,236,-30,241,-78,261,-51,241,-78,282,-85,261,-51,282,-85,288,-65,82,308,76,196,80,222,82,308,80,222,87,247,82,308,87,247,96,268,18,140,23,115,25,224,25,224,23,115,31,92,25,224,31,92,47,272,47,272,31,92,42,70,47,272,42,70,55,50,103,50,94,16,111,7,18,140,25,224,17,166,266,64,277,21,275,85,234,330,193,319,206,316,115,37,132,0,129,26,79,25,74,167,67,36,
+330,0,330,9,318,11,308,13,299,17,291,24,283,33,183,160,216,168,242,180,260,197,270,217,273,242,272,255,270,268,265,281,258,292,249,301,234,311,217,319,196,326,172,330,145,331,8,331,8,321,28,319,40,315,47,307,50,294,51,276,51,62,50,40,47,25,39,16,27,12,8,9,8,0,147,0,147,9,127,12,114,16,107,24,103,37,102,56,102,153,130,154,249,0,16383,16383,102,291,103,300,106,306,111,310,118,312,127,313,161,310,186,302,205,289,215,270,219,246,218,231,214,218,208,206,200,196,190,189,177,182,163,177,147,174,128,172,102,171,234,232,224,338,213,338,211,332,209,327,206,324,202,322,197,321,194,321,190,322,185,323,175,327,164,331,154,334,134,338,123,338,95,334,71,323,52,305,40,281,36,251,38,232,44,214,56,196,73,180,97,165,116,154,135,142,152,130,168,118,180,107,185,100,189,93,192,85,194,77,195,67,192,49,184,33,172,21,155,14,136,11,109,15,85,25,65,42,47,67,32,99,22,99,36,-6,47,-6,48,0,50,4,53,7,57,9,61,10,64,10,79,7,84,4,96,0,107,-2,131,-6,143,-6,176,-2,204,10,226,29,240,55,246,86,243,108,233,128,218,148,
+118,312,127,312,127,313,145,331,127,313,161,310,145,331,161,310,172,330,172,330,161,310,186,302,172,330,186,302,196,326,196,326,186,302,205,289,196,326,205,289,217,319,217,319,205,289,215,270,217,319,215,270,219,246,214,218,208,206,216,168,216,168,208,206,200,196,216,168,200,196,190,189,190,189,177,182,183,160,183,160,177,182,163,177,183,160,163,177,249,0,249,0,163,177,147,174,249,0,147,174,130,154,130,154,147,174,128,172,130,154,128,172,102,171,265,281,258,292,260,197,260,197,258,292,249,301,260,197,249,301,242,180,242,180,249,301,234,311,242,180,234,311,219,246,219,246,234,311,217,319,214,218,216,168,218,231,218,231,216,168,242,180,218,231,242,180,219,246,270,217,273,242,272,255,270,217,272,255,270,268,270,217,270,268,265,281,270,217,265,281,260,197,190,189,183,160,216,168,318,11,308,13,330,0,330,0,308,13,299,17,330,0,299,17,249,0,249,0,299,17,291,24,249,0,291,24,283,33,102,56,102,171,51,276,102,56,51,276,103,37,103,37,51,276,51,62,102,171,102,153,130,154,145,331,8,331,28,319,145,331,28,319,40,315,145,331,40,315,47,307,145,331,47,307,50,294,145,331,50,294,51,276,145,331,51,276,111,310,145,331,111,310,118,312,145,331,118,312,127,313,102,291,103,300,51,276,102,291,51,276,102,171,106,306,111,310,51,276,106,306,51,276,103,300,147,0,147,9,127,12,147,0,127,12,114,16,147,0,114,16,50,40,147,0,50,40,47,25,147,0,47,25,39,16,147,0,39,16,27,12,147,0,27,12,8,9,147,0,8,9,8,0,51,62,50,40,114,16,51,62,114,16,107,24,51,62,107,24,103,37,28,319,8,331,8,321,183,160,249,0,283,33,318,11,330,0,330,9,161,310,127,313,127,312,
+234,232,224,338,213,338,211,332,209,327,206,324,202,322,197,321,194,321,190,322,185,323,175,327,164,331,154,334,134,338,123,338,95,334,71,323,52,305,40,281,36,251,38,232,44,214,56,196,73,180,97,165,116,154,135,142,152,130,168,118,180,107,185,100,189,93,192,85,194,77,195,67,192,49,184,33,172,21,155,14,136,11,109,15,85,25,65,42,47,67,32,99,22,99,36,-6,47,-6,48,0,50,4,53,7,57,9,61,10,64,10,79,7,84,4,96,0,107,-2,131,-6,143,-6,176,-2,204,10,226,29,240,55,246,86,243,108,233,128,218,148,196,166,168,185,139,202,114,218,95,234,83,251,79,270,81,286,88,299,98,309,112,315,129,318,146,316,162,310,177,302,190,291,201,278,206,271,211,263,215,254,218,244,222,232,296,246,293,331,12,331,8,246,21,246,27,274,37,292,50,303,70,309,97,310,127,310,127,61,126,39,123,25,115,16,101,12,80,9,80,0,226,0,226,9,205,11,192,16,183,23,179,36,178,55,178,310,208,310,235,309,254,303,268,292,277,274,285,246,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,
+50,4,53,7,65,42,65,42,53,7,57,9,65,42,57,9,61,10,61,10,64,10,65,42,65,42,64,10,69,9,65,42,69,9,85,25,85,25,69,9,74,8,85,25,74,8,79,7,95,234,83,251,97,165,97,165,83,251,79,270,73,180,79,270,71,323,73,180,71,323,56,196,56,196,71,323,52,305,56,196,52,305,44,214,44,214,52,305,40,281,44,214,40,281,38,232,38,232,40,281,36,251,81,286,88,299,95,334,95,334,88,299,98,309,95,334,98,309,123,338,123,338,98,309,112,315,123,338,112,315,129,318,129,318,146,316,134,338,134,338,146,316,144,336,81,286,95,334,71,323,81,286,71,323,79,270,134,338,123,338,129,318,144,336,146,316,154,334,154,334,146,316,162,310,154,334,162,310,164,331,164,331,162,310,177,302,164,331,177,302,175,327,175,327,177,302,180,325,95,234,97,165,114,218,114,218,97,165,116,154,114,218,116,154,139,202,139,202,116,154,135,142,139,202,135,142,152,130,136,11,119,-4,131,-6,136,11,131,-6,143,-6,136,11,109,15,119,-4,79,7,84,4,85,25,85,25,84,4,96,0,85,25,96,0,109,15,109,15,96,0,107,-2,109,15,107,-2,119,-4,36,-6,47,-6,47,67,47,67,47,-6,48,0,47,67,48,0,65,42,65,42,48,0,50,4,32,99,22,99,36,-6,32,99,36,-6,47,67,139,202,152,130,168,185,168,185,152,130,168,118,168,185,168,118,180,107,180,107,185,100,196,166,196,166,185,100,189,93,196,166,189,93,192,85,246,86,243,108,240,55,240,55,243,108,233,128,240,55,233,128,226,29,226,29,233,128,218,148,226,29,218,148,204,10,204,10,218,148,196,166,204,10,196,166,195,67,195,67,192,49,204,10,204,10,192,49,184,33,204,10,184,33,176,-2,176,-2,184,33,172,21,176,-2,172,21,155,14,196,166,192,85,194,77,196,166,194,77,195,67,196,166,168,185,180,107,155,14,136,11,143,-6,155,14,143,-6,176,-2,190,291,201,278,194,321,194,321,201,278,197,321,202,322,197,321,201,278,190,291,194,321,190,322,190,291,190,322,185,323,190,291,185,323,180,325,190,291,180,325,177,302,224,338,213,338,215,254,224,338,215,254,218,244,224,338,218,244,222,232,224,338,222,232,234,232,206,324,206,271,209,327,209,327,206,271,211,263,209,327,211,263,211,332,211,332,211,263,215,254,211,332,215,254,213,338,202,322,201,278,206,271,202,322,206,271,206,324,97,165,79,270,73,180,
+296,246,293,331,12,331,8,246,21,246,27,274,37,292,50,303,70,309,97,310,127,310,127,61,126,39,123,25,115,16,101,12,80,9,80,0,226,0,226,9,205,11,192,16,183,23,179,36,178,55,178,310,208,310,235,309,254,303,268,292,277,274,285,246,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,
+293,331,12,331,70,309,293,331,70,309,97,310,293,331,97,310,127,310,293,331,127,310,178,310,293,331,178,310,208,310,293,331,208,310,235,309,293,331,235,309,254,303,293,331,254,303,268,292,293,331,268,292,277,274,293,331,277,274,285,246,293,331,285,246,296,246,192,16,183,23,127,61,127,61,183,23,179,36,127,61,179,36,127,310,127,310,179,36,178,55,127,310,178,55,178,310,12,331,8,246,21,246,12,331,21,246,27,274,12,331,27,274,37,292,12,331,37,292,50,303,12,331,50,303,70,309,226,0,226,9,205,11,226,0,205,11,192,16,226,0,192,16,126,39,226,0,126,39,123,25,226,0,123,25,115,16,226,0,115,16,101,12,226,0,101,12,80,9,226,0,80,9,80,0,126,39,192,16,127,61,
+353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,349,331,247,331,247,321,258,321,268,319,276,316,281,310,282,301,282,295,281,289,279,282,276,274,273,265,200,80,123,252,116,269,110,283,106,292,104,300,104,305,105,310,107,314,112,317,118,319,127,320,141,321,141,331,8,331,8,321,21,320,31,316,41,307,50,291,62,267,184,-5,191,-5,302,276,311,295,319,308,328,316,338,320,349,321,466,331,368,331,368,321,381,320,391,318,397,314,401,308,402,301,402,294,401,287,399,280,397,271,394,262,331,93,259,275,255,289,253,295,252,300,251,304,253,310,257,315,265,318,276,320,290,321,290,331,157,331,
+105,79,106,8,109,63,109,63,106,8,121,1,109,63,121,1,115,50,115,50,121,1,125,37,135,30,125,37,138,-3,135,30,138,-3,146,24,146,24,138,-3,157,-5,146,24,157,-5,158,19,158,19,157,-5,177,-6,158,19,177,-6,173,16,173,16,177,-6,189,15,208,16,189,15,204,-5,208,16,204,-5,227,0,103,118,103,275,93,16,103,118,93,16,104,97,104,97,93,16,106,8,104,97,106,8,105,79,125,37,121,1,138,-3,283,103,282,85,290,45,290,45,282,85,279,70,290,45,279,70,278,30,278,30,279,70,273,57,278,30,273,57,265,45,265,45,254,34,264,17,264,17,254,34,247,6,241,26,225,20,227,0,241,26,227,0,247,6,241,26,247,6,254,34,353,331,237,331,257,319,353,331,257,319,270,312,353,331,270,312,279,301,353,331,279,301,318,311,353,331,318,311,331,318,353,331,331,318,353,321,305,258,306,282,297,62,305,258,297,62,302,81,305,258,302,81,305,104,305,258,305,104,305,131,290,45,297,62,306,282,290,45,306,282,283,257,290,45,283,257,283,125,290,45,283,125,283,103,310,300,318,311,282,283,310,300,282,283,283,257,310,300,283,257,306,282,265,45,264,17,278,30,189,15,177,-6,204,-5,128,319,148,321,148,331,128,319,148,331,115,314,115,314,148,331,51,297,115,314,51,297,52,280,53,95,52,280,52,124,58,69,66,48,104,293,104,293,66,48,78,30,104,293,78,30,103,275,103,275,78,30,93,16,104,293,108,306,52,280,104,293,52,280,53,95,104,293,53,95,58,69,148,331,7,331,27,319,148,331,27,319,40,315,148,331,40,315,47,308,148,331,47,308,51,297,27,319,7,331,7,321,115,314,52,280,108,306,257,319,237,331,237,321,318,311,279,301,282,283,208,16,227,0,225,20,
+349,331,247,331,247,321,258,321,268,319,276,316,281,310,282,301,282,295,281,289,279,282,276,274,273,265,200,80,123,252,116,269,110,283,106,292,104,300,104,305,105,310,107,314,112,317,118,319,127,320,141,321,141,331,8,331,8,321,21,320,31,316,41,307,50,291,62,267,184,-5,191,-5,302,276,311,295,319,308,328,316,338,320,349,321,466,331,368,331,368,321,381,320,391,318,397,314,401,308,402,301,402,294,401,287,399,280,397,271,394,262,331,93,259,275,255,289,253,295,252,300,251,304,253,310,257,315,265,318,276,320,290,321,290,331,157,331,157,321,171,320,182,317,191,309,199,295,208,273,222,236,170,94,98,282,96,288,95,293,93,298,93,311,96,316,102,319,111,321,
+62,267,184,-5,62,267,62,267,184,-5,104,300,62,267,104,300,104,305,104,305,105,310,62,267,62,267,105,310,107,314,62,267,107,314,50,291,141,331,8,331,21,320,141,331,21,320,31,316,141,331,31,316,41,307,141,331,41,307,50,291,141,331,50,291,112,317,141,331,112,317,118,319,141,331,118,319,127,320,141,331,127,320,141,321,281,289,279,282,302,276,302,276,279,282,276,274,302,276,276,274,273,265,273,265,200,80,302,276,302,276,200,80,191,-5,349,331,247,331,258,321,349,331,258,321,268,319,349,331,268,319,276,316,349,331,276,316,281,310,349,331,281,310,282,301,349,331,282,301,328,316,349,331,328,316,338,320,349,331,338,320,349,321,282,301,302,276,311,295,282,301,311,295,319,308,282,301,319,308,328,316,282,295,281,289,302,276,282,295,302,276,282,301,184,-5,191,-5,200,80,184,-5,200,80,123,252,184,-5,123,252,116,269,184,-5,116,269,110,283,184,-5,110,283,106,292,184,-5,106,292,104,300,258,321,247,331,247,321,21,320,8,331,8,321,112,317,50,291,107,314,
+466,331,368,331,368,321,381,320,391,318,397,314,401,308,402,301,402,294,401,287,399,280,397,271,394,262,331,93,259,275,255,289,253,295,252,300,251,304,253,310,257,315,265,318,276,320,290,321,290,331,157,331,157,321,171,320,182,317,191,309,199,295,208,273,222,236,170,94,98,282,96,288,95,293,93,298,93,311,96,316,102,319,111,321,124,321,124,331,2,331,2,321,16,320,27,314,36,303,45,286,55,262,73,210,92,157,132,49,151,-5,158,-5,235,206,251,165,267,123,299,37,315,-5,323,-5,344,61,361,111,377,158,397,212,425,286,430,299,436,308,443,314,453,318,466,321,352,0,352,9,338,12,327,16,317,22,307,32,296,46,200,184,272,272,289,292,303,305,316,314,331,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,263,301,260,296,257,290,251,282,243,272,188,202,166,234,151,255,139,272,131,286,126,297,124,306,125,312,128,316,133,319,139,320,147,321,161,321,161,331,11,331,11,321,29,319,44,312,59,299,78,276,103,242,156,164,78,66,58,42,43,26,31,17,19,12,5,9,5,0,121,0,121,9,106,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,100,57,109,70,169,145,217,74,226,60,233,48,
+16,320,27,314,124,331,124,331,27,314,36,303,124,331,36,303,96,316,96,316,36,303,45,286,96,316,45,286,55,262,55,262,73,210,93,311,93,311,73,210,93,306,93,302,93,306,92,157,93,302,92,157,112,103,111,321,124,321,124,331,111,321,124,331,102,319,102,319,124,331,96,316,93,306,73,210,92,157,96,316,55,262,93,311,2,331,2,321,16,320,2,331,16,320,124,331,251,165,267,123,251,304,251,304,253,310,222,236,222,236,253,310,208,273,199,295,208,273,257,315,199,295,257,315,290,331,290,331,257,315,265,318,290,331,265,318,276,320,276,320,290,321,290,331,251,304,222,236,235,206,251,304,235,206,251,165,257,315,208,273,253,310,290,331,157,331,171,320,290,331,171,320,182,317,290,331,182,317,191,309,290,331,191,309,199,295,394,262,361,111,377,158,394,262,377,158,397,212,394,262,331,93,344,61,394,262,344,61,361,111,331,93,259,275,267,123,331,93,267,123,283,80,331,93,283,80,299,37,331,93,299,37,315,-5,331,93,315,-5,323,-5,331,93,323,-5,344,61,267,123,259,275,257,282,267,123,257,282,255,289,267,123,255,289,253,295,267,123,253,295,252,300,267,123,252,300,251,304,402,294,401,287,425,286,425,286,401,287,399,280,425,286,399,280,397,212,397,212,399,280,397,271,397,212,397,271,394,262,402,301,425,286,430,299,402,301,430,299,436,308,402,301,436,308,443,314,402,301,443,314,466,331,402,301,466,331,401,308,402,294,425,286,402,301,453,318,466,321,466,331,453,318,466,331,443,314,466,331,368,331,381,320,466,331,381,320,391,318,466,331,391,318,397,314,466,331,397,314,401,308,170,94,98,282,112,103,170,94,112,103,132,49,170,94,132,49,151,-5,170,94,151,-5,158,-5,170,94,158,-5,235,206,170,94,235,206,222,236,112,103,98,282,96,288,112,103,96,288,95,293,112,103,95,293,93,298,112,103,93,298,93,302,381,320,368,331,368,321,171,320,157,331,157,321,
+352,0,352,9,338,12,327,16,317,22,307,32,296,46,200,184,272,272,289,292,303,305,316,314,331,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,263,301,260,296,257,290,251,282,243,272,188,202,166,234,151,255,139,272,131,286,126,297,124,306,125,312,128,316,133,319,139,320,147,321,161,321,161,331,11,331,11,321,29,319,44,312,59,299,78,276,103,242,156,164,78,66,58,42,43,26,31,17,19,12,5,9,5,0,121,0,121,9,106,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,100,57,109,70,169,145,217,74,226,60,233,48,238,38,241,31,242,25,241,20,238,16,233,14,226,12,217,11,204,9,204,0,352,331,243,331,243,321,256,321,266,319,272,316,275,312,276,306,276,302,274,294,272,290,270,285,197,174,124,285,121,289,118,294,116,299,115,304,115,308,116,312,119,316,123,318,130,320,138,321,151,321,151,331,11,331,11,321,24,319,37,313,50,299,68,277,92,243,157,147,157,61,156,39,152,25,144,16,129,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,151,282,266,297,288,310,303,322,313,336,319,352,321,299,88,287,88,282,72,278,59,273,49,266,40,257,33,249,28,240,24,228,21,215,20,199,19,73,19,289,324,289,331,26,331,16,246,29,246,32,260,35,271,38,279,43,287,50,295,58,301,68,306,81,309,97,311,
+31,17,121,0,43,26,43,26,121,0,88,17,43,26,88,17,58,42,58,42,88,17,84,21,58,42,84,21,83,26,83,26,84,31,78,66,78,66,84,31,87,38,78,66,87,38,156,164,156,164,87,38,92,46,156,164,92,46,100,57,103,242,156,164,126,297,103,242,126,297,124,306,124,306,125,312,103,242,156,164,100,57,109,70,109,70,169,145,156,164,156,164,169,145,166,234,156,164,166,234,151,255,78,66,58,42,83,26,103,242,125,312,78,276,78,276,125,312,128,316,78,276,128,316,59,299,59,299,128,316,133,319,59,299,133,319,161,331,161,331,133,319,139,320,161,331,139,320,147,321,147,321,161,321,161,331,161,331,11,331,29,319,161,331,29,319,44,312,161,331,44,312,59,299,260,296,257,290,272,272,272,272,257,290,251,282,272,272,251,282,243,272,243,272,188,202,200,184,200,184,188,202,217,74,200,184,217,74,296,46,296,46,217,74,226,60,296,46,226,60,233,48,348,331,229,331,243,320,348,331,243,320,253,319,348,331,253,319,259,316,348,331,259,316,262,311,348,331,262,311,263,305,348,331,263,305,316,314,348,331,316,314,331,319,348,331,331,319,348,321,263,305,272,272,289,292,263,305,289,292,303,305,263,305,303,305,316,314,263,301,260,296,272,272,263,301,272,272,263,305,243,272,200,184,272,272,238,16,233,14,352,0,352,0,233,14,226,12,352,0,226,12,217,11,242,25,352,0,327,16,242,25,327,16,317,22,242,25,317,22,307,32,242,25,307,32,296,46,242,25,296,46,241,31,296,46,233,48,238,38,296,46,238,38,241,31,188,202,166,234,169,145,188,202,169,145,217,74,338,12,327,16,352,0,338,12,352,0,352,9,241,20,238,16,352,0,241,20,352,0,242,25,204,9,204,0,352,0,204,9,352,0,217,11,156,164,151,255,139,272,156,164,139,272,131,286,156,164,131,286,126,297,121,0,121,9,106,11,121,0,106,11,95,13,121,0,95,13,88,17,19,12,5,9,121,0,19,12,121,0,31,17,121,0,5,9,5,0,243,320,229,331,229,321,29,319,11,331,11,321,
+352,331,243,331,243,321,256,321,266,319,272,316,275,312,276,306,276,302,274,294,272,290,270,285,197,174,124,285,121,289,118,294,116,299,115,304,115,308,116,312,119,316,123,318,130,320,138,321,151,321,151,331,11,331,11,321,24,319,37,313,50,299,68,277,92,243,157,147,157,61,156,39,152,25,144,16,129,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,151,282,266,297,288,310,303,322,313,336,319,352,321,299,88,287,88,282,72,278,59,273,49,266,40,257,33,249,28,240,24,228,21,215,20,199,19,73,19,289,324,289,331,26,331,16,246,29,246,32,260,35,271,38,279,43,287,50,295,58,301,68,306,81,309,97,311,117,312,224,312,5,7,5,0,286,0,150,-77,150,-64,108,-64,99,-63,92,-61,86,-56,83,-48,82,-38,82,295,83,304,86,311,92,315,99,318,108,319,150,319,150,331,44,331,44,-77,143,-6,29,338,-3,338,109,-6,123,-77,
+121,289,118,294,157,147,157,147,118,294,116,299,157,147,116,299,92,243,92,243,116,299,115,304,92,243,115,304,115,308,115,308,116,312,92,243,151,331,11,331,24,319,151,331,24,319,37,313,151,331,37,313,50,299,151,331,50,299,123,318,151,331,123,318,130,320,151,331,130,320,138,321,151,331,138,321,151,321,123,318,50,299,119,316,119,316,50,299,68,277,119,316,68,277,116,312,116,312,68,277,92,243,209,55,209,151,197,174,209,55,197,174,210,36,210,36,197,174,157,147,210,36,157,147,215,23,215,23,157,147,157,61,215,23,157,61,224,15,224,15,157,61,156,39,224,15,156,39,260,0,260,0,156,39,152,25,260,0,152,25,144,16,275,298,274,294,282,266,282,266,274,294,272,290,282,266,272,290,270,285,270,285,197,174,209,151,352,331,243,331,256,321,352,331,256,321,266,319,352,331,266,319,272,316,352,331,272,316,275,312,352,331,275,312,276,306,352,331,276,306,322,313,352,331,322,313,336,319,352,331,336,319,352,321,276,306,282,266,297,288,276,306,297,288,310,303,276,306,310,303,322,313,282,266,276,306,276,302,282,266,276,302,275,298,270,285,209,151,282,266,239,11,224,15,260,0,239,11,260,0,260,9,129,12,107,9,260,0,129,12,260,0,144,16,124,285,121,289,157,147,124,285,157,147,197,174,260,0,107,9,107,0,256,321,243,331,243,321,24,319,11,331,11,321,
+299,88,287,88,282,72,278,59,273,49,266,40,257,33,249,28,240,24,228,21,215,20,199,19,73,19,289,324,289,331,26,331,16,246,29,246,32,260,35,271,38,279,43,287,50,295,58,301,68,306,81,309,97,311,117,312,224,312,5,7,5,0,286,0,150,-77,150,-64,108,-64,99,-63,92,-61,86,-56,83,-48,82,-38,82,295,83,304,86,311,92,315,99,318,108,319,150,319,150,331,44,331,44,-77,143,-6,29,338,-3,338,109,-6,123,-77,123,331,17,331,17,319,59,319,69,318,76,314,81,309,83,301,84,291,
+35,271,38,279,26,331,26,331,38,279,43,287,26,331,43,287,50,295,50,295,58,301,26,331,26,331,58,301,68,306,26,331,68,306,81,309,73,19,289,324,224,312,224,312,289,324,289,331,224,312,289,331,117,312,97,311,117,312,289,331,97,311,289,331,26,331,26,331,16,246,29,246,26,331,29,246,32,260,26,331,32,260,35,271,224,312,5,7,73,19,73,19,5,7,286,0,73,19,286,0,199,19,199,19,286,0,215,20,278,59,273,49,286,0,286,0,273,49,266,40,286,0,266,40,257,33,257,33,249,28,286,0,286,0,249,28,240,24,286,0,240,24,228,21,286,0,299,88,287,88,286,0,287,88,282,72,286,0,282,72,278,59,286,0,5,7,5,0,215,20,286,0,228,21,26,331,81,309,97,311,
+150,-77,150,-64,108,-64,99,-63,92,-61,86,-56,83,-48,82,-38,82,295,83,304,86,311,92,315,99,318,108,319,150,319,150,331,44,331,44,-77,143,-6,29,338,-3,338,109,-6,123,-77,123,331,17,331,17,319,59,319,69,318,76,314,81,309,83,301,84,291,84,-50,81,-56,77,-61,70,-63,
+86,311,92,315,44,331,44,331,92,315,99,318,44,331,99,318,150,331,150,331,99,318,108,319,82,-38,82,295,44,331,82,-38,44,331,44,-77,82,-38,44,-77,83,-48,83,304,86,311,44,331,83,304,44,331,82,295,150,-64,108,-64,150,-77,150,-77,108,-64,99,-63,150,-77,99,-63,44,-77,44,-77,99,-63,92,-61,44,-77,92,-61,86,-56,83,-48,44,-77,86,-56,150,331,108,319,150,319,
+143,-6,29,338,-3,338,109,-6,123,-77,123,331,17,331,17,319,
+143,-6,29,338,-3,338,143,-6,-3,338,109,-6,
+123,-77,123,331,17,331,17,319,59,319,69,318,76,314,81,309,83,301,84,291,84,-50,81,-56,77,-61,70,-63,61,-64,17,-64,17,-77,223,148,132,331,103,331,12,148,46,148,118,293,189,148,250,-62,250,-36,0,-36,0,-62,121,253,49,328,44,332,40,335,35,337,27,339,
+123,-77,123,331,84,291,123,-77,84,291,84,-41,123,-77,84,-41,84,-50,123,-77,84,-50,81,-56,123,-77,81,-56,77,-61,123,-77,77,-61,70,-63,123,-77,70,-63,61,-64,123,-77,61,-64,17,-64,123,-77,17,-64,17,-77,76,314,81,309,123,331,123,331,81,309,83,301,123,331,83,301,84,291,123,331,17,331,59,319,123,331,59,319,69,318,123,331,69,318,76,314,59,319,17,331,17,319,
+223,148,132,331,103,331,12,148,46,148,118,293,189,148,250,-62,250,-36,0,-36,0,-62,121,253,49,328,44,332,
+12,148,46,148,103,331,103,331,46,148,118,293,103,331,118,293,132,331,132,331,118,293,189,148,132,331,189,148,223,148,
+250,-62,250,-36,0,-36,0,-62,121,253,49,328,44,332,40,335,
+250,-62,250,-36,0,-36,250,-62,0,-36,0,-62,
+121,253,49,328,44,332,40,335,35,337,27,339,21,338,16,336,12,333,10,329,9,323,10,318,12,314,15,309,19,305,24,301,101,253,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,
+101,253,121,253,49,328,101,253,49,328,44,332,101,253,44,332,40,335,101,253,40,335,35,337,101,253,35,337,31,338,101,253,31,338,27,339,101,253,27,339,24,301,9,323,10,318,10,329,10,329,10,318,12,314,10,329,12,314,12,333,12,333,12,314,15,309,12,333,15,309,16,336,16,336,15,309,19,305,16,336,19,305,21,338,21,338,19,305,24,301,21,338,24,301,27,339,
+221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,76,340,74,342,62,338,51,334,41,331,29,328,17,324,2,320,2,311,5,311,6,312,10,312,21,311,28,309,32,304,34,296,35,283,35,28,39,18,52,9,71,2,93,-2,117,-4,155,1,187,18,212,44,228,78,234,120,230,155,218,185,199,209,174,224,144,230,126,228,110,223,96,214,85,202,76,188,16383,16383,76,159,79,171,86,182,97,191,111,197,126,199,137,198,146,195,155,190,164,183,171,175,177,163,183,149,186,133,189,116,190,99,189,82,187,67,183,54,178,42,171,32,164,25,156,19,147,15,136,12,125,11,110,12,97,16,86,21,79,28,76,37,199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,195,166,198,172,199,179,195,195,184,209,167,220,146,227,122,230,108,229,94,226,80,221,67,213,55,204,
+37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,184,56,186,-3,185,44,29,167,29,183,28,175,
+76,340,74,342,62,338,51,334,41,331,29,328,17,324,2,320,2,311,5,311,6,312,10,312,21,311,28,309,32,304,34,296,35,283,35,28,39,18,52,9,71,2,93,-2,117,-4,155,1,187,18,212,44,228,78,234,120,230,155,218,185,199,209,174,224,144,230,126,228,110,223,96,214,85,202,76,188,16383,16383,76,159,79,171,86,182,97,191,111,197,126,199,137,198,146,195,155,190,164,183,171,175,177,163,183,149,186,133,189,116,190,99,189,82,187,67,183,54,178,42,171,32,164,25,156,19,147,15,136,12,125,11,110,12,97,16,86,21,79,28,76,37,199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,195,166,198,172,199,179,195,195,184,209,167,220,146,227,122,230,108,229,94,226,80,221,67,213,55,204,40,189,28,172,19,152,14,130,12,106,17,70,30,39,50,15,76,0,108,-4,120,-3,132,-1,144,3,155,9,165,16,174,24,181,32,189,43,197,57,206,74,246,21,246,29,239,29,237,28,234,28,225,29,218,32,215,37,
+5,311,6,312,17,324,17,324,6,312,8,312,17,324,8,312,10,312,10,312,21,311,17,324,17,324,21,311,29,328,97,16,86,21,93,-2,93,-2,86,21,79,28,93,-2,79,28,71,2,71,2,79,28,76,37,71,2,76,37,74,342,74,342,76,37,76,188,74,342,76,188,76,340,62,338,51,334,52,9,52,9,51,334,41,331,52,9,41,331,39,18,39,18,41,331,35,283,39,18,35,283,35,28,3,311,5,311,17,324,3,311,17,324,2,320,3,311,2,320,2,311,156,19,147,15,155,1,155,1,147,15,136,12,155,1,136,12,125,11,125,11,110,12,117,-4,117,-4,110,12,97,16,117,-4,97,16,93,-2,62,338,52,9,71,2,62,338,71,2,74,342,21,311,28,309,29,328,29,328,28,309,32,304,29,328,32,304,41,331,41,331,32,304,34,296,41,331,34,296,35,283,126,228,126,199,137,198,126,228,137,198,144,230,144,230,137,198,146,195,144,230,146,195,174,224,174,224,146,195,155,190,174,224,155,190,164,183,76,159,79,171,85,202,85,202,79,171,86,182,85,202,86,182,96,214,96,214,86,182,97,191,96,214,97,191,110,223,110,223,97,191,111,197,110,223,111,197,126,228,126,228,111,197,126,199,76,159,85,202,76,188,76,159,76,188,76,37,174,224,171,175,177,163,174,224,177,163,199,209,199,209,177,163,183,149,199,209,183,149,186,133,187,67,183,54,187,18,187,18,183,54,178,42,187,18,178,42,171,32,171,32,164,25,187,18,187,18,164,25,156,19,187,18,156,19,155,1,234,120,230,155,228,78,228,78,230,155,218,185,228,78,218,185,212,44,212,44,218,185,199,209,212,44,199,209,190,99,190,99,199,209,189,116,187,67,187,18,189,82,189,82,187,18,212,44,189,82,212,44,190,99,125,11,117,-4,155,1,199,209,186,133,189,116,174,224,164,183,171,175,
+199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,195,166,198,172,199,179,195,195,184,209,167,220,146,227,122,230,108,229,94,226,80,221,67,213,55,204,40,189,28,172,19,152,14,130,12,106,17,70,30,39,50,15,76,0,108,-4,120,-3,132,-1,144,3,155,9,165,16,174,24,181,32,189,43,197,57,206,74,246,21,246,29,239,29,237,28,234,28,225,29,218,32,215,37,213,45,212,57,212,340,209,342,195,337,169,329,154,324,136,320,136,311,138,312,147,312,156,311,163,309,167,304,170,297,170,209,159,217,149,223,139,227,129,229,118,230,85,223,56,206,34,178,19,143,13,103,18,67,30,37,49,14,75,0,106,-4,122,-3,136,0,148,7,160,16,170,28,170,-2,172,-4,16383,16383,170,51,170,49,169,46,165,40,162,37,157,31,150,27,143,24,135,22,126,21,102,26,83,39,69,60,60,88,56,123,
+81,49,65,69,76,0,76,0,65,69,54,96,76,0,54,96,50,15,50,15,54,96,51,128,55,204,51,128,54,157,55,204,54,157,63,181,128,31,108,-4,120,-3,128,31,120,-3,132,-1,128,31,103,36,108,-4,81,49,76,0,108,-4,81,49,108,-4,103,36,136,212,141,208,146,227,146,227,141,208,145,201,146,227,145,201,148,191,148,191,151,180,167,220,167,220,151,180,154,172,167,220,154,172,159,166,122,230,119,215,128,215,122,230,128,215,146,227,146,227,128,215,136,212,195,195,184,209,189,161,195,195,189,161,195,166,195,195,195,166,198,172,195,195,198,172,199,179,184,209,167,220,169,158,184,209,169,158,175,157,184,209,175,157,183,158,184,209,183,158,189,161,167,220,159,166,163,161,167,220,163,161,169,158,167,220,146,227,148,191,174,24,181,32,185,60,185,60,181,32,189,43,185,60,189,43,199,78,199,78,189,43,197,57,199,78,197,57,206,74,132,-1,144,3,144,33,144,33,144,3,155,9,144,33,155,9,159,38,159,38,155,9,165,16,159,38,165,16,172,46,172,46,165,16,174,24,172,46,174,24,185,60,144,33,128,31,132,-1,96,211,119,215,108,229,96,211,108,229,94,226,96,211,94,226,80,221,96,211,80,221,78,200,67,213,55,204,63,181,67,213,63,181,78,200,67,213,78,200,80,221,40,189,28,172,30,39,40,189,30,39,50,15,40,189,50,15,51,128,40,189,51,128,55,204,19,152,14,130,17,70,19,152,17,70,30,39,19,152,30,39,28,172,119,215,122,230,108,229,17,70,14,130,12,106,
+246,21,246,29,239,29,237,28,234,28,225,29,218,32,215,37,213,45,212,57,212,340,209,342,195,337,169,329,154,324,136,320,136,311,138,312,147,312,156,311,163,309,167,304,170,297,170,209,159,217,149,223,139,227,129,229,118,230,85,223,56,206,34,178,19,143,13,103,18,67,30,37,49,14,75,0,106,-4,122,-3,136,0,148,7,160,16,170,28,170,-2,172,-4,16383,16383,170,51,170,49,169,46,165,40,162,37,157,31,150,27,143,24,135,22,126,21,102,26,83,39,69,60,60,88,56,123,59,154,67,180,80,199,98,212,119,216,135,213,149,206,160,195,167,181,170,166,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,11,225,11,209,51,209,51,52,50,34,47,21,40,13,28,9,10,7,10,0,140,0,140,7,119,9,106,13,98,21,95,33,94,52,94,209,155,209,
+170,209,159,217,160,195,160,195,159,217,149,223,160,195,149,223,149,206,149,206,149,223,139,227,149,206,139,227,135,213,135,213,139,227,129,229,135,213,129,229,119,216,67,180,80,199,85,223,85,223,80,199,98,212,85,223,98,212,118,230,118,230,98,212,119,216,118,230,119,216,129,229,13,103,18,67,19,143,19,143,18,67,30,37,19,143,30,37,34,178,34,178,30,37,49,14,34,178,49,14,56,206,56,206,49,14,56,123,56,206,56,123,59,154,56,206,59,154,67,180,56,206,67,180,85,223,126,21,106,-4,122,-3,126,21,122,-3,136,0,126,21,102,26,106,-4,83,39,69,60,75,0,83,39,75,0,106,-4,83,39,106,-4,102,26,60,88,56,123,49,14,60,88,49,14,75,0,60,88,75,0,69,60,169,46,167,43,170,28,170,28,167,43,165,40,170,28,165,40,162,37,162,37,157,31,160,16,160,16,157,31,150,27,160,16,150,27,148,7,148,7,150,27,143,24,148,7,143,24,136,0,136,0,143,24,135,22,136,0,135,22,126,21,140,312,142,312,154,324,154,324,142,312,145,312,154,324,145,312,147,312,147,312,156,311,154,324,154,324,156,311,169,329,154,324,136,320,138,312,154,324,138,312,140,312,170,209,170,166,170,28,170,209,170,28,170,286,170,297,170,286,182,333,170,297,182,333,169,329,170,209,160,195,167,181,170,209,167,181,170,166,172,-4,246,21,225,29,172,-4,225,29,218,32,172,-4,218,32,215,37,172,-4,215,37,213,45,172,-4,213,45,182,333,172,-4,182,333,170,28,172,-4,170,28,170,-2,170,28,170,166,170,51,170,28,170,51,170,49,170,28,170,49,169,46,162,37,160,16,170,28,212,57,212,340,209,342,212,57,209,342,195,337,212,57,195,337,213,45,239,29,237,28,246,21,246,21,237,28,235,28,246,21,235,28,234,28,234,28,225,29,246,21,241,29,239,29,246,21,241,29,246,21,246,29,169,329,156,311,163,309,169,329,163,309,167,304,169,329,167,304,170,297,138,312,136,320,136,311,182,333,170,286,170,28,182,333,213,45,195,337,
+204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,11,225,11,209,51,209,51,52,50,34,47,21,40,13,28,9,10,7,10,0,140,0,140,7,119,9,106,13,98,21,95,33,94,52,94,209,155,209,155,225,94,225,94,283,95,299,98,311,104,320,111,326,122,328,128,327,133,325,138,321,143,316,148,308,153,301,157,296,161,293,166,291,171,290,177,291,183,294,188,298,190,304,191,310,189,321,182,329,171,336,156,340,140,342,121,340,105,335,90,328,78,318,69,305,62,292,
+52,100,50,118,49,15,49,15,50,118,49,138,49,15,49,138,31,182,49,15,31,182,29,39,29,39,31,182,17,148,29,39,17,148,17,70,17,70,17,148,12,108,133,228,116,230,120,210,120,210,116,230,103,212,87,210,103,212,116,230,87,210,116,230,81,224,190,62,176,48,181,26,181,26,176,48,162,37,181,26,162,37,160,9,160,9,162,37,146,31,160,9,146,31,136,-1,136,-1,146,31,127,30,203,138,201,153,198,166,203,138,198,166,195,177,203,138,195,177,190,186,203,138,190,186,185,195,203,138,185,195,175,207,203,138,175,207,163,217,203,138,163,217,151,155,203,138,151,155,50,155,203,138,50,155,49,138,141,192,147,176,149,224,149,224,147,176,151,155,149,224,151,155,163,217,198,49,212,79,204,82,198,49,204,82,190,62,198,49,190,62,181,26,114,31,101,34,108,-4,114,31,108,-4,136,-1,114,31,136,-1,127,30,101,34,90,39,108,-4,108,-4,90,39,80,47,108,-4,80,47,75,0,75,0,80,47,71,57,133,228,120,210,133,203,133,228,133,203,141,192,133,228,141,192,149,224,50,155,55,175,52,207,52,207,55,175,63,191,52,207,63,191,81,224,81,224,63,191,74,203,81,224,74,203,87,210,52,207,31,182,49,138,52,207,49,138,50,155,75,0,71,57,62,71,75,0,62,71,56,85,75,0,56,85,52,100,75,0,52,100,49,15,
+11,225,11,209,51,209,51,52,50,34,47,21,40,13,28,9,10,7,10,0,140,0,140,7,119,9,106,13,98,21,95,33,94,52,94,209,155,209,155,225,94,225,94,283,95,299,98,311,104,320,111,326,122,328,128,327,133,325,138,321,143,316,148,308,153,301,157,296,161,293,166,291,171,290,177,291,183,294,188,298,190,304,191,310,189,321,182,329,171,336,156,340,140,342,121,340,105,335,90,328,78,318,69,305,62,292,57,279,54,264,52,247,51,225,235,194,235,214,185,214,180,215,175,217,169,219,158,223,134,229,126,230,118,230,91,226,68,214,51,197,39,174,35,148,36,131,41,116,50,103,63,92,81,81,77,77,72,73,60,61,51,53,44,46,40,39,37,33,36,27,37,21,40,16,44,11,52,6,63,1,44,-13,30,-26,21,-37,16,-48,14,-59,18,-75,31,-88,49,-98,73,-105,100,-108,122,-106,144,-102,165,-96,184,-87,200,-76,211,-66,220,-56,226,-46,229,-35,230,-24,228,-6,220,7,207,18,190,26,
+57,279,54,264,95,33,95,33,54,264,52,247,95,33,52,247,51,209,51,209,52,247,51,225,51,209,51,225,11,225,78,318,95,33,94,52,94,225,94,209,155,209,94,225,155,209,155,225,133,325,140,342,128,327,128,327,140,342,122,328,111,326,122,328,121,340,111,326,121,340,105,335,94,283,95,299,90,328,90,328,95,299,98,311,90,328,98,311,105,335,105,335,98,311,104,320,105,335,104,320,111,326,90,328,78,318,94,52,90,328,94,52,94,283,189,321,182,329,183,294,189,321,183,294,188,298,189,321,188,298,190,304,189,321,190,304,191,310,166,291,171,290,171,336,171,336,171,290,177,291,171,336,177,291,182,329,182,329,177,291,183,294,148,308,153,301,156,340,156,340,153,301,157,296,156,340,157,296,171,336,171,336,157,296,161,293,171,336,161,293,166,291,143,316,148,308,156,340,143,316,156,340,140,342,143,316,140,342,138,321,140,342,121,340,122,328,140,0,140,7,119,9,140,0,119,9,106,13,140,0,106,13,50,34,140,0,50,34,47,21,140,0,47,21,40,13,140,0,40,13,28,9,140,0,28,9,10,7,140,0,10,7,10,0,95,33,78,318,69,305,95,33,69,305,62,292,95,33,62,292,57,279,51,52,50,34,106,13,51,52,106,13,98,21,51,52,98,21,95,33,51,52,95,33,51,209,51,209,11,225,11,209,140,342,133,325,138,321,
+235,194,235,214,185,214,180,215,175,217,169,219,158,223,134,229,126,230,118,230,91,226,68,214,51,197,39,174,35,148,36,131,41,116,50,103,63,92,81,81,77,77,72,73,60,61,51,53,44,46,40,39,37,33,36,27,37,21,40,16,44,11,52,6,63,1,44,-13,30,-26,21,-37,16,-48,14,-59,18,-75,31,-88,49,-98,73,-105,100,-108,122,-106,144,-102,165,-96,184,-87,200,-76,211,-66,220,-56,226,-46,229,-35,230,-24,228,-6,220,7,207,18,190,26,170,29,105,32,91,33,80,35,72,38,68,41,66,46,68,52,73,60,80,67,88,73,97,77,106,76,111,75,125,75,136,76,146,78,157,82,167,87,177,94,186,103,194,113,199,124,202,137,203,152,203,160,202,168,200,176,194,194,16383,16383,76,169,78,185,82,198,90,208,100,214,113,216,122,215,130,212,137,207,144,201,150,193,155,181,159,169,162,157,164,145,165,132,163,117,158,104,150,95,140,89,127,87,110,91,96,102,85,118,78,141,76,167,16383,16383,217,-31,212,-47,200,-60,180,-71,153,-77,122,-79,97,-78,77,-73,62,-65,52,-55,49,-43,50,-36,52,-30,56,-22,63,-13,74,0,86,-2,102,-4,138,-6,155,-6,178,-7,196,-10,208,-14,214,-21,217,-31,243,0,243,7,230,10,221,15,216,22,214,34,214,151,211,179,204,201,191,217,174,227,152,230,135,228,120,224,106,216,92,204,79,188,79,340,76,342,66,338,46,332,34,328,18,324,5,320,5,311,6,312,11,312,22,311,29,309,34,305,36,297,36,33,33,22,28,15,19,10,4,7,4,0,113,0,113,7,98,10,88,14,82,22,79,34,79,171,90,184,101,193,112,199,123,202,134,203,148,201,158,195,165,184,170,169,171,150,171,34,168,22,162,14,152,10,137,7,137,0,90,316,89,324,85,331,80,337,73,340,65,342,56,340,49,336,44,331,40,324,39,316,40,308,44,301,49,295,56,292,64,291,73,292,80,295,85,301,89,308,90,316,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,88,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,8,0,97,316,96,324,92,331,86,337,79,340,71,342,63,340,56,336,51,331,47,324,46,316,47,308,51,301,56,295,63,292,71,291,79,292,87,295,92,301,96,308,97,316,16383,16383,97,228,94,230,77,224,62,218,48,213,33,208,16,203,16,195,18,195,23,196,27,197,39,197,
+85,118,81,81,88,73,88,73,81,81,80,67,80,67,81,81,77,77,80,67,77,77,73,60,73,60,77,77,72,73,73,60,72,73,68,52,68,52,72,73,68,69,68,52,68,69,66,46,66,46,64,65,63,-13,63,-13,64,65,63,1,116,75,127,87,111,75,111,75,127,87,110,91,111,75,110,91,106,76,106,76,110,91,97,77,88,73,97,77,96,102,88,73,96,102,85,118,118,230,113,216,122,215,118,230,122,215,126,230,126,230,122,215,130,212,126,230,130,212,134,229,134,229,130,212,137,207,134,229,137,207,142,227,142,227,137,207,144,201,142,227,144,201,150,225,150,225,144,201,150,193,127,87,116,75,120,75,127,87,120,75,123,75,127,87,123,75,125,75,127,87,125,75,136,76,110,91,96,102,97,77,169,219,158,223,159,169,169,219,159,169,162,157,169,219,162,157,164,145,169,219,164,145,165,132,169,219,165,132,167,87,169,219,167,87,177,94,169,219,177,94,175,217,167,87,165,132,163,117,167,87,163,117,158,104,167,87,158,104,157,82,127,87,136,76,140,89,140,89,136,76,146,78,140,89,146,78,150,95,150,95,146,78,157,82,150,95,157,82,158,104,82,198,90,208,91,226,91,226,90,208,100,214,91,226,100,214,118,230,118,230,100,214,113,216,76,167,76,169,68,214,68,214,76,169,78,185,68,214,78,185,91,226,91,226,78,185,82,198,81,81,85,118,78,141,81,81,78,141,76,167,81,81,76,167,68,214,81,81,68,214,63,92,51,197,39,174,41,116,51,197,41,116,50,103,51,197,50,103,63,92,51,197,63,92,68,214,39,174,35,148,36,131,39,174,36,131,41,116,51,53,44,46,44,11,51,53,44,11,52,6,51,53,52,6,60,61,36,27,37,21,37,33,37,33,37,21,40,16,37,33,40,16,40,39,40,39,40,16,44,11,40,39,44,11,44,46,30,-26,31,-88,44,-13,44,-13,31,-88,49,-98,44,-13,49,-98,49,-43,49,-43,50,-36,44,-13,44,-13,50,-36,52,-30,44,-13,52,-30,63,1,63,1,52,-30,56,-22,63,1,56,-22,63,-13,74,0,72,38,68,41,74,0,68,41,66,46,74,0,66,46,63,-13,74,0,80,35,72,38,60,61,52,6,63,1,60,61,63,1,64,65,62,-65,73,-105,77,-73,77,-73,73,-105,100,-108,77,-73,100,-108,97,-78,97,-78,100,-108,122,-79,153,-77,122,-79,122,-106,153,-77,122,-106,144,-102,52,-55,49,-43,49,-98,52,-55,49,-98,73,-105,52,-55,73,-105,62,-65,21,-37,16,-48,18,-75,21,-37,18,-75,31,-88,21,-37,31,-88,30,-26,196,214,191,214,194,194,196,214,194,194,235,194,196,214,235,194,235,214,202,137,203,152,203,160,202,137,203,160,202,168,202,137,202,168,200,176,202,137,200,176,199,124,197,185,194,194,194,113,197,185,194,113,199,124,197,185,199,124,200,176,191,214,185,214,186,103,191,214,186,103,194,113,191,214,194,113,194,194,180,215,175,217,177,94,180,215,177,94,186,103,180,215,186,103,185,214,155,181,159,169,158,223,155,181,158,223,150,225,155,181,150,225,150,193,208,-14,214,-21,220,7,220,7,214,-21,217,-31,220,-56,217,-31,212,-47,138,-6,155,-6,170,29,170,29,155,-6,178,-7,170,29,178,-7,190,26,190,26,178,-7,196,-10,190,26,196,-10,207,18,207,18,196,-10,208,-14,207,18,208,-14,220,7,228,-6,220,7,220,-56,228,-6,220,-56,226,-46,228,-6,226,-46,229,-35,228,-6,229,-35,230,-24,153,-77,165,-96,180,-71,180,-71,165,-96,184,-87,180,-71,184,-87,200,-60,200,-60,184,-87,200,-76,200,-60,200,-76,212,-47,212,-47,200,-76,211,-66,212,-47,211,-66,220,-56,138,-6,170,29,120,-5,120,-5,170,29,105,32,120,-5,105,32,102,-4,102,-4,105,32,91,33,102,-4,91,33,86,-2,86,-2,91,33,80,35,86,-2,80,35,74,0,122,-79,100,-108,122,-106,153,-77,144,-102,165,-96,217,-31,220,-56,220,7,18,-75,16,-48,14,-59,64,65,66,46,68,69,
+243,0,243,7,230,10,221,15,216,22,214,34,214,151,211,179,204,201,191,217,174,227,152,230,135,228,120,224,106,216,92,204,79,188,79,340,76,342,66,338,46,332,34,328,18,324,5,320,5,311,6,312,11,312,22,311,29,309,34,305,36,297,36,33,33,22,28,15,19,10,4,7,4,0,113,0,113,7,98,10,88,14,82,22,79,34,79,171,90,184,101,193,112,199,123,202,134,203,148,201,158,195,165,184,170,169,171,150,171,34,168,22,162,14,152,10,137,7,137,0,90,316,89,324,85,331,80,337,73,340,65,342,56,340,49,336,44,331,40,324,39,316,40,308,44,301,49,295,56,292,64,291,73,292,80,295,85,301,89,308,90,316,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,88,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,8,0,97,316,96,324,92,331,86,337,79,340,71,342,63,340,56,336,51,331,47,324,46,316,47,308,51,301,56,295,63,292,
+33,22,28,15,113,0,113,0,28,15,19,10,113,0,19,10,4,7,7,312,9,312,18,324,18,324,9,312,10,312,18,324,10,312,11,312,11,312,22,311,18,324,18,324,22,311,34,328,18,324,5,320,6,312,18,324,6,312,7,312,88,14,82,22,36,51,36,51,82,22,79,34,36,51,79,34,36,286,36,297,36,286,46,332,36,297,46,332,34,328,34,328,22,311,29,309,34,328,29,309,34,305,34,328,34,305,36,297,79,188,79,340,76,342,79,188,76,342,79,51,79,51,76,342,66,338,79,51,66,338,79,34,79,34,66,338,56,335,79,34,56,335,46,332,135,228,134,203,148,201,135,228,148,201,152,230,152,230,148,201,158,195,152,230,158,195,174,227,174,227,158,195,165,184,174,227,165,184,170,169,79,171,90,184,92,204,92,204,90,184,101,193,92,204,101,193,106,216,106,216,101,193,112,199,106,216,112,199,120,224,120,224,112,199,123,202,120,224,123,202,135,228,135,228,123,202,134,203,79,51,79,171,79,188,79,188,79,171,92,204,168,22,162,14,243,0,243,0,162,14,152,10,243,0,152,10,137,7,174,227,170,169,171,150,216,22,171,150,171,51,216,22,171,51,221,15,221,15,171,51,171,34,221,15,171,34,243,0,243,0,171,34,168,22,214,51,214,151,211,179,214,51,211,179,204,201,214,51,204,201,214,34,230,10,221,15,243,0,230,10,243,0,243,7,171,150,216,22,174,227,174,227,216,22,214,34,174,227,214,34,191,217,191,217,214,34,204,201,113,0,113,7,98,10,113,0,98,10,88,14,113,0,88,14,36,33,113,0,36,33,33,22,113,0,4,7,4,0,36,33,88,14,36,51,36,286,79,34,46,332,243,0,137,7,137,0,6,312,5,320,5,311,
+90,316,89,324,85,331,80,337,73,340,65,342,56,340,49,336,44,331,40,324,39,316,40,308,44,301,49,295,56,292,64,291,73,292,80,295,85,301,89,308,90,316,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,88,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,8,0,97,316,96,324,92,331,86,337,79,340,71,342,63,340,56,336,51,331,47,324,46,316,47,308,51,301,56,295,63,292,71,291,79,292,87,295,92,301,96,308,97,316,16383,16383,97,228,94,230,77,224,62,218,48,213,33,208,16,203,16,195,18,195,23,196,27,197,39,197,45,196,49,193,52,187,54,178,55,167,55,-21,54,-41,54,-56,52,-67,50,-76,47,-82,
+39,316,40,308,40,324,40,324,40,308,44,301,40,324,44,301,44,331,44,331,44,301,49,295,44,331,49,295,49,336,49,336,49,295,56,292,49,336,56,292,56,340,56,340,56,292,64,291,56,340,64,291,65,342,65,342,64,291,73,292,65,342,73,292,73,340,73,340,73,292,80,295,73,340,80,295,80,337,80,337,80,295,85,301,80,337,85,301,85,331,85,331,85,301,89,308,85,331,89,308,89,324,89,324,89,308,90,316,43,20,37,13,127,0,127,0,37,13,25,9,127,0,25,9,8,7,20,197,24,197,88,230,88,230,24,197,28,197,88,230,28,197,31,197,31,197,38,196,88,230,88,230,38,196,42,193,88,230,42,193,45,187,43,20,127,0,47,33,47,33,127,0,99,14,47,33,99,14,47,52,47,52,99,14,93,21,47,52,93,21,47,166,47,178,47,166,88,230,47,178,88,230,45,187,15,196,20,197,88,230,15,196,88,230,10,203,15,196,10,203,10,195,89,52,89,228,88,230,89,52,88,230,47,166,89,52,47,166,90,34,110,9,99,14,127,0,110,9,127,0,127,7,127,0,8,7,8,0,47,166,93,21,90,34,
+97,316,96,324,92,331,86,337,79,340,71,342,63,340,56,336,51,331,47,324,46,316,47,308,51,301,56,295,63,292,71,291,79,292,87,295,92,301,96,308,97,316,16383,16383,97,228,94,230,77,224,62,218,48,213,33,208,16,203,16,195,18,195,23,196,27,197,39,197,45,196,49,193,52,187,54,178,55,167,55,-21,54,-41,54,-56,52,-67,50,-76,47,-82,45,-85,39,-89,35,-91,26,-91,18,-87,14,-83,4,-71,0,-66,-4,-63,-9,-61,-14,-61,-20,-62,-26,-65,-30,-69,-33,-74,-34,-80,-32,-90,-26,-97,-16,-103,-3,-107,12,-108,42,-103,65,-90,83,-68,93,-38,97,0,252,0,252,7,240,9,228,13,217,20,206,30,194,44,118,141,132,155,164,183,188,201,206,212,222,217,240,218,240,225,138,225,138,218,148,218,155,217,160,215,162,212,163,209,161,203,155,195,151,191,83,131,83,340,81,342,70,338,48,332,35,328,18,324,3,320,3,311,7,312,17,312,20,313,28,312,34,309,38,303,40,294,41,282,41,41,40,28,38,20,32,14,21,11,3,7,3,0,121,0,121,7,110,8,100,9,92,12,87,17,84,24,83,33,83,126,158,26,160,24,162,21,163,19,163,17,164,15,163,13,162,10,153,7,143,7,143,0,128,0,128,7,
+86,337,87,295,92,331,92,331,87,295,92,301,92,331,92,301,96,324,96,324,92,301,96,308,96,324,96,308,97,316,46,316,47,308,47,324,47,324,47,308,51,301,47,324,51,301,51,331,51,331,51,301,56,295,51,331,56,295,56,336,56,336,56,295,63,292,56,336,63,292,63,340,63,340,63,292,71,291,63,340,71,291,71,342,71,342,71,291,79,292,71,342,79,292,79,340,79,340,79,292,87,295,79,340,87,295,86,337,18,195,23,196,33,208,18,195,33,208,16,203,18,195,16,203,16,195,42,-87,39,-89,42,-103,42,-103,39,-89,35,-91,42,-103,35,-91,31,-91,31,-91,26,-91,42,-103,42,-103,26,-91,22,-89,42,-103,22,-89,18,-87,52,187,62,218,49,193,49,193,62,218,48,213,49,193,48,213,45,196,45,196,48,213,39,197,35,197,39,197,48,213,35,197,48,213,33,208,54,-56,52,-67,65,-90,65,-90,52,-67,50,-76,65,-90,50,-76,47,-82,47,-82,45,-85,65,-90,65,-90,45,-85,42,-87,65,-90,42,-87,42,-103,93,-38,94,230,83,-68,83,-68,94,230,77,224,83,-68,77,224,65,-90,65,-90,77,224,62,218,65,-90,62,218,55,167,55,167,62,218,54,178,33,208,23,196,27,197,33,208,27,197,32,197,33,208,32,197,35,197,97,0,97,228,94,230,97,0,94,230,93,-38,65,-90,55,167,55,-21,65,-90,55,-21,54,-41,65,-90,54,-41,54,-56,12,-108,42,-103,18,-87,12,-108,18,-87,14,-83,12,-108,14,-83,9,-77,12,-108,9,-77,4,-71,12,-108,4,-71,0,-66,12,-108,0,-66,-3,-107,-3,-107,0,-66,-4,-63,-3,-107,-4,-63,-9,-61,-3,-107,-9,-61,-14,-61,-3,-107,-14,-61,-16,-103,-20,-62,-26,-65,-26,-97,-20,-62,-26,-97,-16,-103,-20,-62,-16,-103,-14,-61,-30,-69,-33,-74,-32,-90,-30,-69,-32,-90,-26,-97,-30,-69,-26,-97,-26,-65,-32,-90,-33,-74,-34,-80,62,218,52,187,54,178,
+252,0,252,7,240,9,228,13,217,20,206,30,194,44,118,141,132,155,164,183,188,201,206,212,222,217,240,218,240,225,138,225,138,218,148,218,155,217,160,215,162,212,163,209,161,203,155,195,151,191,83,131,83,340,81,342,70,338,48,332,35,328,18,324,3,320,3,311,7,312,17,312,20,313,28,312,34,309,38,303,40,294,41,282,41,41,40,28,38,20,32,14,21,11,3,7,3,0,121,0,121,7,110,8,100,9,92,12,87,17,84,24,83,33,83,126,158,26,160,24,162,21,163,19,163,17,164,15,163,13,162,10,153,7,143,7,143,0,128,0,128,7,112,9,101,13,95,20,92,29,91,44,91,339,89,342,74,337,59,333,45,329,28,324,9,320,9,311,14,312,25,312,28,313,36,311,42,308,46,302,48,293,49,281,49,46,48,32,45,21,38,14,27,10,11,7,11,0,387,0,387,7,374,8,366,10,360,13,356,19,354,27,353,39,353,140,351,172,344,197,333,215,317,226,295,230,278,228,262,224,246,215,230,204,214,188,207,203,199,215,188,223,176,228,161,230,147,229,133,226,119,220,103,208,84,191,83,191,83,228,79,230,51,220,25,212,9,208,9,199,13,200,16,200,19,201,
+38,20,32,14,121,0,121,0,32,14,21,11,121,0,21,11,3,7,10,312,14,312,18,324,18,324,14,312,17,312,18,324,17,312,20,313,20,313,28,312,35,328,35,328,28,312,34,309,35,328,34,309,38,303,7,312,10,312,18,324,7,312,18,324,3,320,7,312,3,320,3,311,194,44,118,141,158,26,158,26,118,141,83,131,158,26,83,131,83,126,84,24,83,33,48,332,84,24,48,332,41,282,41,282,48,332,40,294,48,332,35,328,38,303,48,332,38,303,40,294,35,328,18,324,20,313,83,33,83,340,81,342,83,33,81,342,70,338,83,33,70,338,59,335,83,33,59,335,48,332,151,191,118,141,132,155,151,191,132,155,164,183,151,191,83,131,118,141,161,203,158,199,164,183,164,183,158,199,155,195,164,183,155,195,151,191,240,225,138,225,148,218,240,225,148,218,155,217,240,225,155,217,160,215,240,225,160,215,162,212,240,225,162,212,163,209,240,225,163,209,206,212,240,225,206,212,222,217,240,225,222,217,240,218,163,209,164,183,188,201,163,209,188,201,206,212,164,183,163,209,162,206,164,183,162,206,161,203,162,10,159,9,252,0,252,0,159,9,156,8,252,0,156,8,153,7,164,15,252,0,228,13,164,15,228,13,217,20,164,15,217,20,206,30,164,15,206,30,194,44,164,15,194,44,163,17,194,44,158,26,160,24,194,44,160,24,162,21,194,44,162,21,163,19,194,44,163,19,163,17,240,9,228,13,252,0,240,9,252,0,252,7,163,13,162,10,252,0,163,13,252,0,164,15,143,7,143,0,252,0,143,7,252,0,153,7,121,0,121,7,110,8,121,0,110,8,100,9,121,0,100,9,92,12,121,0,92,12,40,28,121,0,40,28,38,20,92,12,87,17,41,41,41,41,87,17,84,24,41,41,84,24,41,282,121,0,3,7,3,0,40,28,92,12,41,41,148,218,138,225,138,218,
+128,0,128,7,112,9,101,13,95,20,92,29,91,44,91,339,89,342,74,337,59,333,45,329,28,324,9,320,9,311,14,312,25,312,28,313,36,311,42,308,46,302,48,293,49,281,49,46,48,32,45,21,38,14,27,10,11,7,11,0,387,0,387,7,374,8,366,10,360,13,356,19,354,27,353,39,353,140,351,172,344,197,333,215,317,226,295,230,278,228,262,224,246,215,230,204,214,188,207,203,199,215,188,223,176,228,161,230,147,229,133,226,119,220,103,208,84,191,83,191,
+45,21,38,14,128,0,128,0,38,14,27,10,128,0,27,10,11,7,18,312,22,312,28,324,28,324,22,312,25,312,28,324,25,312,28,313,28,313,36,311,28,324,28,324,36,311,45,329,28,324,9,320,14,312,28,324,14,312,18,312,36,311,42,308,45,329,45,329,42,308,46,302,45,329,46,302,59,333,59,333,46,302,48,293,59,333,48,293,49,281,92,29,49,281,49,46,92,29,49,46,95,20,95,20,49,46,101,13,91,44,91,339,89,342,91,44,89,342,74,337,91,44,74,337,59,333,91,44,59,333,92,29,128,0,128,7,112,9,128,0,112,9,101,13,128,0,101,13,48,32,128,0,48,32,45,21,14,312,9,320,9,311,128,0,11,7,11,0,48,32,101,13,49,46,49,281,92,29,59,333,
+387,0,387,7,374,8,366,10,360,13,356,19,354,27,353,39,353,140,351,172,344,197,333,215,317,226,295,230,278,228,262,224,246,215,230,204,214,188,207,203,199,215,188,223,176,228,161,230,147,229,133,226,119,220,103,208,84,191,83,191,83,228,79,230,51,220,25,212,9,208,9,199,13,200,16,200,19,201,26,201,32,200,37,196,41,190,42,181,43,168,43,44,42,29,39,19,32,12,22,9,8,7,8,0,119,0,119,7,105,8,96,11,89,16,86,24,85,35,85,175,99,189,109,195,121,200,133,203,145,204,156,202,165,195,172,183,176,168,177,148,177,43,176,28,173,18,167,12,157,9,143,7,143,0,255,0,255,7,240,9,230,12,223,19,220,31,219,47,219,174,228,185,237,194,248,200,259,203,272,204,287,202,298,196,305,185,310,169,311,148,311,45,310,30,307,20,302,14,293,10,278,7,278,0,243,0,243,7,230,9,221,13,216,19,213,29,212,42,212,153,210,180,202,201,190,217,174,227,153,230,139,229,125,224,111,216,96,205,81,190,80,190,80,228,76,230,50,220,37,216,23,212,8,208,8,199,10,200,13,200,16,201,22,201,30,200,35,197,38,191,40,181,40,47,39,32,37,21,31,14,22,9,9,7,9,0,114,0,114,7,101,9,92,13,86,18,83,26,82,36,82,174,95,186,105,194,115,199,124,202,133,203,147,201,157,195,164,185,169,171,170,152,170,52,169,35,166,23,161,15,152,10,139,7,138,0,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,
+16,200,19,201,25,212,25,212,19,201,22,201,25,212,22,201,26,201,26,201,32,200,38,216,38,216,32,200,37,196,38,216,37,196,41,190,25,212,9,208,13,200,25,212,13,200,16,200,38,216,41,190,51,220,51,220,41,190,42,181,51,220,42,181,43,168,86,24,43,168,43,44,86,24,43,44,89,16,89,16,43,44,96,11,38,216,25,212,26,201,83,228,79,230,83,191,83,191,79,230,85,35,83,191,85,35,84,191,84,191,85,35,85,174,84,191,85,174,85,175,173,18,167,12,255,0,255,0,167,12,157,9,255,0,157,9,143,7,161,230,147,229,156,202,156,202,147,229,145,204,133,203,145,204,133,226,133,203,133,226,121,200,121,200,133,226,119,220,121,200,119,220,109,195,109,195,119,220,103,208,109,195,103,208,99,189,99,189,103,208,92,182,103,208,84,191,85,175,103,208,85,175,86,176,103,208,86,176,88,178,103,208,88,178,90,180,103,208,90,180,92,182,85,35,79,230,65,225,85,35,65,225,86,24,147,229,133,226,145,204,173,18,255,0,176,28,176,28,255,0,230,12,176,28,230,12,177,43,177,43,230,12,223,19,177,43,223,19,177,148,176,228,177,148,188,223,176,228,161,230,165,195,176,228,165,195,172,183,176,228,172,183,176,168,176,228,176,168,177,148,207,203,199,215,220,31,207,203,220,31,219,47,207,203,219,47,214,188,219,174,228,185,230,204,230,204,228,185,237,194,230,204,237,194,246,215,246,215,237,194,248,200,246,215,248,200,262,224,262,224,248,200,259,203,262,224,259,203,272,204,272,204,287,202,278,228,278,228,287,202,295,230,219,47,219,174,214,188,214,188,219,174,230,204,278,228,262,224,272,204,307,20,302,14,387,0,387,0,302,14,293,10,387,0,293,10,278,7,298,196,305,185,317,226,317,226,305,185,310,169,317,226,310,169,311,148,356,19,311,148,311,45,356,19,311,45,360,13,360,13,311,45,310,30,360,13,310,30,366,10,366,10,310,30,387,0,366,10,387,0,374,8,374,8,387,0,387,7,295,230,287,202,298,196,295,230,298,196,317,226,353,39,353,140,351,172,353,39,351,172,344,197,353,39,344,197,333,215,353,39,333,215,354,27,354,27,333,215,317,226,354,27,317,226,311,148,354,27,311,148,356,19,240,9,230,12,255,0,240,9,255,0,255,7,220,31,199,215,188,223,220,31,188,223,177,148,220,31,177,148,223,19,119,0,119,7,105,8,119,0,105,8,96,11,119,0,96,11,42,29,119,0,42,29,39,19,119,0,39,19,32,12,119,0,32,12,22,9,119,0,22,9,8,7,119,0,8,7,8,0,51,220,43,168,86,24,51,220,86,24,65,225,13,200,9,208,9,199,42,29,96,11,43,44,255,0,143,7,143,0,387,0,278,7,278,0,307,20,387,0,310,30,161,230,156,202,165,195,
+243,0,243,7,230,9,221,13,216,19,213,29,212,42,212,153,210,180,202,201,190,217,174,227,153,230,139,229,125,224,111,216,96,205,81,190,80,190,80,228,76,230,50,220,37,216,23,212,8,208,8,199,10,200,13,200,16,201,22,201,30,200,35,197,38,191,40,181,40,47,39,32,37,21,31,14,22,9,9,7,9,0,114,0,114,7,101,9,92,13,86,18,83,26,82,36,82,174,95,186,105,194,115,199,124,202,133,203,147,201,157,195,164,185,169,171,170,152,170,52,169,35,166,23,161,15,152,10,139,7,138,0,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,79,229,76,230,62,224,20,209,4,204,4,196,7,197,17,197,26,196,31,194,35,189,37,180,37,-78,
+37,21,31,14,114,0,114,0,31,14,22,9,114,0,22,9,9,7,13,200,16,201,23,212,23,212,16,201,19,201,23,212,19,201,22,201,22,201,30,200,23,212,23,212,30,200,37,216,23,212,8,208,10,200,23,212,10,200,13,200,30,200,35,197,37,216,37,216,35,197,38,191,37,216,38,191,50,220,50,220,38,191,40,181,50,220,40,181,40,169,83,26,40,169,40,47,83,26,40,47,86,18,86,18,40,47,92,13,80,228,76,230,80,190,80,190,76,230,82,36,80,190,82,36,81,190,81,190,82,36,82,174,81,190,82,174,96,205,96,205,82,174,95,186,96,205,95,186,105,194,96,205,105,194,111,216,111,216,105,194,115,199,111,216,115,199,125,224,125,224,115,199,124,202,125,224,124,202,133,203,133,203,147,201,139,229,139,229,147,201,153,230,82,36,76,230,63,225,82,36,63,225,83,26,139,229,125,224,133,203,166,23,161,15,243,0,243,0,161,15,152,10,243,0,152,10,139,7,157,195,164,185,174,227,174,227,164,185,169,171,174,227,169,171,170,152,216,19,170,152,170,52,216,19,170,52,221,13,221,13,170,52,169,35,221,13,169,35,243,0,243,0,169,35,166,23,153,230,147,201,157,195,153,230,157,195,174,227,212,42,212,153,210,180,212,42,210,180,202,201,212,42,202,201,213,29,230,9,221,13,243,0,230,9,243,0,243,7,213,29,202,201,190,217,213,29,190,217,174,227,213,29,174,227,170,152,213,29,170,152,216,19,114,0,114,7,101,9,114,0,101,9,92,13,114,0,92,13,39,32,114,0,39,32,37,21,50,220,40,169,83,26,50,220,83,26,63,225,10,200,8,208,8,199,114,0,9,7,9,0,39,32,92,13,40,47,243,0,139,7,138,0,
+235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,79,229,76,230,62,224,20,209,4,204,4,196,7,197,17,197,26,196,31,194,35,189,37,180,37,-78,34,-87,27,-93,17,-97,2,-99,2,-107,123,-107,123,-98,104,-97,92,-94,84,-88,80,-77,79,-61,79,17,90,8,99,2,108,-1,118,-3,130,-4,164,1,193,19,215,47,230,82,235,123,231,158,219,188,202,210,179,225,151,230,135,228,120,224,106,216,93,205,79,190,16383,16383,79,167,82,176,91,185,103,193,116,198,131,200,
+64,91,58,17,69,70,69,70,58,17,88,1,69,70,88,1,76,51,76,51,88,1,86,34,93,25,86,34,88,1,93,25,88,1,123,-4,162,225,127,230,130,215,130,215,127,230,118,216,98,212,118,216,127,230,98,212,127,230,90,225,187,70,180,44,191,17,191,17,180,44,168,25,191,17,168,25,160,1,160,1,168,25,151,13,160,1,151,13,131,9,131,9,120,10,123,-4,123,-4,120,10,110,13,123,-4,110,13,101,18,140,211,149,206,162,225,162,225,149,206,158,199,162,225,158,199,165,191,165,191,174,177,191,210,191,210,174,177,181,161,191,210,181,161,186,142,230,154,215,186,215,43,230,154,215,43,230,76,230,154,230,76,235,116,187,70,191,17,190,102,190,102,191,17,191,210,191,210,191,17,215,43,191,210,215,43,215,186,191,210,186,142,189,122,191,210,189,122,190,102,191,210,162,225,165,191,131,9,123,-4,160,1,58,17,61,113,60,137,60,137,62,164,58,209,58,209,62,164,70,186,58,209,70,186,90,225,90,225,70,186,82,202,90,225,82,202,98,212,58,17,60,137,58,209,58,17,58,209,35,42,35,42,58,209,35,185,35,42,35,185,20,75,20,75,35,185,20,153,20,75,20,153,15,114,61,113,58,17,64,91,162,225,130,215,140,211,93,25,123,-4,101,18,
+79,229,76,230,62,224,20,209,4,204,4,196,7,197,17,197,26,196,31,194,35,189,37,180,37,-78,34,-87,27,-93,17,-97,2,-99,2,-107,123,-107,123,-98,104,-97,92,-94,84,-88,80,-77,79,-61,79,17,90,8,99,2,108,-1,118,-3,130,-4,164,1,193,19,215,47,230,82,235,123,231,158,219,188,202,210,179,225,151,230,135,228,120,224,106,216,93,205,79,190,16383,16383,79,167,82,176,91,185,103,193,116,198,131,200,151,195,168,183,181,163,189,136,192,103,189,73,181,47,168,28,152,15,132,11,117,13,103,18,91,26,82,35,79,44,244,-107,244,-99,231,-97,222,-93,216,-88,213,-80,213,228,207,228,180,213,167,220,155,224,144,228,122,230,87,224,57,206,33,179,18,144,12,103,16,67,27,38,44,15,66,0,92,-4,109,-2,126,1,142,8,157,19,171,32,171,-61,169,-75,165,-86,157,-93,144,-97,126,-99,126,-107,16383,16383,171,64,170,57,170,52,168,47,167,44,165,41,149,31,140,28,130,26,112,26,96,30,89,34,83,39,74,50,66,64,60,81,56,100,55,121,58,153,67,179,81,199,100,211,124,215,141,214,154,208,163,198,169,184,171,166,80,229,78,230,62,224,48,219,
+34,-87,27,-93,123,-107,123,-107,27,-93,17,-97,123,-107,17,-97,2,-99,9,197,12,197,20,209,20,209,12,197,14,197,20,209,14,197,17,197,17,197,26,196,20,209,20,209,26,196,34,214,20,209,4,204,7,197,20,209,7,197,9,197,82,35,79,44,90,8,90,8,79,44,79,17,80,-77,79,-61,48,219,80,-77,48,219,37,169,37,169,48,219,37,180,26,196,31,194,34,214,34,214,31,194,35,189,34,214,35,189,48,219,48,219,35,189,37,180,79,190,79,229,76,230,79,190,76,230,79,-61,79,190,79,-61,79,167,79,190,79,167,82,176,79,190,82,176,93,205,235,123,231,158,230,82,230,82,231,158,219,188,230,82,219,188,215,47,215,47,219,188,202,210,215,47,202,210,193,19,193,19,202,210,192,103,193,19,192,103,189,73,193,19,189,73,181,47,202,210,179,225,181,163,202,210,181,163,189,136,202,210,189,136,192,103,135,228,131,200,151,195,135,228,151,195,151,230,151,230,151,195,168,183,151,230,168,183,179,225,179,225,168,183,181,163,108,-1,118,-3,117,13,117,13,118,-3,132,11,152,15,132,11,164,1,152,15,164,1,168,28,168,28,164,1,193,19,168,28,193,19,181,47,132,11,118,-3,130,-4,132,11,130,-4,164,1,123,-107,123,-98,104,-97,123,-107,104,-97,92,-94,123,-107,92,-94,37,-78,123,-107,37,-78,34,-87,62,224,48,219,79,-61,62,224,79,-61,76,230,92,-94,84,-88,37,-64,37,-64,84,-88,80,-77,37,-64,80,-77,37,169,82,176,91,185,93,205,93,205,91,185,103,193,93,205,103,193,106,216,106,216,103,193,116,198,106,216,116,198,120,224,120,224,116,198,131,200,120,224,131,200,135,228,82,35,90,8,91,26,91,26,90,8,99,2,91,26,99,2,103,18,103,18,99,2,108,-1,103,18,108,-1,117,13,7,197,4,204,4,196,123,-107,2,-99,2,-107,37,-78,92,-94,37,-64,
+244,-107,244,-99,231,-97,222,-93,216,-88,213,-80,213,228,207,228,180,213,167,220,155,224,144,228,122,230,87,224,57,206,33,179,18,144,12,103,16,67,27,38,44,15,66,0,92,-4,109,-2,126,1,142,8,157,19,171,32,171,-61,169,-75,165,-86,157,-93,144,-97,126,-99,126,-107,16383,16383,171,64,170,57,170,52,168,47,167,44,165,41,149,31,140,28,130,26,112,26,96,30,89,34,83,39,74,50,66,64,60,81,56,100,55,121,58,153,67,179,81,199,100,211,124,215,141,214,154,208,163,198,169,184,171,166,80,229,78,230,62,224,48,219,35,214,20,209,3,203,3,195,7,196,11,196,14,197,21,197,28,196,32,193,36,187,37,179,38,167,38,42,37,29,35,21,29,15,18,11,2,7,2,0,123,0,123,7,105,9,93,13,85,20,81,30,80,45,80,157,82,168,88,179,97,189,106,196,115,199,119,197,122,196,125,194,128,191,133,187,137,184,141,182,144,181,148,181,155,182,160,185,164,190,167,196,167,204,166,213,163,220,157,225,149,229,140,230,128,228,117,224,106,215,94,202,80,183,78,151,71,156,64,163,
+112,26,104,28,109,-2,109,-2,104,28,96,30,109,-2,96,30,92,-4,92,-4,96,30,89,34,92,-4,89,34,83,39,83,39,74,50,92,-4,92,-4,74,50,66,64,92,-4,66,64,66,0,66,0,66,64,60,81,66,0,60,81,56,100,109,-2,126,1,112,26,112,26,126,1,121,26,130,26,121,26,126,1,130,26,126,1,142,8,133,229,124,215,141,214,133,229,141,214,144,228,144,228,141,214,154,208,144,228,154,208,155,224,155,224,154,208,163,198,155,224,163,198,167,220,167,220,163,198,169,184,167,220,169,184,180,213,180,213,169,184,171,166,180,213,171,166,171,32,171,32,171,166,171,64,67,179,81,199,87,224,87,224,81,199,100,211,87,224,100,211,122,230,122,230,100,211,124,215,122,230,124,215,133,229,57,206,33,179,44,15,57,206,44,15,55,121,57,206,55,121,58,153,57,206,58,153,67,179,57,206,67,179,87,224,55,121,44,15,56,100,12,103,16,67,18,144,18,144,16,67,27,38,18,144,27,38,33,179,33,179,27,38,44,15,165,-86,157,-93,244,-107,244,-107,157,-93,144,-97,244,-107,144,-97,126,-99,170,52,168,47,171,32,171,32,168,47,167,44,171,32,167,44,165,41,165,41,157,36,171,32,171,32,157,36,157,19,170,57,170,52,171,32,170,57,171,32,171,64,149,31,140,28,142,8,149,31,142,8,157,19,149,31,157,19,157,36,213,-69,213,228,207,228,213,-69,207,228,180,213,213,-69,180,213,213,-80,244,-107,244,-99,231,-97,244,-107,231,-97,222,-93,244,-107,222,-93,169,-75,244,-107,169,-75,165,-86,171,32,216,-88,213,-80,171,32,213,-80,180,213,171,-61,169,-75,222,-93,171,-61,222,-93,216,-88,171,-61,216,-88,171,32,244,-107,126,-99,126,-107,56,100,44,15,66,0,130,26,142,8,140,28,
+80,229,78,230,62,224,48,219,35,214,20,209,3,203,3,195,7,196,11,196,14,197,21,197,28,196,32,193,36,187,37,179,38,167,38,42,37,29,35,21,29,15,18,11,2,7,2,0,123,0,123,7,105,9,93,13,85,20,81,30,80,45,80,157,82,168,88,179,97,189,106,196,115,199,119,197,122,196,125,194,128,191,133,187,137,184,141,182,144,181,148,181,155,182,160,185,164,190,167,196,167,204,166,213,163,220,157,225,149,229,140,230,128,228,117,224,106,215,94,202,80,183,78,151,71,156,64,163,60,170,57,178,56,185,58,197,63,207,71,214,82,217,94,219,110,217,123,210,134,198,143,181,151,157,158,157,156,225,150,225,145,220,140,220,137,221,134,221,131,223,122,226,115,228,109,229,94,229,72,227,53,219,38,207,29,190,26,168,28,153,35,138,47,123,63,109,85,95,113,80,129,68,134,60,138,52,139,43,137,31,132,21,123,13,112,8,98,6,79,9,63,17,51,31,41,50,34,76,26,76,26,-1,32,-1,34,0,36,2,39,3,41,4,48,4,
+11,196,14,197,20,209,20,209,14,197,18,197,20,209,18,197,21,197,21,197,28,196,35,214,35,214,28,196,32,193,35,214,32,193,36,187,20,209,3,203,7,196,20,209,7,196,11,196,80,183,80,229,78,230,80,183,78,230,80,45,80,45,78,230,62,224,80,45,62,224,81,30,81,30,62,224,48,219,81,30,48,219,38,167,38,167,48,219,37,179,48,219,35,214,36,187,48,219,36,187,37,179,35,214,20,209,21,197,122,196,128,228,119,197,119,197,128,228,117,224,119,197,117,224,117,198,117,198,117,224,115,199,106,196,115,199,117,224,106,196,117,224,106,215,137,184,140,230,133,187,133,187,140,230,128,228,133,187,128,228,128,191,128,191,128,228,125,194,144,181,148,181,149,229,149,229,148,181,155,182,149,229,155,182,157,225,157,225,155,182,160,185,157,225,160,185,163,220,163,220,160,185,164,190,163,220,164,190,166,213,166,213,164,190,167,196,166,213,167,196,167,204,141,182,144,181,149,229,141,182,149,229,140,230,141,182,140,230,137,184,82,168,88,179,94,202,94,202,88,179,97,189,94,202,97,189,106,215,106,215,97,189,106,196,80,45,80,157,80,183,80,183,80,157,82,168,80,183,82,168,94,202,123,0,123,7,105,9,123,0,105,9,93,13,123,0,93,13,37,29,123,0,37,29,35,21,123,0,35,21,29,15,123,0,29,15,18,11,123,0,18,11,2,7,123,0,2,7,2,0,93,13,85,20,38,42,38,42,85,20,81,30,38,42,81,30,38,167,7,196,3,203,3,195,37,29,93,13,38,42,128,228,122,196,125,194,
+78,151,71,156,64,163,60,170,57,178,56,185,58,197,63,207,71,214,82,217,94,219,110,217,123,210,134,198,143,181,151,157,158,157,156,225,150,225,145,220,140,220,137,221,134,221,131,223,122,226,115,228,109,229,94,229,72,227,53,219,38,207,29,190,26,168,28,153,35,138,47,123,63,109,85,95,113,80,129,68,134,60,138,52,139,43,137,31,132,21,123,13,112,8,98,6,79,9,63,17,51,31,41,50,34,76,26,76,26,-1,32,-1,34,0,36,2,39,3,41,4,48,4,52,3,56,3,61,1,68,0,75,-2,82,-3,90,-4,104,-4,126,-1,145,7,160,21,170,38,174,57,173,73,168,86,159,97,147,108,130,119,133,39,127,32,121,27,115,24,109,22,103,21,93,23,86,28,81,36,78,49,77,66,77,209,127,209,127,225,77,225,77,286,76,287,76,289,75,289,74,290,72,287,69,284,65,278,64,276,53,260,42,247,32,236,23,228,15,222,12,220,8,216,7,214,7,210,8,210,8,209,35,209,35,59,37,36,42,18,51,5,64,-1,79,-4,93,-3,106,1,118,8,129,19,140,33,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,
+36,2,39,3,41,50,41,50,39,3,41,4,41,50,41,4,45,4,45,4,48,4,51,31,51,31,48,4,52,3,51,31,52,3,63,17,63,17,52,3,56,3,63,17,56,3,61,1,36,2,41,50,34,0,34,0,41,50,34,76,34,0,34,76,32,-1,32,-1,34,76,26,76,32,-1,26,76,26,-1,72,227,53,219,58,197,58,197,53,219,56,185,63,109,56,185,53,219,63,109,53,219,47,123,47,123,53,219,38,207,47,123,38,207,35,138,35,138,38,207,29,190,35,138,29,190,28,153,28,153,29,190,26,168,102,229,94,229,110,217,110,217,94,229,94,219,82,217,94,219,94,229,82,217,94,229,72,227,137,221,134,221,134,198,134,198,134,221,131,223,134,198,131,223,128,224,128,224,122,226,123,210,123,210,122,226,115,228,123,210,115,228,110,217,110,217,115,228,109,229,110,217,109,229,102,229,148,223,146,221,151,157,151,157,146,221,145,220,151,157,145,220,143,181,143,181,145,220,143,220,143,181,143,220,142,220,142,220,140,220,143,181,143,181,140,220,137,221,143,181,137,221,134,198,151,157,158,157,156,225,151,157,156,225,150,225,151,157,150,225,148,223,128,224,123,210,134,198,174,57,173,73,170,38,170,38,173,73,168,86,170,38,168,86,160,21,160,21,168,86,159,97,160,21,159,97,147,108,123,13,126,-1,132,21,132,21,126,-1,145,7,132,21,145,7,137,31,137,31,145,7,139,43,147,108,139,43,145,7,147,108,145,7,160,21,121,74,129,68,130,119,130,119,129,68,134,60,130,119,134,60,147,108,147,108,134,60,138,52,147,108,138,52,139,43,130,119,78,151,85,95,130,119,85,95,113,80,130,119,113,80,121,74,78,151,71,156,85,95,85,95,71,156,64,163,85,95,64,163,63,109,63,109,64,163,60,170,63,109,60,170,57,178,98,6,104,-4,112,8,112,8,104,-4,126,-1,112,8,126,-1,123,13,72,227,58,197,63,207,72,227,63,207,71,214,72,227,71,214,82,217,98,6,79,9,82,-3,98,6,82,-3,90,-4,98,6,90,-4,97,-4,98,6,97,-4,104,-4,79,9,63,17,68,0,79,9,68,0,75,-2,79,9,75,-2,82,-3,68,0,63,17,61,1,51,31,41,50,45,4,56,185,63,109,57,178,
+133,39,127,32,121,27,115,24,109,22,103,21,93,23,86,28,81,36,78,49,77,66,77,209,127,209,127,225,77,225,77,286,76,287,76,289,75,289,74,290,72,287,69,284,65,278,64,276,53,260,42,247,32,236,23,228,15,222,12,220,8,216,7,214,7,210,8,210,8,209,35,209,35,59,37,36,42,18,51,5,64,-1,79,-4,93,-3,106,1,118,8,129,19,140,33,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,
+42,247,32,236,35,209,35,209,32,236,23,228,35,209,23,228,15,222,53,260,42,247,42,18,53,260,42,18,51,5,53,260,51,5,64,-1,53,260,64,-1,64,276,37,36,42,18,42,247,37,36,42,247,35,209,37,36,35,209,35,59,7,210,8,210,8,216,8,216,8,210,8,209,8,216,8,209,10,218,10,218,8,209,35,209,10,218,35,209,12,220,12,220,35,209,15,222,7,214,7,213,7,212,7,214,7,212,7,211,7,214,7,211,7,210,7,214,7,210,8,216,69,284,79,-4,77,66,77,225,77,209,127,209,77,225,127,209,127,225,77,66,77,283,77,286,77,66,77,286,76,287,77,66,76,287,76,289,77,66,76,289,75,289,77,66,75,289,74,290,77,66,74,290,72,287,77,66,72,287,69,284,86,28,93,-3,93,23,93,23,93,-3,103,21,109,22,103,21,106,1,109,22,106,1,118,8,81,36,78,49,79,-4,81,36,79,-4,93,-3,81,36,93,-3,86,28,79,-4,69,284,67,281,79,-4,67,281,65,278,79,-4,65,278,64,276,79,-4,64,276,64,-1,129,19,140,33,133,39,129,19,133,39,127,32,129,19,127,32,121,27,129,19,121,27,118,8,115,24,109,22,118,8,115,24,118,8,121,27,103,21,93,-3,106,1,77,66,79,-4,78,49,
+240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,238,225,169,225,169,218,178,216,184,214,189,211,192,207,193,201,192,198,192,195,191,192,191,189,190,186,140,57,89,185,87,190,86,194,85,197,84,201,84,204,85,209,88,212,92,215,99,216,108,218,108,225,9,225,9,218,19,216,27,212,35,202,44,186,55,160,115,17,116,14,118,10,118,8,119,6,121,1,123,-1,125,-4,126,-6,128,-6,130,-5,132,-3,135,1,138,8,142,18,206,179,213,195,219,206,224,213,231,216,238,218,
+78,225,4,225,17,216,78,225,17,216,26,213,78,225,26,213,32,207,78,225,32,207,35,197,78,225,35,197,36,185,78,225,36,185,38,38,78,225,38,38,46,20,78,225,46,20,58,6,78,225,58,6,75,-1,78,225,75,-1,78,64,164,53,162,48,168,38,168,38,162,48,159,43,168,38,159,43,155,40,155,40,147,34,153,21,153,21,147,34,139,29,153,21,139,29,138,8,138,8,139,29,130,26,138,8,130,26,123,0,123,0,130,26,121,25,123,0,121,25,113,24,113,24,102,26,109,-3,109,-3,102,26,97,-4,97,-4,102,26,92,31,97,-4,92,31,84,40,97,-4,84,40,79,51,97,-4,79,51,75,-1,78,64,75,-1,79,51,113,24,109,-3,123,0,166,184,168,38,209,225,209,225,168,38,169,38,209,225,169,38,171,-3,171,-3,169,38,169,-2,168,38,166,184,166,69,168,38,166,69,166,59,168,38,166,59,164,53,155,40,153,21,168,38,225,26,217,29,225,14,225,14,217,29,212,34,225,14,212,34,212,10,212,10,212,34,209,42,212,10,209,42,199,6,199,6,209,42,209,54,199,6,209,54,209,225,209,225,171,-3,186,1,209,225,186,1,199,6,209,225,129,225,145,215,209,225,145,215,155,212,209,225,155,212,162,206,209,225,162,206,165,197,209,225,165,197,166,184,237,25,225,26,225,14,237,25,225,14,240,18,237,25,240,18,240,25,38,38,36,185,36,59,145,215,129,225,129,217,17,216,4,225,4,218,
+238,225,169,225,169,218,178,216,184,214,189,211,192,207,193,201,192,198,192,195,191,192,191,189,190,186,140,57,89,185,87,190,86,194,85,197,84,201,84,204,85,209,88,212,92,215,99,216,108,218,108,225,9,225,9,218,19,216,27,212,35,202,44,186,55,160,115,17,116,14,118,10,118,8,119,6,121,1,123,-1,125,-4,126,-6,128,-6,130,-5,132,-3,135,1,138,8,142,18,206,179,213,195,219,206,224,213,231,216,238,218,347,225,286,225,286,218,294,215,301,213,305,210,307,207,307,197,306,191,302,177,299,169,254,58,209,178,206,185,204,195,204,205,207,210,212,213,221,215,233,218,233,225,131,225,131,218,141,216,148,212,155,206,160,196,166,183,175,155,130,55,80,186,79,189,79,192,78,195,78,206,81,211,85,214,91,216,100,218,100,225,11,225,11,218,17,216,22,214,26,208,31,199,37,186,104,15,108,7,111,0,113,-3,116,-5,118,-6,121,-3,
+87,190,86,194,115,17,115,17,86,194,85,197,115,17,85,197,55,160,55,160,85,197,84,201,55,160,84,201,84,204,84,204,85,209,55,160,108,225,9,225,19,216,108,225,19,216,27,212,108,225,27,212,35,202,108,225,35,202,44,186,108,225,44,186,88,212,108,225,88,212,92,215,108,225,92,215,99,216,108,225,99,216,108,218,85,209,88,212,44,186,85,209,44,186,55,160,140,57,89,185,115,17,140,57,115,17,116,14,140,57,116,14,117,12,140,57,117,12,118,10,140,57,118,10,118,8,140,57,118,8,119,6,140,57,119,6,121,1,140,57,121,1,123,-1,140,57,123,-1,125,-4,140,57,125,-4,126,-6,140,57,126,-6,128,-6,140,57,128,-6,130,-5,140,57,130,-5,132,-3,140,57,132,-3,135,1,140,57,135,1,138,8,140,57,138,8,142,18,140,57,142,18,190,186,206,179,190,186,142,18,238,225,169,225,178,216,238,225,178,216,184,214,238,225,184,214,189,211,238,225,189,211,192,207,238,225,192,207,193,201,238,225,193,201,224,213,238,225,224,213,231,216,238,225,231,216,238,218,206,179,213,195,193,201,206,179,193,201,192,198,206,179,192,198,192,195,206,179,192,195,191,192,206,179,191,192,191,189,206,179,191,189,190,186,219,206,224,213,193,201,219,206,193,201,213,195,178,216,169,225,169,218,87,190,115,17,89,185,19,216,9,225,9,218,
+347,225,286,225,286,218,294,215,301,213,305,210,307,207,307,197,306,191,302,177,299,169,254,58,209,178,206,185,204,195,204,205,207,210,212,213,221,215,233,218,233,225,131,225,131,218,141,216,148,212,155,206,160,196,166,183,175,155,130,55,80,186,79,189,79,192,78,195,78,206,81,211,85,214,91,216,100,218,100,225,11,225,11,218,17,216,22,214,26,208,31,199,37,186,104,15,108,7,111,0,113,-3,116,-5,118,-6,121,-3,123,0,126,5,130,12,186,132,232,15,235,5,238,0,241,-6,246,-6,250,0,253,7,257,17,326,190,331,200,334,207,338,212,342,215,347,218,239,0,239,7,230,8,222,12,215,18,207,26,199,37,134,136,176,195,182,203,190,209,198,214,207,216,217,218,217,225,137,225,137,218,145,217,151,215,155,213,157,210,157,202,154,197,150,191,145,184,136,169,133,165,130,160,124,152,123,154,121,156,119,160,117,162,109,174,103,185,98,194,95,201,94,206,95,210,97,213,101,216,107,217,116,218,116,225,12,225,12,218,17,218,25,217,32,214,39,208,47,200,55,187,55,188,102,116,45,33,37,22,31,15,24,11,17,9,8,7,8,0,81,0,81,7,73,8,68,9,64,11,62,13,61,17,61,19,62,22,64,26,67,31,
+22,214,26,208,100,225,100,225,26,208,31,199,100,225,31,199,37,186,37,186,104,15,78,195,78,195,104,15,79,192,37,186,78,198,78,201,78,201,78,206,37,186,37,186,78,206,81,211,37,186,81,211,85,214,100,225,37,186,85,214,100,225,85,214,91,216,100,225,91,216,100,218,17,216,22,214,100,225,17,216,100,225,11,225,17,216,11,225,11,218,186,132,204,200,204,205,186,132,204,205,175,155,175,155,204,205,166,183,160,196,166,183,207,210,160,196,207,210,212,213,233,225,131,225,141,216,233,225,141,216,148,212,233,225,148,212,155,206,233,225,155,206,160,196,233,225,160,196,212,213,233,225,212,213,221,215,233,225,221,215,233,218,207,210,166,183,204,205,254,58,212,170,232,15,254,58,232,15,235,5,254,58,235,5,238,0,254,58,238,0,240,-4,254,58,240,-4,241,-6,254,58,241,-6,243,-6,254,58,243,-6,246,-6,254,58,246,-6,248,-3,254,58,248,-3,250,0,254,58,250,0,253,7,254,58,253,7,257,17,254,58,257,17,299,169,232,15,212,170,209,178,232,15,209,178,206,185,232,15,206,185,205,190,232,15,205,190,204,195,232,15,204,195,186,132,326,190,299,169,257,17,347,225,286,225,294,215,347,225,294,215,301,213,347,225,301,213,305,210,347,225,305,210,307,207,347,225,307,207,307,203,347,225,307,203,334,207,347,225,334,207,338,212,347,225,338,212,342,215,347,225,342,215,347,218,326,190,331,200,307,203,326,190,307,203,307,197,326,190,307,197,306,191,326,190,306,191,304,184,326,190,304,184,302,177,326,190,302,177,299,169,123,0,126,5,130,55,130,55,126,5,130,12,130,55,130,12,175,155,175,155,130,12,186,132,130,55,80,186,104,15,130,55,104,15,108,7,130,55,108,7,111,0,130,55,111,0,113,-3,130,55,113,-3,116,-5,130,55,116,-5,118,-6,130,55,118,-6,119,-5,130,55,119,-5,121,-3,130,55,121,-3,123,0,79,189,79,192,104,15,79,189,104,15,80,186,37,186,78,195,78,198,294,215,286,225,286,218,334,207,307,203,331,200,186,132,204,195,204,200,141,216,131,225,131,218,
+239,0,239,7,230,8,222,12,215,18,207,26,199,37,134,136,176,195,182,203,190,209,198,214,207,216,217,218,217,225,137,225,137,218,145,217,151,215,155,213,157,210,157,202,154,197,150,191,145,184,136,169,133,165,130,160,124,152,123,154,121,156,119,160,117,162,109,174,103,185,98,194,95,201,94,206,95,210,97,213,101,216,107,217,116,218,116,225,12,225,12,218,17,218,25,217,32,214,39,208,47,200,55,187,55,188,102,116,45,33,37,22,31,15,24,11,17,9,8,7,8,0,81,0,81,7,73,8,68,9,64,11,62,13,61,17,61,19,62,22,64,26,67,31,71,37,110,99,156,28,157,27,159,23,159,15,157,12,153,9,147,8,139,7,139,0,238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,26,211,30,206,33,200,99,60,105,47,111,35,116,24,121,9,119,2,116,-8,112,-21,106,-34,100,-44,96,-51,85,-62,80,-65,75,-66,71,-66,69,-65,66,-64,62,-63,63,-63,57,-60,52,-58,42,-56,36,-56,30,-57,24,-60,19,-65,16,-72,15,-79,17,-88,21,-96,28,-102,38,-106,50,-108,71,-105,90,-94,106,-76,122,-49,137,-11,213,192,217,202,221,208,226,213,231,216,238,218,209,68,200,70,197,57,195,47,193,40,190,34,186,28,181,24,173,20,
+31,15,24,11,81,0,81,0,24,11,17,9,81,0,17,9,8,7,32,214,39,208,116,225,116,225,39,208,47,200,116,225,47,200,55,188,55,187,55,188,102,116,55,187,102,116,94,206,94,206,95,210,55,187,55,187,95,210,97,213,55,187,97,213,116,225,116,225,97,213,101,216,116,225,101,216,107,217,31,15,81,0,37,22,37,22,81,0,64,11,37,22,64,11,45,33,45,33,64,11,62,13,45,33,62,13,61,17,61,17,61,19,45,33,45,33,61,19,62,22,45,33,62,22,102,116,102,116,62,22,64,26,102,116,64,26,67,31,102,116,67,31,71,37,71,37,110,99,102,116,102,116,110,99,103,185,102,116,103,185,98,194,107,217,116,218,116,225,116,225,12,225,17,218,116,225,17,218,25,217,116,225,25,217,32,214,95,201,94,206,102,116,95,201,102,116,98,194,121,156,120,158,156,28,156,28,120,158,119,160,156,28,119,160,117,162,117,162,109,174,110,99,110,99,109,174,103,185,222,12,215,18,159,20,159,20,215,18,207,26,159,20,207,26,199,37,199,37,134,136,156,28,156,28,134,136,127,156,156,28,127,156,124,152,124,152,123,154,156,28,156,28,123,154,121,156,217,225,137,225,145,217,217,225,145,217,151,215,217,225,151,215,155,213,217,225,155,213,157,210,217,225,157,210,157,206,217,225,157,206,190,209,217,225,190,209,198,214,217,225,198,214,207,216,217,225,207,216,217,218,176,195,182,203,157,206,176,195,157,206,157,202,176,195,157,202,154,197,176,195,154,197,150,191,176,195,150,191,145,184,176,195,145,184,139,174,176,195,139,174,136,169,176,195,136,169,134,136,134,136,136,169,133,165,134,136,133,165,130,160,134,136,130,160,127,156,157,12,153,9,239,0,239,0,153,9,147,8,239,0,147,8,139,7,158,25,159,23,199,37,199,37,159,23,159,21,199,37,159,21,159,20,159,20,159,15,239,0,239,0,159,15,157,12,199,37,156,28,157,27,199,37,157,27,158,25,117,162,110,99,156,28,239,0,239,7,230,8,239,0,230,8,222,12,239,0,222,12,159,20,81,0,81,7,73,8,81,0,73,8,68,9,81,0,68,9,64,11,81,0,8,7,8,0,239,0,139,7,139,0,145,217,137,225,137,218,190,209,157,206,182,203,17,218,12,225,12,218,116,225,55,188,55,187,
+238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,26,211,30,206,33,200,99,60,105,47,111,35,116,24,121,9,119,2,116,-8,112,-21,106,-34,100,-44,96,-51,85,-62,80,-65,75,-66,71,-66,69,-65,66,-64,62,-63,63,-63,57,-60,52,-58,42,-56,36,-56,30,-57,24,-60,19,-65,16,-72,15,-79,17,-88,21,-96,28,-102,38,-106,50,-108,71,-105,90,-94,106,-76,122,-49,137,-11,213,192,217,202,221,208,226,213,231,216,238,218,209,68,200,70,197,57,195,47,193,40,190,34,186,28,181,24,173,20,163,17,149,16,133,15,67,15,201,218,201,225,28,225,26,166,36,166,39,184,44,197,51,205,63,209,79,210,147,210,13,7,13,0,201,0,175,-84,157,-78,144,-69,136,-58,131,-42,129,-22,129,60,128,82,124,98,115,110,102,118,83,124,102,131,115,140,124,151,128,167,129,189,129,273,131,293,136,308,144,320,157,328,175,334,175,340,157,339,144,338,132,336,114,328,107,321,100,312,96,300,94,287,93,271,93,181,91,163,87,149,80,139,67,131,50,125,67,118,80,110,87,100,91,86,93,68,93,-20,94,-35,96,-49,
+90,-57,85,-62,90,-94,90,-94,85,-62,80,-65,90,-94,80,-65,75,-66,75,-66,73,-66,90,-94,90,-94,73,-66,71,-105,90,-57,106,-76,96,-51,96,-51,106,-76,100,-44,106,-34,100,-44,106,-76,106,-34,106,-76,122,-49,143,59,88,184,99,60,143,59,99,60,105,47,143,59,105,47,111,35,143,59,111,35,116,24,143,59,116,24,119,15,143,59,119,15,121,9,143,59,121,9,122,-49,143,59,122,-49,137,-11,143,59,137,-11,213,192,143,59,213,192,192,196,122,-49,121,9,119,2,99,60,88,184,86,188,99,60,86,188,84,192,99,60,84,192,82,196,99,60,82,196,81,201,99,60,81,201,33,200,33,200,81,201,81,204,81,204,82,209,33,200,33,200,82,209,85,212,33,200,85,212,109,225,109,225,85,212,90,215,109,225,90,215,98,217,194,202,193,201,213,192,213,192,193,201,193,198,213,192,193,198,192,196,238,225,171,225,179,217,238,225,179,217,186,216,238,225,186,216,190,213,238,225,190,213,193,210,238,225,193,210,194,205,238,225,194,205,226,213,238,225,226,213,231,216,238,225,231,216,238,218,194,205,213,192,217,202,194,205,217,202,221,208,194,205,221,208,226,213,194,204,194,202,213,192,194,204,213,192,194,205,122,-49,119,2,116,-8,122,-49,116,-8,112,-21,122,-49,112,-21,106,-34,71,-105,73,-66,71,-66,71,-105,71,-66,69,-65,71,-105,69,-65,66,-64,71,-105,66,-64,63,-63,71,-105,63,-63,57,-60,71,-105,57,-60,52,-58,71,-105,52,-58,50,-108,52,-58,47,-57,50,-108,50,-108,47,-57,42,-56,50,-108,42,-56,38,-106,38,-106,42,-56,36,-56,38,-106,36,-56,30,-57,38,-106,30,-57,28,-102,28,-102,30,-57,24,-60,28,-102,24,-60,21,-96,21,-96,24,-60,19,-65,21,-96,19,-65,17,-88,17,-88,19,-65,16,-72,17,-88,16,-72,15,-79,98,217,109,218,109,225,109,225,7,225,14,217,109,225,14,217,21,214,109,225,21,214,26,211,109,225,26,211,30,206,109,225,30,206,33,200,66,-64,62,-63,63,-63,14,217,7,225,7,218,90,-57,90,-94,106,-76,179,217,171,225,171,218,
+209,68,200,70,197,57,195,47,193,40,190,34,186,28,181,24,173,20,163,17,149,16,133,15,67,15,201,218,201,225,28,225,26,166,36,166,39,184,44,197,51,205,63,209,79,210,147,210,13,7,13,0,201,0,175,-84,157,-78,144,-69,136,-58,131,-42,129,-22,129,60,128,82,124,98,115,110,102,118,83,124,102,131,115,140,124,151,128,167,129,189,129,273,131,293,136,308,144,320,157,328,175,334,175,340,157,339,144,338,132,336,
+67,15,201,218,147,210,147,210,201,218,201,225,147,210,201,225,79,210,63,209,79,210,201,225,63,209,201,225,28,225,28,225,26,166,36,166,28,225,36,166,39,184,28,225,39,184,44,197,28,225,44,197,51,205,28,225,51,205,63,209,147,210,13,7,67,15,67,15,13,7,201,0,67,15,201,0,133,15,133,15,201,0,149,16,195,47,193,40,201,0,201,0,193,40,190,34,201,0,190,34,186,28,186,28,181,24,201,0,201,0,181,24,173,20,201,0,173,20,163,17,201,0,209,68,200,70,201,0,200,70,197,57,201,0,197,57,195,47,201,0,13,7,13,0,149,16,201,0,163,17,
+175,-84,157,-78,144,-69,136,-58,131,-42,129,-22,129,60,128,82,124,98,115,110,102,118,83,124,102,131,115,140,124,151,128,167,129,189,129,273,131,293,136,308,144,320,157,328,175,334,175,340,157,339,144,338,132,336,114,328,107,321,100,312,96,300,94,287,93,271,93,181,91,163,87,149,80,139,67,131,50,125,67,118,80,110,87,100,91,86,93,68,93,-20,94,-35,96,-49,101,-61,107,-70,114,-77,123,-82,132,-85,143,-87,157,-89,175,-89,66,-6,66,338,33,338,33,-6,147,270,146,286,144,300,139,312,133,321,126,328,108,336,97,338,83,339,65,340,65,334,83,328,96,320,104,308,109,293,110,273,110,189,112,167,116,151,125,139,138,131,157,125,138,118,125,110,116,98,112,82,110,60,110,-22,109,-42,104,-58,96,-69,83,-78,65,-84,65,-89,83,-89,96,-87,108,-85,117,-82,126,-77,133,-71,139,-61,144,-50,146,-36,147,-20,147,68,149,86,153,100,160,111,172,118,190,125,172,131,
+107,-70,114,-77,115,110,115,110,114,-77,123,-82,115,110,123,-82,124,98,124,98,123,-82,132,-85,124,98,132,-85,129,-22,129,-22,129,60,128,82,129,-22,128,82,124,98,157,-89,175,-89,175,-84,157,-89,175,-84,157,-78,157,-89,157,-78,144,-69,157,-89,144,-69,143,-87,136,-58,131,-42,132,-85,136,-58,132,-85,143,-87,136,-58,143,-87,144,-69,102,118,83,124,87,100,102,118,87,100,91,86,102,118,91,86,93,68,102,118,93,68,94,-35,102,118,94,-35,96,-49,102,118,96,-49,101,-61,102,118,101,-61,107,-70,102,118,107,-70,115,110,93,68,93,-20,94,-35,80,110,87,100,83,124,80,110,83,124,87,149,80,110,87,149,80,139,80,110,80,139,67,118,157,339,144,338,144,320,157,339,144,320,157,328,157,339,157,328,175,334,157,339,175,334,175,340,129,273,131,293,132,336,132,336,131,293,136,308,132,336,136,308,144,338,144,338,136,308,144,320,114,328,115,140,123,332,123,332,115,140,124,151,123,332,124,151,129,273,129,273,124,151,128,167,129,273,128,167,129,189,107,321,100,312,102,131,107,321,102,131,115,140,107,321,115,140,114,328,102,131,100,312,96,300,102,131,96,300,94,287,102,131,94,287,93,271,102,131,93,271,93,181,102,131,93,181,91,163,102,131,91,163,87,149,102,131,87,149,83,124,67,131,50,125,67,118,67,131,67,118,80,139,123,332,129,273,132,336,129,-22,132,-85,131,-42,
+66,-6,66,338,33,338,33,-6,147,270,146,286,144,300,139,312,
+66,-6,66,338,33,338,66,-6,33,338,33,-6,
+147,270,146,286,144,300,139,312,133,321,126,328,108,336,97,338,83,339,65,340,65,334,83,328,96,320,104,308,109,293,110,273,110,189,112,167,116,151,125,139,138,131,157,125,138,118,125,110,116,98,112,82,110,60,110,-22,109,-42,104,-58,96,-69,83,-78,65,-84,65,-89,83,-89,96,-87,108,-85,117,-82,126,-77,133,-71,139,-61,144,-50,146,-36,147,-20,147,68,149,86,153,100,160,111,172,118,190,125,172,131,160,139,153,149,149,163,147,181,233,162,227,151,219,141,211,133,201,128,189,126,179,127,157,135,148,140,141,143,124,150,111,155,100,158,92,160,83,160,69,159,56,154,43,146,31,134,20,117,38,92,44,104,51,114,60,122,70,126,80,128,92,127,103,125,114,122,122,119,128,116,143,107,155,101,166,97,176,95,189,94,202,95,214,100,226,108,238,120,251,137,101,209,100,217,96,224,90,229,83,233,75,234,66,233,59,229,53,224,49,217,48,209,49,200,53,192,58,186,
+110,273,112,167,110,273,110,273,112,167,117,332,110,273,117,332,109,293,109,293,117,332,108,336,109,293,108,336,104,308,104,308,108,336,97,338,104,308,97,338,96,320,96,320,97,338,83,339,96,320,83,339,83,328,83,328,83,339,65,340,83,328,65,340,65,334,147,181,147,270,146,286,147,181,146,286,144,300,147,181,144,300,139,312,147,181,139,312,138,131,147,181,138,131,149,163,172,118,190,125,172,131,172,118,172,131,160,111,160,111,172,131,160,139,160,111,160,139,157,125,157,125,160,139,153,149,157,125,153,149,149,163,112,167,116,151,117,332,117,332,116,151,125,139,117,332,125,139,126,328,126,328,125,139,138,131,126,328,138,131,133,321,133,321,138,131,139,312,157,125,138,118,149,86,157,125,149,86,153,100,157,125,153,100,160,111,147,68,149,86,138,118,147,68,138,118,139,-61,147,68,139,-61,144,-50,147,68,144,-50,146,-36,147,68,146,-36,147,-20,116,98,117,-82,125,110,125,110,117,-82,126,-77,125,110,126,-77,138,118,138,118,126,-77,133,-71,138,118,133,-71,139,-61,117,-82,116,98,112,82,117,-82,112,82,110,60,117,-82,110,60,110,-22,117,-82,110,-22,109,-42,117,-82,109,-42,108,-85,104,-58,96,-69,96,-87,104,-58,96,-87,108,-85,104,-58,108,-85,109,-42,83,-78,65,-84,83,-89,83,-78,83,-89,96,-87,83,-78,96,-87,96,-69,83,-89,65,-84,65,-89,149,163,138,131,157,125,112,167,110,273,110,189,
+233,162,227,151,219,141,211,133,201,128,189,126,179,127,157,135,148,140,141,143,124,150,111,155,100,158,92,160,83,160,69,159,56,154,43,146,31,134,20,117,38,92,44,104,51,114,60,122,70,126,80,128,92,127,103,125,114,122,122,119,128,116,143,107,155,101,166,97,176,95,189,94,202,95,214,100,226,108,238,120,251,137,101,209,100,217,96,224,90,229,83,233,75,234,66,233,59,229,53,224,49,217,48,209,49,200,53,192,58,186,66,182,74,181,83,182,90,186,96,192,100,200,101,209,16383,16383,78,141,71,141,49,-49,49,-53,48,-57,48,-69,49,-82,52,-93,58,-101,65,-106,75,-108,84,-106,91,-100,96,-92,100,-81,101,-68,101,-57,100,-53,100,-49,
+92,160,83,160,92,127,92,127,83,160,80,128,70,126,80,128,83,160,70,126,83,160,69,159,141,143,128,116,143,107,141,143,143,107,148,140,148,140,143,107,155,101,148,140,155,101,157,135,157,135,155,101,166,97,157,135,166,97,168,131,168,131,166,97,176,95,168,131,176,95,179,127,179,127,176,95,189,94,179,127,189,94,189,126,189,126,189,94,202,95,189,126,202,95,201,128,92,160,92,127,100,158,100,158,92,127,103,125,100,158,103,125,111,155,111,155,103,125,114,122,111,155,114,122,124,150,124,150,114,122,122,119,124,150,122,119,128,116,201,128,202,95,211,133,211,133,202,95,214,100,211,133,214,100,219,141,219,141,214,100,226,108,219,141,226,108,227,151,227,151,226,108,238,120,227,151,238,120,233,162,233,162,238,120,251,137,44,104,51,114,56,154,56,154,51,114,60,122,56,154,60,122,69,159,69,159,60,122,70,126,43,146,31,134,38,92,43,146,38,92,44,104,43,146,44,104,56,154,38,92,31,134,20,117,128,116,141,143,124,150,
+101,209,100,217,96,224,90,229,83,233,75,234,66,233,59,229,53,224,49,217,48,209,49,200,53,192,58,186,66,182,74,181,83,182,90,186,96,192,100,200,101,209,16383,16383,78,141,71,141,49,-49,49,-53,48,-57,48,-69,49,-82,52,-93,58,-101,65,-106,75,-108,84,-106,91,-100,96,-92,100,-81,101,-68,101,-57,100,-53,100,-49,218,82,203,62,189,48,175,39,160,33,144,32,138,32,133,33,127,34,121,36,114,38,165,184,170,173,176,166,181,161,187,158,194,157,201,158,207,161,211,166,214,173,215,180,214,190,209,200,202,208,191,216,178,222,201,290,184,290,162,228,155,229,150,229,145,230,137,230,101,224,71,207,47,181,32,148,26,109,27,94,30,79,
+48,209,49,200,49,217,49,217,49,200,53,192,49,217,53,192,53,224,53,224,53,192,58,186,53,224,58,186,59,229,59,229,58,186,66,182,59,229,66,182,66,233,66,233,66,182,74,181,66,233,74,181,75,234,75,234,74,181,83,182,75,234,83,182,83,233,83,233,83,182,90,186,83,233,90,186,90,229,90,229,90,186,96,192,90,229,96,192,96,224,96,224,96,192,100,200,96,224,100,200,100,217,100,217,100,200,101,209,100,-49,78,141,84,-106,100,-49,84,-106,91,-100,100,-49,91,-100,96,-92,100,-49,96,-92,100,-81,100,-49,100,-81,101,-68,100,-49,101,-68,100,-53,58,-101,65,-106,71,141,71,141,65,-106,75,-108,71,141,75,-108,78,141,78,141,75,-108,84,-106,71,141,49,-49,49,-82,71,141,49,-82,52,-93,71,141,52,-93,58,-101,49,-82,49,-49,49,-53,49,-82,49,-53,48,-57,49,-82,48,-57,48,-61,49,-82,48,-61,48,-65,49,-82,48,-65,48,-69,101,-68,101,-64,101,-61,101,-68,101,-61,101,-57,101,-68,101,-57,100,-53,
+218,82,203,62,189,48,175,39,160,33,144,32,138,32,133,33,127,34,121,36,114,38,165,184,170,173,176,166,181,161,187,158,194,157,201,158,207,161,211,166,214,173,215,180,214,190,209,200,202,208,191,216,178,222,201,290,184,290,162,228,155,229,150,229,145,230,137,230,101,224,71,207,47,181,32,148,26,109,27,94,30,79,34,64,40,50,47,38,53,30,59,24,66,18,74,12,84,6,59,-68,76,-68,100,0,107,-1,119,-3,140,-3,151,0,161,3,171,8,180,15,190,24,198,33,206,45,214,59,224,78,16383,16383,99,49,86,63,76,77,70,92,66,110,65,130,68,158,77,182,91,200,110,211,133,215,138,215,142,214,147,213,151,212,156,210,172,164,172,186,109,186,107,205,106,220,105,233,104,245,104,256,106,280,112,299,122,313,135,322,151,325,161,324,169,321,175,315,178,308,180,299,180,285,182,275,186,269,191,266,199,265,207,266,214,270,219,276,223,283,224,291,221,306,212,319,198,329,180,336,159,338,126,333,99,317,79,293,66,261,61,221,62,214,62,208,64,194,65,186,12,186,12,164,65,164,68,147,71,127,73,109,75,93,76,81,76,69,75,67,75,63,69,64,64,64,60,65,51,65,36,63,24,58,14,50,8,40,6,27,8,16,12,8,19,1,28,-2,40,-3,50,-2,59,0,68,6,78,14,89,27,107,15,123,6,136,1,149,-1,161,-2,175,-1,188,1,201,7,212,15,
+156,210,99,49,100,0,100,0,99,49,86,63,100,0,86,63,84,6,84,6,86,63,76,77,84,6,76,77,74,12,74,12,76,77,70,92,74,12,70,92,66,110,53,30,59,24,65,130,65,130,66,18,66,110,66,110,66,18,74,12,113,-2,119,-3,114,38,114,38,119,-3,121,36,121,36,119,-3,124,-3,121,36,124,-3,127,34,127,34,124,-3,129,-3,127,34,129,-3,133,33,133,33,129,-3,140,-3,133,33,140,-3,138,32,138,32,140,-3,144,32,160,33,144,32,151,0,160,33,151,0,161,3,114,38,165,184,156,210,156,210,162,228,155,229,156,210,155,229,151,212,151,212,155,229,150,229,151,212,150,229,147,213,147,213,150,229,145,230,147,213,145,230,142,214,142,214,145,230,141,230,142,214,141,230,138,215,138,215,141,230,137,230,138,215,137,230,133,215,184,290,162,228,165,184,184,290,165,184,170,173,184,290,170,173,178,222,184,290,178,222,201,290,170,173,176,166,178,222,178,222,176,166,181,161,178,222,181,161,191,216,191,216,181,161,187,158,191,216,187,158,194,157,114,38,156,210,100,0,114,38,100,0,107,-1,114,38,107,-1,113,-2,76,-68,100,0,84,6,76,-68,84,6,59,-68,194,157,201,158,202,208,202,208,201,158,207,161,202,208,207,161,209,200,209,200,207,161,211,166,209,200,211,166,214,190,214,190,211,166,214,173,214,190,214,173,215,180,77,182,91,200,101,224,101,224,91,200,110,211,101,224,110,211,137,230,137,230,110,211,133,215,71,207,47,181,47,38,71,207,47,38,53,30,71,207,53,30,65,130,71,207,65,130,68,158,71,207,68,158,77,182,71,207,77,182,101,224,27,94,30,79,32,148,32,148,30,79,34,64,32,148,34,64,47,181,47,181,34,64,40,50,47,181,40,50,47,38,190,24,198,33,203,62,203,62,198,33,206,45,203,62,206,45,218,82,218,82,206,45,214,59,218,82,214,59,224,78,161,3,171,8,175,39,175,39,171,8,180,15,175,39,180,15,189,48,189,48,180,15,190,24,189,48,190,24,203,62,144,32,140,-3,151,0,160,33,161,3,175,39,27,94,32,148,26,109,191,216,194,157,202,208,156,210,165,184,162,228,66,18,65,130,59,24,
+172,164,172,186,109,186,107,205,106,220,105,233,104,245,104,256,106,280,112,299,122,313,135,322,151,325,161,324,169,321,175,315,178,308,180,299,180,285,182,275,186,269,191,266,199,265,207,266,214,270,219,276,223,283,224,291,221,306,212,319,198,329,180,336,159,338,126,333,99,317,79,293,66,261,61,221,62,214,62,208,64,194,65,186,12,186,12,164,65,164,68,147,71,127,73,109,75,93,76,81,76,69,75,67,75,63,69,64,64,64,60,65,51,65,36,63,24,58,14,50,8,40,6,27,8,16,12,8,19,1,28,-2,40,-3,50,-2,59,0,68,6,78,14,89,27,107,15,123,6,136,1,149,-1,161,-2,175,-1,188,1,201,7,212,15,223,24,229,32,235,42,240,52,244,61,245,68,245,69,244,70,240,70,238,69,236,67,233,65,230,62,230,63,221,54,210,47,199,42,187,39,174,38,160,38,147,40,133,43,117,48,99,55,109,105,111,117,112,125,112,164,16383,16383,71,38,71,35,68,29,66,26,64,22,59,18,55,14,50,12,46,10,40,10,33,11,27,13,23,17,20,22,19,28,20,35,23,40,28,44,35,46,44,47,52,46,59,45,65,43,69,41,71,38,261,20,213,68,221,81,226,93,230,105,232,118,233,132,232,146,230,158,226,170,221,182,213,194,261,243,237,267,188,219,176,226,165,232,153,235,140,238,112,238,99,236,87,232,75,226,62,219,14,267,-10,243,38,194,30,182,24,170,20,158,18,145,17,131,18,117,20,105,24,92,30,80,38,68,-10,20,14,-4,62,44,74,36,87,31,99,27,112,24,126,23,139,24,152,27,164,31,176,37,188,44,237,-4,16383,16383,199,132,195,108,185,86,169,70,149,59,126,55,102,59,82,70,66,86,55,107,51,132,55,155,66,176,81,192,101,203,124,206,148,203,168,192,184,176,195,156,199,132,256,331,158,331,158,321,174,321,181,319,186,315,190,311,191,306,191,303,190,299,188,294,187,289,184,284,128,174,69,285,67,289,65,294,64,299,63,303,63,307,64,313,67,317,73,319,83,321,95,321,95,331,-25,331,-25,321,-13,319,-3,314,7,304,18,287,32,262,80,176,8,176,8,156,92,156,95,149,95,111,8,111,8,91,95,91,95,60,94,39,91,25,84,16,72,11,55,9,55,0,177,0,177,9,161,11,150,16,142,24,138,37,137,55,137,91,224,91,224,111,137,111,137,149,141,156,
+59,18,55,14,59,0,59,0,55,14,50,12,59,0,50,12,50,-2,50,-2,50,12,46,10,50,-2,46,10,40,-3,40,-3,46,10,40,10,69,64,64,64,65,43,65,43,64,64,60,65,65,43,60,65,59,45,59,45,60,65,56,65,59,45,56,65,52,46,52,46,56,65,51,65,52,46,51,65,44,47,20,35,23,40,24,58,24,58,23,40,28,44,24,58,28,44,36,63,36,63,28,44,35,46,36,63,35,46,44,47,20,22,19,28,19,1,19,1,19,28,14,50,14,50,19,28,24,58,24,58,19,28,20,35,71,35,70,33,78,14,78,14,70,33,68,29,78,14,68,29,68,6,68,6,68,29,66,26,68,6,66,26,64,22,64,22,59,18,68,6,68,6,59,18,59,0,75,67,75,65,78,14,78,14,75,65,75,62,78,14,75,62,71,38,71,38,75,62,75,63,71,38,75,63,69,41,69,41,75,63,69,64,69,41,69,64,65,43,78,14,71,38,71,35,89,27,107,15,99,55,99,55,107,15,117,48,117,48,107,15,123,6,117,48,123,6,133,43,133,43,123,6,136,1,133,43,136,1,147,40,147,40,136,1,149,-1,147,40,149,-1,160,38,160,38,149,-1,161,-2,160,38,161,-2,174,38,174,38,161,-2,175,-1,174,38,175,-1,187,39,99,55,105,85,104,256,104,256,106,280,99,317,99,317,106,280,112,299,99,317,112,299,126,333,126,333,112,299,122,313,126,333,122,313,135,322,180,336,159,338,161,324,161,324,159,338,151,325,135,322,151,325,159,338,135,322,159,338,126,333,221,306,212,319,214,270,221,306,214,270,219,276,221,306,219,276,223,283,221,306,223,283,224,291,186,269,191,266,198,329,198,329,191,266,199,265,198,329,199,265,212,319,212,319,199,265,207,266,212,319,207,266,214,270,178,308,180,299,180,336,180,336,180,299,180,285,180,336,180,285,198,329,198,329,180,285,182,275,198,329,182,275,186,269,180,336,161,324,169,321,180,336,169,321,175,315,180,336,175,315,178,308,76,71,78,14,76,73,76,73,78,14,79,293,79,293,78,14,89,27,79,293,89,27,99,317,99,317,89,27,99,55,99,317,99,55,104,256,109,105,111,117,109,186,109,186,111,117,112,164,109,186,112,164,172,186,172,186,112,164,172,164,109,186,107,205,109,105,109,105,107,205,106,220,109,105,106,220,105,85,105,85,106,220,105,233,105,85,105,233,104,245,112,139,112,146,112,133,112,133,112,146,112,152,112,133,112,152,112,125,112,125,112,152,112,158,112,125,112,158,112,164,229,32,230,62,223,24,223,24,230,62,221,54,223,24,221,54,212,15,212,15,221,54,210,47,212,15,210,47,201,7,201,7,210,47,199,42,201,7,199,42,188,1,188,1,199,42,187,39,188,1,187,39,175,-1,245,69,244,70,245,68,245,68,244,70,244,61,244,61,244,70,243,70,244,61,243,70,242,70,240,52,244,61,242,70,240,52,242,70,240,70,240,52,240,70,238,69,240,52,238,69,236,67,240,52,236,67,235,42,235,42,236,67,233,65,235,42,233,65,230,62,235,42,230,62,229,32,79,293,66,261,68,147,79,293,68,147,71,127,79,293,71,127,73,109,79,293,73,109,75,93,79,293,75,93,76,81,79,293,76,81,76,73,66,261,61,221,62,214,66,261,62,214,62,208,66,261,62,208,63,201,66,261,63,201,64,194,66,261,64,194,65,186,66,261,65,186,65,164,66,261,65,164,68,147,76,69,75,67,78,14,76,69,78,14,76,71,65,164,65,186,12,186,65,164,12,186,12,164,33,11,27,13,28,-2,33,11,28,-2,40,-3,33,11,40,-3,40,10,28,-2,27,13,23,17,28,-2,23,17,20,22,28,-2,20,22,19,1,6,27,8,16,8,40,8,40,8,16,12,8,8,40,12,8,14,50,14,50,12,8,19,1,221,54,230,62,230,63,112,125,112,164,111,117,104,256,105,85,104,245,44,47,51,65,36,63,
+261,20,213,68,221,81,226,93,230,105,232,118,233,132,232,146,230,158,226,170,221,182,213,194,261,243,237,267,188,219,176,226,165,232,153,235,140,238,112,238,99,236,87,232,75,226,62,219,14,267,-10,243,38,194,30,182,24,170,20,158,18,145,17,131,18,117,20,105,24,92,30,80,38,68,-10,20,14,-4,62,44,74,36,87,31,99,27,112,24,126,23,139,24,152,27,164,31,176,37,188,44,237,-4,16383,16383,199,132,195,108,185,86,169,70,149,59,126,55,102,59,82,70,66,86,55,107,51,132,55,155,66,176,81,192,101,203,124,206,148,203,168,192,184,176,195,156,199,132,256,331,158,331,158,321,174,321,181,319,186,315,190,311,191,306,191,303,190,299,188,294,187,289,184,284,128,174,69,285,67,289,65,294,64,299,63,303,63,307,64,313,67,317,73,319,83,321,95,321,95,331,-25,331,-25,321,-13,319,-3,314,7,304,18,287,32,262,80,176,8,176,8,156,92,156,95,149,95,111,8,111,8,91,95,91,95,60,94,39,91,25,84,16,72,11,55,9,55,0,177,0,177,9,161,11,150,16,142,24,138,37,137,55,137,91,224,91,224,111,137,111,137,149,141,156,224,156,224,176,151,176,197,268,207,286,218,300,229,310,242,317,256,321,66,200,66,338,
+99,27,112,24,102,59,102,59,112,24,126,55,149,59,126,55,126,23,149,59,126,23,139,24,62,219,14,267,38,194,62,219,38,194,38,68,62,219,38,68,51,132,62,219,51,132,55,155,62,219,55,155,66,176,62,219,66,176,75,226,66,86,55,107,62,44,62,44,55,107,51,132,140,238,126,238,148,203,148,203,126,238,124,206,101,203,124,206,112,238,101,203,112,238,99,236,87,232,75,226,81,192,87,232,81,192,101,203,87,232,101,203,99,236,261,20,213,68,237,-4,237,-4,213,68,195,108,237,-4,195,108,188,44,188,44,195,108,185,86,188,44,185,86,176,37,176,37,185,86,169,70,176,37,169,70,164,31,164,31,169,70,152,27,149,59,139,24,152,27,149,59,152,27,169,70,195,156,199,132,213,194,195,156,213,194,237,267,237,267,213,194,261,243,165,232,168,192,176,226,176,226,168,192,184,176,176,226,184,176,188,219,188,219,184,176,195,156,188,219,195,156,237,267,153,235,140,238,148,203,153,235,148,203,168,192,153,235,168,192,165,232,213,194,213,68,221,182,221,182,213,68,221,81,221,182,221,81,226,170,226,170,221,81,226,93,226,170,226,93,230,158,230,158,226,93,230,105,230,158,230,105,232,146,232,146,230,105,232,118,232,146,232,118,233,132,213,68,213,194,199,132,213,68,199,132,195,108,126,55,112,24,126,23,126,238,112,238,124,206,99,27,102,59,87,31,87,31,102,59,82,70,87,31,82,70,74,36,74,36,82,70,66,86,74,36,66,86,62,44,38,68,14,-4,62,44,38,68,62,44,51,132,38,68,38,194,30,80,30,80,38,194,30,182,30,80,30,182,24,92,24,92,30,182,24,170,24,92,24,170,20,105,20,105,24,170,20,158,20,105,20,158,18,117,18,117,20,158,18,145,18,117,18,145,17,131,14,-4,38,68,-10,20,75,226,66,176,81,192,38,194,14,267,-10,243,
+256,331,158,331,158,321,174,321,181,319,186,315,190,311,191,306,191,303,190,299,188,294,187,289,184,284,128,174,69,285,67,289,65,294,64,299,63,303,63,307,64,313,67,317,73,319,83,321,95,321,95,331,-25,331,-25,321,-13,319,-3,314,7,304,18,287,32,262,80,176,8,176,8,156,92,156,95,149,95,111,8,111,8,91,95,91,95,60,94,39,91,25,84,16,72,11,55,9,55,0,177,0,177,9,161,11,150,16,142,24,138,37,137,55,137,91,224,91,224,111,137,111,137,149,141,156,224,156,224,176,151,176,197,268,207,286,218,300,229,310,242,317,256,321,66,200,66,338,33,338,33,200,16383,16383,66,-6,66,131,33,131,33,-6,100,257,94,262,86,276,84,284,83,292,85,304,91,314,100,321,111,326,126,328,135,327,144,324,150,321,155,316,156,311,156,310,155,309,154,307,152,306,144,298,142,293,140,289,140,284,141,277,144,271,149,266,155,263,163,262,172,263,179,267,184,272,188,280,189,289,185,305,177,318,163,329,145,336,124,338,101,335,82,327,68,314,58,297,55,277,57,262,61,248,70,235,84,220,105,202,99,202,97,203,92,203,74,200,58,191,46,179,38,162,35,143,38,121,48,100,64,79,88,57,121,32,137,20,
+32,262,80,176,32,262,32,262,80,176,63,303,32,262,63,303,63,307,63,307,64,313,32,262,91,25,84,16,177,0,177,0,84,16,72,11,177,0,72,11,55,9,95,331,-25,331,-13,319,95,331,-13,319,-3,314,95,331,-3,314,7,304,95,331,7,304,67,317,95,331,67,317,73,319,95,331,73,319,83,321,95,331,83,321,95,321,18,287,32,262,64,313,18,287,64,313,67,317,18,287,67,317,7,304,184,284,128,174,137,149,184,284,137,149,141,156,184,284,141,156,151,176,184,284,151,176,197,268,184,284,197,268,187,289,256,331,158,331,166,321,256,331,166,321,174,321,256,331,174,321,181,319,256,331,181,319,186,315,256,331,186,315,190,311,256,331,190,311,191,306,256,331,191,306,229,310,256,331,229,310,242,317,256,331,242,317,256,321,197,268,207,286,191,306,197,268,191,306,191,303,197,268,191,303,190,299,197,268,190,299,188,294,197,268,188,294,187,289,218,300,229,310,191,306,218,300,191,306,207,286,92,156,95,149,128,174,128,174,95,149,138,37,128,174,138,37,137,55,137,111,137,91,224,91,137,111,224,91,224,111,151,176,141,156,224,156,151,176,224,156,224,176,177,0,177,9,161,11,177,0,161,11,150,16,177,0,150,16,94,39,177,0,94,39,91,25,142,24,138,37,95,149,142,24,95,149,95,111,142,24,95,111,95,91,142,24,95,91,95,60,142,24,95,60,150,16,8,111,8,91,95,91,8,111,95,91,95,111,80,176,8,176,92,156,80,176,92,156,128,174,80,176,128,174,69,285,80,176,69,285,67,289,80,176,67,289,65,294,80,176,65,294,64,299,80,176,64,299,63,303,92,156,8,176,8,156,177,0,55,9,55,0,94,39,150,16,95,60,137,149,128,174,137,55,166,321,158,331,158,321,-13,319,-25,331,-25,321,
+66,200,66,338,33,338,33,200,16383,16383,66,-6,66,131,33,131,33,-6,100,257,94,262,86,276,84,284,83,292,85,304,91,314,100,321,111,326,
+33,338,33,200,66,200,33,338,66,200,66,338,33,131,33,-6,66,-6,33,131,66,-6,66,131,
+100,257,94,262,86,276,84,284,83,292,85,304,91,314,100,321,111,326,126,328,135,327,144,324,150,321,155,316,156,311,156,310,155,309,154,307,152,306,144,298,142,293,140,289,140,284,141,277,144,271,149,266,155,263,163,262,172,263,179,267,184,272,188,280,189,289,185,305,177,318,163,329,145,336,124,338,101,335,82,327,68,314,58,297,55,277,57,262,61,248,70,235,84,220,105,202,99,202,97,203,92,203,74,200,58,191,46,179,38,162,35,143,38,121,48,100,64,79,88,57,121,32,137,20,150,8,159,-2,164,-13,165,-24,163,-37,157,-48,148,-56,136,-61,122,-63,111,-62,101,-59,93,-55,88,-50,86,-45,86,-44,87,-42,90,-39,92,-38,96,-33,99,-29,103,-21,103,-17,102,-10,99,-5,93,0,87,2,79,3,70,2,63,-1,57,-7,53,-14,52,-23,55,-39,65,-53,80,-64,99,-71,121,-73,145,-70,165,-62,180,-48,190,-31,193,-10,192,4,187,17,179,30,165,45,146,63,152,63,173,65,190,73,202,86,210,102,213,123,211,139,206,154,197,170,184,185,169,200,16383,16383,187,105,185,96,180,87,172,80,163,75,152,73,141,75,129,79,116,87,101,99,84,114,75,124,69,133,65,141,62,149,61,158,63,169,68,178,75,185,84,190,95,191,106,190,118,184,132,176,146,165,161,152,170,142,177,132,183,123,186,114,187,105,158,286,157,294,153,301,148,306,141,310,133,311,125,310,118,306,113,301,110,294,108,286,109,278,113,272,118,266,125,263,132,262,140,263,148,266,153,272,157,278,158,286,16383,16383,59,286,57,294,54,301,48,306,41,310,33,311,26,310,19,306,14,301,10,294,9,286,10,278,14,272,19,266,25,263,33,262,41,263,48,266,54,272,57,278,59,286,273,124,266,124,257,108,247,95,236,87,223,82,208,80,183,84,162,95,147,113,137,138,133,169,137,197,146,221,161,240,180,252,205,256,221,254,234,249,245,240,253,227,257,211,266,211,266,247,265,249,264,250,263,252,261,254,259,255,249,259,238,262,216,266,205,266,169,262,138,248,115,227,100,199,95,165,99,133,112,107,132,87,158,75,191,70,210,71,230,74,247,78,260,82,265,86,16383,16383,361,165,352,220,329,267,292,305,246,329,193,338,137,329,89,305,52,268,28,220,19,165,28,110,52,63,89,26,136,1,190,-6,245,1,292,26,329,63,353,110,361,165,16383,16383,334,167,326,119,306,77,275,44,235,22,190,14,145,22,106,43,74,76,54,118,46,166,54,213,74,254,106,287,144,309,189,317,234,309,274,288,305,255,326,214,334,167,135,221,129,217,127,216,124,215,118,215,116,217,115,220,115,225,114,233,114,290,112,307,106,321,96,330,81,336,62,338,44,337,29,332,
+101,335,82,327,85,304,85,304,82,327,83,292,84,220,83,292,82,327,84,220,82,327,70,235,70,235,82,327,68,314,70,235,68,314,61,248,61,248,68,314,58,297,61,248,58,297,57,262,57,262,58,297,55,277,69,133,88,57,75,124,75,124,88,57,84,114,101,99,84,114,88,57,101,99,88,57,121,32,95,191,94,203,92,203,95,191,92,203,84,190,95,191,97,203,94,203,63,169,68,178,74,200,74,200,68,178,75,185,74,200,75,185,92,203,92,203,75,185,84,190,74,200,58,191,63,169,63,169,58,191,61,158,64,79,61,158,58,191,64,79,58,191,48,100,48,100,58,191,46,179,48,100,46,179,38,121,38,121,46,179,38,162,38,121,38,162,35,143,165,45,146,63,150,8,150,8,146,63,141,75,150,8,141,75,137,20,137,20,141,75,129,79,137,20,129,79,121,32,121,32,129,79,116,87,121,32,116,87,101,99,163,-37,157,-48,165,-62,165,-62,157,-48,148,-56,165,-62,148,-56,145,-70,145,-70,148,-56,136,-61,145,-70,136,-61,122,-63,122,-63,111,-62,121,-73,121,-73,111,-62,101,-59,121,-73,101,-59,99,-71,99,-71,101,-59,93,-55,99,-71,93,-55,88,-50,79,3,80,-64,87,2,87,2,80,-64,86,-45,88,-50,86,-45,80,-64,88,-50,80,-64,99,-71,144,324,145,336,135,327,135,327,145,336,126,328,111,326,126,328,124,338,111,326,124,338,101,335,101,335,85,304,91,314,101,335,91,314,100,321,101,335,100,321,111,326,152,73,146,63,152,63,152,73,152,63,173,65,152,73,141,75,146,63,180,87,172,80,173,65,173,65,172,80,163,75,173,65,163,75,152,73,118,184,132,176,169,200,169,200,132,176,146,165,169,200,146,165,161,152,161,152,170,142,169,200,169,200,170,142,184,185,213,123,211,139,210,102,210,102,211,139,206,154,210,102,206,154,202,86,202,86,206,154,197,170,202,86,197,170,190,73,190,73,197,170,187,105,190,73,187,105,185,96,190,73,185,96,180,87,177,132,183,123,184,185,184,185,183,123,186,114,184,185,186,114,197,170,197,170,186,114,187,105,106,190,118,184,169,200,106,190,169,200,105,202,106,190,105,202,102,202,106,190,102,202,99,202,106,190,99,202,97,203,106,190,97,203,95,191,100,257,94,262,105,202,100,257,105,202,169,200,94,262,90,269,105,202,105,202,90,269,86,276,105,202,86,276,84,220,84,220,86,276,84,284,84,220,84,284,83,292,193,-10,192,4,190,-31,190,-31,192,4,187,17,190,-31,187,17,180,-48,180,-48,187,17,179,30,180,-48,179,30,165,45,165,45,150,8,159,-2,165,45,159,-2,164,-13,165,45,164,-13,165,-24,165,45,165,-24,165,-62,165,45,165,-62,180,-48,163,-37,165,-62,165,-24,122,-63,121,-73,145,-70,156,311,156,310,163,262,163,262,156,310,155,309,163,262,155,309,155,263,155,263,155,309,154,307,155,263,154,307,152,306,163,329,156,311,163,262,155,316,156,311,163,329,155,316,163,329,150,321,150,321,163,329,145,336,150,321,145,336,144,324,145,336,124,338,126,328,185,305,177,318,179,267,185,305,179,267,184,272,185,305,184,272,188,280,185,305,188,280,189,289,177,318,163,329,163,262,177,318,163,262,172,263,177,318,172,263,179,267,149,266,155,263,152,306,149,266,152,306,148,302,149,266,148,302,144,298,149,266,144,298,144,271,142,293,140,289,141,277,142,293,141,277,144,271,142,293,144,271,144,298,102,-10,99,-5,99,-29,102,-10,99,-29,101,-25,102,-10,101,-25,103,-21,102,-10,103,-21,103,-17,99,-29,99,-5,96,-33,96,-33,99,-5,93,0,96,-33,93,0,92,-38,92,-38,93,0,90,-39,86,-45,86,-44,87,2,87,2,86,-44,87,-42,87,2,87,-42,93,0,93,0,87,-42,88,-41,93,0,88,-41,90,-39,70,2,63,-1,65,-53,70,2,65,-53,80,-64,70,2,80,-64,79,3,57,-7,53,-14,55,-39,57,-7,55,-39,65,-53,57,-7,65,-53,63,-1,65,141,62,149,64,79,65,141,64,79,88,57,65,141,88,57,69,133,61,158,64,79,62,149,55,-39,53,-14,52,-23,141,277,140,289,140,284,180,87,173,65,190,73,184,185,170,142,177,132,
+158,286,157,294,153,301,148,306,141,310,133,311,125,310,118,306,113,301,110,294,108,286,109,278,113,272,118,266,125,263,132,262,140,263,148,266,153,272,157,278,158,286,16383,16383,59,286,57,294,54,301,48,306,41,310,33,311,26,310,19,306,14,301,10,294,9,286,10,278,14,272,19,266,25,263,33,262,41,263,48,266,54,272,57,278,59,286,273,124,266,124,257,108,247,95,236,87,223,82,208,80,183,84,162,95,147,113,137,138,133,169,137,197,146,221,161,240,180,252,205,256,221,254,234,249,245,240,253,227,257,211,266,211,266,247,265,249,264,250,263,252,261,254,259,255,249,259,238,262,216,266,205,266,169,262,138,248,115,227,100,199,95,165,99,133,112,107,132,87,158,75,191,70,
+108,286,109,278,110,294,110,294,109,278,113,272,110,294,113,272,113,301,113,301,113,272,118,266,113,301,118,266,118,306,118,306,118,266,125,263,118,306,125,263,125,310,125,310,125,263,132,262,125,310,132,262,133,311,133,311,132,262,140,263,133,311,140,263,141,310,141,310,140,263,148,266,141,310,148,266,148,306,148,306,148,266,153,272,148,306,153,272,153,301,153,301,153,272,157,278,153,301,157,278,157,294,157,294,157,278,158,286,9,286,10,278,10,294,10,294,10,278,14,272,10,294,14,272,14,301,14,301,14,272,19,266,14,301,19,266,19,306,19,306,19,266,25,263,19,306,25,263,26,310,26,310,25,263,33,262,26,310,33,262,33,311,33,311,33,262,41,263,33,311,41,263,41,310,41,310,41,263,48,266,41,310,48,266,48,306,48,306,48,266,54,272,48,306,54,272,54,301,54,301,54,272,57,278,54,301,57,278,57,294,57,294,57,278,59,286,
+273,124,266,124,257,108,247,95,236,87,223,82,208,80,183,84,162,95,147,113,137,138,133,169,137,197,146,221,161,240,180,252,205,256,221,254,234,249,245,240,253,227,257,211,266,211,266,247,265,249,264,250,263,252,261,254,259,255,249,259,238,262,216,266,205,266,169,262,138,248,115,227,100,199,95,165,99,133,112,107,132,87,158,75,191,70,210,71,230,74,247,78,260,82,265,86,16383,16383,361,165,352,220,329,267,292,305,246,329,193,338,137,329,89,305,52,268,28,220,19,165,28,110,52,63,89,26,136,1,190,-6,245,1,292,26,329,63,353,110,361,165,16383,16383,334,167,326,119,306,77,275,44,235,22,190,14,145,22,106,43,74,76,54,118,46,166,54,213,74,254,106,287,144,309,189,317,234,309,274,288,305,255,326,214,334,167,135,221,129,217,127,216,124,215,118,215,116,217,115,220,115,225,114,233,114,290,112,307,106,321,96,330,81,336,62,338,44,337,29,332,18,325,10,316,8,305,9,300,11,295,14,292,19,290,24,289,29,290,37,294,39,298,40,301,40,303,39,304,39,307,38,309,38,313,39,316,43,319,48,322,54,324,60,324,67,323,72,321,76,316,78,310,79,303,79,288,56,279,40,273,29,268,20,263,13,257,9,253,6,248,4,243,2,231,4,220,9,210,16,203,26,199,37,197,46,198,55,200,64,205,73,211,83,219,85,210,88,204,93,200,98,198,105,197,112,197,117,199,123,202,128,206,135,212,16383,16383,79,237,79,235,78,233,77,230,76,228,74,226,64,222,60,221,56,221,52,220,46,222,41,225,37,230,34,236,33,243,35,250,39,256,
+162,95,147,113,158,75,158,75,147,113,137,138,158,75,137,138,132,87,132,87,137,138,133,169,138,248,133,169,137,197,138,248,137,197,146,221,216,266,205,266,221,254,221,254,205,266,205,256,180,252,205,256,205,266,180,252,205,266,169,262,263,252,261,254,266,211,266,211,261,254,259,255,266,211,259,255,257,211,257,211,259,255,253,227,169,262,138,248,146,221,169,262,146,221,161,240,169,262,161,240,180,252,115,227,100,199,112,107,115,227,112,107,132,87,115,227,132,87,133,169,115,227,133,169,138,248,100,199,95,165,99,133,100,199,99,133,112,107,266,124,257,108,260,82,260,82,257,108,247,95,260,82,247,95,247,78,247,78,247,95,236,87,247,78,236,87,230,74,230,74,236,87,223,82,230,74,223,82,210,71,210,71,223,82,208,80,191,70,210,71,208,80,191,70,208,80,183,84,191,70,183,84,162,95,191,70,162,95,158,75,266,211,266,247,265,249,266,211,265,249,264,250,266,211,264,250,263,252,216,266,221,254,227,264,227,264,221,254,234,249,227,264,234,249,238,262,238,262,234,249,245,240,238,262,245,240,249,259,249,259,245,240,253,227,249,259,253,227,259,255,266,124,260,82,265,86,266,124,265,86,273,124,193,338,189,317,234,309,193,338,234,309,246,329,246,329,234,309,274,288,246,329,274,288,292,305,292,305,274,288,305,255,292,305,305,255,329,267,329,267,305,255,326,214,329,267,326,214,334,167,334,167,352,220,329,267,334,167,353,110,352,220,329,63,353,110,334,167,329,63,334,167,326,119,329,63,326,119,306,77,329,63,306,77,292,26,190,14,190,-6,235,22,235,22,190,-6,245,1,235,22,245,1,275,44,275,44,245,1,292,26,275,44,292,26,306,77,54,213,74,254,89,305,89,305,74,254,106,287,89,305,106,287,137,329,137,329,106,287,144,309,137,329,144,309,193,338,193,338,144,309,189,317,28,110,52,63,28,220,28,220,52,63,46,166,52,268,46,166,54,213,52,268,54,213,89,305,145,22,106,43,136,1,145,22,136,1,190,-6,145,22,190,-6,190,14,89,26,136,1,106,43,89,26,106,43,74,76,89,26,74,76,54,118,89,26,54,118,52,63,46,166,52,63,54,118,28,110,28,220,19,165,28,220,46,166,52,268,352,220,353,110,361,165,
+135,221,129,217,127,216,124,215,118,215,116,217,115,220,115,225,114,233,114,290,112,307,106,321,96,330,81,336,62,338,44,337,29,332,18,325,10,316,8,305,9,300,11,295,14,292,19,290,24,289,29,290,37,294,39,298,40,301,40,303,39,304,39,307,38,309,38,313,39,316,43,319,48,322,54,324,60,324,67,323,72,321,76,316,78,310,79,303,79,288,56,279,40,273,29,268,20,263,13,257,9,253,6,248,4,243,2,231,4,220,9,210,16,203,26,199,37,197,46,198,55,200,64,205,73,211,83,219,85,210,88,204,93,200,98,198,105,197,112,197,117,199,123,202,128,206,135,212,16383,16383,79,237,79,235,78,233,77,230,76,228,74,226,64,222,60,221,56,221,52,220,46,222,41,225,37,230,34,236,33,243,35,250,39,256,48,262,61,269,79,276,117,113,157,77,172,64,203,33,216,21,222,17,224,17,225,18,227,19,228,20,228,22,227,26,224,31,219,39,212,49,203,60,196,70,188,80,180,91,171,102,161,113,203,166,212,178,219,187,224,194,227,199,228,203,228,205,227,207,225,208,223,208,216,204,204,193,172,163,157,150,16383,16383,21,113,61,77,76,64,107,33,120,21,126,17,128,17,129,18,131,19,132,20,132,22,131,26,128,31,123,39,116,49,107,60,100,70,92,80,65,113,107,166,116,178,123,187,128,194,131,199,132,203,132,205,131,207,129,208,127,208,120,204,108,193,76,163,61,150,276,57,276,196,24,196,24,164,243,164,243,57,142,97,142,128,20,128,20,97,283,76,283,80,276,86,268,94,252,112,244,123,216,162,230,168,241,177,249,188,254,199,256,211,253,228,246,241,233,251,217,258,
+38,309,38,310,39,298,39,298,38,310,38,311,39,298,38,311,37,294,37,294,38,311,38,313,44,337,38,313,39,316,44,337,39,316,43,319,39,305,39,307,39,298,39,305,39,298,40,301,40,301,40,302,40,303,40,301,40,303,39,304,40,301,39,304,39,305,46,198,55,200,46,222,46,222,55,200,52,220,56,221,52,220,55,200,56,221,55,200,64,205,81,336,62,338,67,323,67,323,62,338,60,324,54,324,60,324,62,338,54,324,62,338,48,322,48,322,62,338,44,337,48,322,44,337,43,319,78,233,77,230,83,219,83,219,77,230,76,228,83,219,76,228,74,226,74,226,69,224,73,211,73,211,69,224,64,222,73,211,64,222,64,205,64,205,64,222,60,221,64,205,60,221,56,221,24,289,29,290,29,332,29,332,29,290,33,292,29,332,33,292,38,313,38,313,33,292,37,294,11,295,14,292,18,325,18,325,14,292,19,290,18,325,19,290,29,332,29,332,19,290,24,289,10,316,8,305,9,300,10,316,9,300,11,295,10,316,11,295,18,325,81,336,79,276,83,219,81,336,83,219,96,330,96,330,83,219,85,210,96,330,85,210,88,204,81,336,67,323,72,321,81,336,72,321,76,316,81,336,76,316,78,310,81,336,78,310,79,303,81,336,79,303,79,276,98,198,105,197,106,321,106,321,105,197,112,197,106,321,112,197,112,307,112,307,112,197,115,225,112,307,115,225,114,233,117,199,123,202,118,215,118,215,123,202,121,215,124,215,121,215,123,202,124,215,123,202,128,206,135,221,132,219,135,212,135,212,132,219,129,217,135,212,129,217,128,206,128,206,129,217,127,216,128,206,127,216,124,215,117,199,118,215,116,217,117,199,116,217,115,220,117,199,115,220,115,225,117,199,115,225,112,197,96,330,88,204,93,200,96,330,93,200,98,198,96,330,98,198,106,321,83,219,79,276,79,237,83,219,79,237,79,235,83,219,79,235,78,233,74,226,73,211,83,219,35,250,39,256,40,273,40,273,39,256,48,262,40,273,48,262,56,279,56,279,48,262,61,269,56,279,61,269,79,288,79,288,61,269,79,276,79,288,79,276,79,303,40,273,29,268,35,250,35,250,29,268,33,243,37,197,33,243,29,268,37,197,29,268,26,199,26,199,29,268,20,263,26,199,20,263,16,203,16,203,20,263,13,257,16,203,13,257,9,253,41,225,37,230,37,197,41,225,37,197,46,198,41,225,46,198,46,222,34,236,33,243,37,197,34,236,37,197,37,230,9,210,16,203,9,253,9,210,9,253,6,248,9,210,6,248,4,243,9,210,4,243,4,220,3,237,2,231,4,220,3,237,4,220,4,243,114,233,114,290,112,307,29,332,38,313,44,337,38,309,39,298,39,307,
+117,113,157,77,172,64,203,33,216,21,222,17,224,17,225,18,227,19,228,20,228,22,227,26,224,31,219,39,212,49,203,60,196,70,188,80,180,91,171,102,161,113,203,166,212,178,219,187,224,194,227,199,228,203,228,205,227,207,225,208,223,208,216,204,204,193,172,163,157,150,16383,16383,21,113,61,77,76,64,107,33,120,21,126,17,128,17,129,18,131,19,132,20,132,22,131,26,128,31,123,39,116,49,107,60,100,70,92,80,65,113,107,166,116,178,123,187,128,194,131,199,132,203,132,205,131,207,129,208,127,208,120,204,108,193,76,163,61,150,276,57,276,196,24,196,24,164,243,164,243,57,142,97,142,128,20,128,20,97,283,76,283,80,276,86,268,94,252,112,244,123,216,162,230,168,241,177,249,188,254,199,256,211,253,228,246,241,233,251,217,258,196,260,110,260,110,252,122,251,128,248,132,244,134,237,134,98,132,91,129,87,121,85,110,84,109,76,190,76,190,84,178,85,171,87,168,92,166,100,166,157,190,157,199,143,206,133,210,127,213,121,216,116,224,101,232,90,239,82,246,77,252,76,16383,16383,166,166,166,251,185,251,199,248,210,243,217,234,221,222,222,209,221,196,216,184,209,175,
+203,60,196,70,203,60,203,60,196,70,203,33,203,60,203,33,212,49,212,49,203,33,216,21,212,49,216,21,219,39,219,39,216,21,222,17,219,39,222,17,224,31,224,31,222,17,224,17,224,31,224,17,225,18,227,26,224,31,225,18,227,26,225,18,227,19,227,26,227,19,228,20,227,26,228,20,228,22,171,102,172,64,180,91,180,91,172,64,188,48,180,91,188,48,188,80,188,80,188,48,203,33,188,80,203,33,196,70,161,113,172,163,157,150,161,113,157,150,157,77,161,113,157,77,172,64,161,113,172,64,171,102,228,205,227,207,227,199,228,205,227,199,228,203,228,205,228,203,228,204,188,178,203,166,204,193,204,193,203,166,212,178,204,193,212,178,216,204,216,204,212,178,219,187,216,204,219,187,223,208,223,208,219,187,224,194,223,208,224,194,225,208,225,208,224,194,227,199,225,208,227,199,227,207,172,163,161,113,203,166,172,163,203,166,188,178,107,60,100,70,107,33,107,60,107,33,116,49,116,49,107,33,120,21,116,49,120,21,123,39,123,39,120,21,126,17,123,39,126,17,128,31,128,31,126,17,128,17,128,31,128,17,129,18,131,26,128,31,129,18,131,26,129,18,131,19,131,26,131,19,132,20,131,26,132,20,132,22,74,102,76,64,83,91,83,91,76,64,92,48,83,91,92,48,92,80,92,80,92,48,107,33,92,80,107,33,100,70,65,113,76,163,61,150,65,113,61,150,61,77,65,113,61,77,76,64,65,113,76,64,74,102,132,205,131,207,131,199,132,205,131,199,132,203,132,205,132,203,132,204,92,178,107,166,108,193,108,193,107,166,116,178,108,193,116,178,120,204,120,204,116,178,123,187,120,204,123,187,127,208,127,208,123,187,128,194,127,208,128,194,129,208,129,208,128,194,131,199,129,208,131,199,131,207,76,163,65,113,107,166,76,163,107,166,92,178,61,77,61,150,21,113,157,77,157,150,117,113,
+276,57,276,196,24,196,24,164,243,164,243,57,142,97,142,128,20,128,20,97,283,76,283,80,
+243,164,243,57,276,57,243,164,276,57,276,196,243,164,276,196,24,196,243,164,24,196,24,164,
+142,97,142,128,20,128,20,97,283,76,283,80,276,86,268,94,
+142,97,142,128,20,128,142,97,20,128,20,97,
+283,76,283,80,276,86,268,94,252,112,244,123,216,162,230,168,241,177,249,188,254,199,256,211,253,228,246,241,233,251,217,258,196,260,110,260,110,252,122,251,128,248,132,244,134,237,134,98,132,91,129,87,121,85,110,84,109,76,190,76,190,84,178,85,171,87,168,92,166,100,166,157,190,157,199,143,206,133,210,127,213,121,216,116,224,101,232,90,239,82,246,77,252,76,16383,16383,166,166,166,251,185,251,199,248,210,243,217,234,221,222,222,209,221,196,216,184,209,175,199,168,187,166,188,166,16383,16383,361,165,352,220,329,267,292,305,246,329,193,338,137,330,89,305,52,268,28,221,19,166,28,111,51,63,88,26,135,1,190,-6,245,1,292,26,329,63,353,110,361,165,16383,16383,334,165,326,118,306,77,275,44,235,22,190,14,145,22,106,43,74,76,54,118,46,166,54,213,74,254,106,287,145,309,189,317,235,309,275,288,306,255,326,213,334,165,161,273,161,300,6,300,6,273,171,267,168,289,158,309,143,324,123,334,101,338,78,335,58,325,42,309,32,290,28,267,32,244,42,224,57,209,77,198,100,195,123,198,142,209,158,224,168,244,171,267,16383,16383,152,267,149,250,142,235,130,223,116,215,100,212,84,215,69,223,58,234,51,249,48,267,51,284,58,298,69,310,83,318,99,321,115,318,130,310,141,299,149,284,152,267,319,121,319,154,188,154,188,251,155,251,155,154,24,154,24,121,155,121,155,17,188,17,188,121,16383,16383,319,-43,319,-10,24,-10,24,-43,148,177,139,181,134,175,124,169,110,167,54,167,95,208,112,226,125,241,133,255,137,269,138,283,136,301,127,316,114,328,97,335,75,338,53,336,35,329,21,317,10,301,1,278,13,271,20,284,28,295,37,302,46,307,57,308,68,306,78,301,86,292,91,282,93,270,91,260,86,247,78,233,67,217,54,201,3,147,3,135,128,135,102,256,
+222,209,222,209,222,209,222,209,230,168,233,251,233,251,230,168,241,177,233,251,241,177,246,241,246,241,241,177,249,188,246,241,249,188,253,228,253,228,249,188,254,199,253,228,254,199,256,211,221,222,222,209,233,251,221,222,233,251,217,258,221,222,217,258,217,234,166,251,185,251,196,260,196,260,185,251,199,248,196,260,199,248,217,258,217,258,199,248,210,243,217,258,210,243,217,234,134,226,168,92,166,100,134,226,166,100,166,111,166,166,166,157,190,157,166,166,190,157,187,166,187,166,190,157,188,166,187,166,188,166,199,168,199,168,188,166,190,157,199,168,190,157,199,143,166,251,196,260,132,244,166,251,132,244,134,237,166,251,134,237,134,226,166,251,134,226,166,111,196,260,110,260,122,251,196,260,122,251,128,248,196,260,128,248,132,244,213,121,216,162,216,184,216,184,216,162,230,168,216,184,230,168,221,196,221,196,230,168,222,209,213,121,216,184,210,127,210,127,216,184,209,175,210,127,209,175,206,133,206,133,209,175,199,168,206,133,199,168,199,143,232,90,239,82,244,123,244,123,239,82,246,77,244,123,246,77,252,112,252,112,246,77,252,76,252,112,252,76,260,103,260,103,252,76,283,76,260,103,283,76,268,94,268,94,283,76,276,86,244,123,216,162,216,116,244,123,216,116,224,101,244,123,224,101,232,90,190,76,190,84,178,85,190,76,178,85,171,87,190,76,171,87,134,108,190,76,134,108,134,98,190,76,134,98,132,91,190,76,132,91,129,87,190,76,129,87,121,85,190,76,121,85,110,84,190,76,110,84,109,76,134,111,134,108,171,87,134,111,171,87,168,92,134,111,168,92,134,226,193,338,189,317,235,309,193,338,235,309,246,329,246,329,235,309,275,288,246,329,275,288,292,305,292,305,275,288,306,255,292,305,306,255,329,267,329,267,306,255,326,213,329,267,326,213,334,165,334,165,352,220,329,267,334,165,353,110,352,220,329,63,353,110,334,165,329,63,334,165,326,118,329,63,326,118,306,77,329,63,306,77,292,26,190,14,190,-6,235,22,235,22,190,-6,245,1,235,22,245,1,275,44,275,44,245,1,292,26,275,44,292,26,306,77,54,213,74,254,89,305,89,305,74,254,106,287,89,305,106,287,137,330,137,330,106,287,145,309,137,330,145,309,193,338,193,338,145,309,189,317,28,111,51,63,28,221,28,221,51,63,46,166,52,268,46,166,54,213,52,268,54,213,89,305,145,22,106,43,135,1,145,22,135,1,190,-6,145,22,190,-6,190,14,88,26,135,1,106,43,88,26,106,43,74,76,88,26,74,76,54,118,88,26,54,118,51,63,46,166,51,63,54,118,28,111,28,221,19,166,28,221,46,166,52,268,352,220,353,110,361,165,216,116,216,162,213,121,276,86,283,76,283,80,122,251,110,260,110,252,
+161,273,161,300,6,300,6,273,171,267,168,289,158,309,143,324,
+161,273,161,300,6,300,161,273,6,300,6,273,
+171,267,168,289,158,309,143,324,123,334,101,338,78,335,58,325,42,309,32,290,28,267,32,244,42,224,57,209,77,198,100,195,123,198,142,209,158,224,168,244,171,267,16383,16383,152,267,149,250,142,235,130,223,116,215,100,212,84,215,69,223,58,234,51,249,48,267,51,284,58,298,69,310,83,318,99,321,115,318,130,310,141,299,149,284,152,267,319,121,319,154,188,154,188,251,155,251,155,154,24,154,24,121,155,121,155,17,188,17,188,121,16383,16383,319,-43,319,-10,24,-10,24,-43,148,177,139,181,134,175,124,169,110,167,54,167,95,208,112,226,125,241,133,255,137,269,138,283,136,301,127,316,114,328,97,335,75,338,53,336,35,329,21,317,10,301,1,278,13,271,20,284,28,295,37,302,
+83,318,99,321,99,321,101,338,99,321,115,318,101,338,115,318,123,334,123,334,115,318,130,310,123,334,130,310,143,324,143,324,130,310,141,299,143,324,141,299,149,284,171,267,168,289,168,244,168,244,168,289,158,309,168,244,158,309,158,224,158,224,158,309,152,267,158,224,152,267,149,250,158,224,149,250,142,209,142,209,149,250,142,235,142,209,142,235,130,223,158,309,143,324,149,284,158,309,149,284,152,267,142,209,130,223,123,198,123,198,130,223,116,215,123,198,116,215,100,195,100,195,116,215,100,212,58,298,69,310,78,335,78,335,69,310,83,318,78,335,83,318,101,338,101,338,83,318,99,321,42,309,48,267,51,284,42,309,51,284,58,325,58,325,51,284,58,298,58,325,58,298,78,335,84,215,69,223,77,198,84,215,77,198,100,195,84,215,100,195,100,212,48,267,42,224,51,249,51,249,42,224,57,209,51,249,57,209,58,234,58,234,57,209,77,198,58,234,77,198,69,223,28,267,32,244,32,290,32,290,32,244,42,224,32,290,42,224,42,309,42,309,42,224,48,267,
+319,121,319,154,188,154,188,251,155,251,155,154,24,154,24,121,155,121,155,17,188,17,188,121,16383,16383,319,-43,319,-10,24,-10,24,-43,148,177,139,181,134,175,124,169,110,167,54,167,95,208,112,226,125,241,133,255,137,269,138,283,136,301,127,316,114,328,97,335,75,338,
+188,251,155,251,188,17,188,17,155,251,155,154,188,17,155,154,155,121,155,121,155,154,24,154,155,121,24,154,24,121,188,121,319,121,188,154,24,-10,24,-43,319,-43,24,-10,319,-43,319,-10,188,154,319,121,319,154,188,17,155,121,155,17,
+148,177,139,181,134,175,124,169,110,167,54,167,95,208,112,226,125,241,133,255,137,269,138,283,136,301,127,316,114,328,97,335,75,338,53,336,35,329,21,317,10,301,1,278,13,271,20,284,28,295,37,302,46,307,57,308,68,306,78,301,86,292,91,282,93,270,91,260,86,247,78,233,67,217,54,201,3,147,3,135,128,135,102,256,114,263,123,271,129,279,131,288,132,296,130,310,122,321,110,330,95,336,78,338,61,336,46,331,33,322,22,309,11,291,23,281,31,293,39,301,47,306,56,309,66,310,76,309,83,306,89,301,93,295,94,286,92,276,87,267,78,259,65,252,46,244,46,230,52,231,59,231,60,232,76,230,88,225,97,216,103,205,105,190,
+54,201,3,147,54,167,54,201,54,167,95,208,54,201,95,208,67,217,13,271,20,284,21,317,21,317,20,284,28,295,21,317,28,295,35,329,35,329,28,295,37,302,35,329,37,302,53,336,53,336,37,302,46,307,53,336,46,307,57,308,57,308,68,306,75,338,75,338,68,306,78,301,75,338,78,301,97,335,97,335,78,301,86,292,97,335,86,292,91,282,10,301,1,278,13,271,10,301,13,271,21,317,91,260,95,208,93,270,93,270,95,208,97,335,97,335,95,208,112,226,97,335,112,226,114,328,114,328,112,226,125,241,114,328,125,241,127,316,127,316,125,241,133,255,127,316,133,255,136,301,136,301,133,255,137,269,136,301,137,269,138,283,97,335,91,282,93,270,75,338,53,336,57,308,95,208,91,260,86,247,95,208,86,247,78,233,95,208,78,233,67,217,129,172,124,169,128,135,128,135,124,169,117,168,128,135,117,168,110,167,128,135,110,167,54,167,128,135,54,167,3,147,148,177,139,181,134,175,148,177,134,175,129,172,148,177,129,172,128,135,128,135,3,147,3,135,
+102,256,114,263,123,271,129,279,131,288,132,296,130,310,122,321,110,330,95,336,78,338,61,336,46,331,33,322,22,309,11,291,23,281,31,293,39,301,47,306,56,309,66,310,76,309,83,306,89,301,93,295,94,286,92,276,87,267,78,259,65,252,46,244,46,230,52,231,59,231,60,232,76,230,88,225,97,216,103,205,105,190,103,179,99,169,92,162,82,157,71,155,66,155,61,156,57,158,52,161,40,169,32,173,28,174,25,175,19,174,14,172,10,169,8,165,7,159,9,150,15,142,25,136,37,132,52,131,83,134,109,144,129,159,141,177,146,200,144,214,139,227,130,239,118,248,102,254,46,253,66,253,143,302,149,306,153,310,156,314,158,318,158,329,155,333,152,336,147,338,141,339,133,337,129,335,125,332,120,328,215,225,171,225,171,57,164,46,155,38,144,31,131,27,116,26,102,28,90,34,81,45,76,59,74,78,74,225,30,225,30,27,29,14,26,-5,22,-28,19,-51,18,-69,19,-82,22,-93,26,-101,32,-106,40,-108,48,-106,55,-102,60,-94,63,-83,64,-69,62,-51,58,-29,52,-6,48,14,46,32,55,18,66,8,77,1,91,-3,107,-4,123,-2,137,2,150,11,162,24,172,40,174,40,176,24,182,11,191,2,201,-2,211,-4,222,-3,231,0,239,4,247,12,256,23,256,28,
+66,155,61,156,83,134,83,134,61,156,57,158,83,134,57,158,52,131,52,131,57,158,52,161,52,131,52,161,46,165,56,231,59,231,65,252,65,252,59,231,60,232,60,232,76,230,65,252,65,252,76,230,78,259,65,252,46,244,52,231,65,252,52,231,56,231,23,281,31,293,33,322,33,322,31,293,39,301,33,322,39,301,46,331,46,331,39,301,47,306,46,331,47,306,61,336,61,336,47,306,56,309,61,336,56,309,66,310,66,310,76,309,78,338,78,338,76,309,83,306,78,338,83,306,95,336,95,336,83,306,89,301,95,336,89,301,93,295,22,309,11,291,23,281,22,309,23,281,33,322,103,179,99,169,109,144,109,144,99,169,92,162,109,144,92,162,83,134,83,134,92,162,82,157,83,134,82,157,71,155,71,155,66,155,83,134,95,336,94,286,97,216,95,336,97,216,110,330,110,330,97,216,102,256,110,330,102,256,114,263,78,338,61,336,66,310,130,310,122,321,123,271,130,310,123,271,129,279,130,310,129,279,131,288,130,310,131,288,132,296,122,321,110,330,114,263,122,321,114,263,123,271,102,254,102,256,97,216,102,254,97,216,103,205,102,254,103,205,118,248,92,276,87,267,88,225,92,276,88,225,97,216,92,276,97,216,94,286,78,259,76,230,88,225,78,259,88,225,87,267,141,177,146,200,144,214,141,177,144,214,139,227,141,177,139,227,130,239,141,177,130,239,129,159,103,179,109,144,105,190,105,190,109,144,118,248,118,248,109,144,129,159,118,248,129,159,130,239,105,190,118,248,103,205,40,169,36,171,37,132,40,169,37,132,52,131,40,169,52,131,46,165,37,132,36,171,32,173,37,132,32,173,28,174,37,132,28,174,25,175,37,132,25,175,25,136,19,174,14,172,15,142,19,174,15,142,25,136,19,174,25,136,25,175,10,169,8,165,9,150,10,169,9,150,15,142,10,169,15,142,14,172,52,231,46,244,46,230,9,150,8,165,7,159,95,336,93,295,94,286,
+46,253,66,253,143,302,149,306,153,310,156,314,158,318,158,329,155,333,152,336,147,338,141,339,133,337,129,335,125,332,120,328,215,225,171,225,171,57,164,46,155,38,144,31,131,27,116,26,102,28,90,34,81,45,76,59,74,78,74,225,30,225,30,27,
+141,339,143,302,147,338,147,338,143,302,149,306,147,338,149,306,152,336,152,336,149,306,153,310,152,336,153,310,155,333,155,333,153,310,156,314,155,333,156,314,158,329,158,329,156,314,158,318,158,329,158,318,158,323,143,302,141,339,137,338,143,302,137,338,133,337,143,302,133,337,129,335,143,302,129,335,125,332,143,302,125,332,120,328,143,302,120,328,66,253,66,253,120,328,46,253,
+215,225,171,225,171,57,164,46,155,38,144,31,131,27,116,26,102,28,90,34,81,45,76,59,74,78,74,225,30,225,30,27,29,14,26,-5,22,-28,19,-51,18,-69,19,-82,22,-93,26,-101,32,-106,40,-108,48,-106,55,-102,60,-94,63,-83,64,-69,62,-51,58,-29,52,-6,48,14,46,32,55,18,66,8,77,1,91,-3,107,-4,123,-2,137,2,150,11,162,24,172,40,174,40,176,24,182,11,191,2,201,-2,211,-4,222,-3,231,0,239,4,247,12,256,23,256,28,249,22,244,18,239,15,235,14,230,13,224,15,220,19,217,26,215,36,215,48,266,-76,266,-65,247,-62,234,-58,227,-50,223,-38,222,-20,222,271,223,290,227,304,234,313,247,318,266,321,266,331,134,331,95,327,66,316,46,297,34,270,30,235,34,199,46,172,66,154,93,142,127,137,127,-14,126,-35,123,-49,115,-58,102,-63,83,-65,83,-76,160,-76,160,320,189,320,189,-76,16383,16383,127,147,105,153,88,164,77,182,70,206,68,237,70,266,75,289,86,305,103,315,127,320,90,127,89,135,85,143,79,149,71,154,63,155,54,154,46,150,40,144,37,136,35,127,37,118,40,111,46,105,54,101,63,99,71,101,79,105,85,111,89,118,
+46,32,46,32,46,32,46,32,74,225,30,225,46,32,30,225,32,-106,46,32,32,-106,40,-108,46,32,40,-108,48,-106,76,59,74,78,77,1,77,1,74,78,66,8,66,8,74,78,74,225,66,8,74,225,55,18,55,18,74,225,46,32,30,225,30,27,32,-106,32,-106,30,27,29,14,32,-106,29,14,26,-101,26,-101,29,14,26,-5,26,-101,26,-5,22,-28,18,-69,19,-82,19,-51,19,-51,19,-82,22,-93,19,-51,22,-93,22,-28,22,-28,22,-93,26,-101,171,225,171,57,172,40,172,40,171,57,164,46,172,40,164,46,162,24,162,24,164,46,155,38,162,24,155,38,150,11,150,11,155,38,144,31,150,11,144,31,137,2,137,2,144,31,131,27,137,2,131,27,123,-2,123,-2,131,27,116,26,123,-2,116,26,107,-4,107,-4,116,26,102,28,107,-4,102,28,91,-3,91,-3,102,28,90,34,91,-3,90,34,81,45,81,45,76,59,77,1,81,45,77,1,91,-3,215,225,171,225,172,40,215,225,172,40,174,40,215,225,174,40,176,24,215,225,176,24,182,11,215,225,182,11,191,2,215,225,191,2,201,-2,215,225,201,-2,211,-4,215,225,211,-4,215,48,249,22,244,18,247,12,247,12,244,18,239,15,247,12,239,15,239,4,239,4,239,15,235,14,239,4,235,14,231,0,231,0,235,14,230,13,249,22,247,12,256,23,249,22,256,23,256,28,224,15,220,19,222,-3,224,15,222,-3,231,0,224,15,231,0,230,13,215,48,211,-4,215,36,215,36,211,-4,222,-3,215,36,222,-3,217,26,217,26,222,-3,220,19,48,14,48,-106,52,-6,52,-6,48,-106,55,-102,52,-6,55,-102,58,-29,58,-29,55,-102,60,-94,58,-29,60,-94,62,-51,62,-51,60,-94,63,-83,62,-51,63,-83,64,-69,46,32,48,-106,48,14,
+266,-76,266,-65,247,-62,234,-58,227,-50,223,-38,222,-20,222,271,223,290,227,304,234,313,247,318,266,321,266,331,134,331,95,327,66,316,46,297,34,270,30,235,34,199,46,172,66,154,93,142,127,137,127,-14,126,-35,123,-49,115,-58,102,-63,83,-65,83,-76,160,-76,160,320,189,320,189,-76,16383,16383,127,147,105,153,88,164,77,182,70,206,68,237,70,266,75,289,86,305,103,315,127,320,90,127,89,135,85,143,79,149,71,154,63,155,54,154,46,150,40,144,37,136,35,127,37,118,40,111,46,105,54,101,63,99,71,101,79,105,85,111,89,118,90,127,87,0,70,0,49,-49,52,-51,55,-50,57,-50,60,-49,66,-49,76,-50,84,-52,89,-55,92,-60,93,-67,92,-74,88,-81,83,-85,75,-88,65,-89,59,-89,47,-87,40,-86,33,-83,26,-98,35,-102,51,-106,59,-106,68,-107,
+123,-49,115,-58,160,-76,160,-76,115,-58,102,-63,160,-76,102,-63,83,-65,134,331,95,327,103,315,134,331,103,315,127,320,134,331,127,320,127,137,134,331,127,137,160,-76,134,331,160,-76,160,320,134,331,160,320,266,331,127,320,127,147,127,137,105,153,88,164,93,142,93,142,88,164,77,182,93,142,77,182,66,154,66,154,77,182,70,206,66,154,70,206,68,237,68,237,70,266,66,316,66,316,70,266,75,289,66,316,75,289,95,327,95,327,75,289,86,305,95,327,86,305,103,315,66,316,46,297,46,172,66,316,46,172,66,154,66,316,66,154,68,237,247,318,266,321,266,331,247,318,266,331,234,313,234,313,266,331,189,320,234,313,189,320,227,304,227,304,189,320,223,290,234,-58,227,-50,189,-76,189,-76,227,-50,223,-38,189,-76,223,-38,189,320,189,320,223,-38,222,-20,189,320,222,-20,222,271,160,-76,127,137,127,-14,160,-76,127,-14,126,-35,160,-76,126,-35,123,-49,266,-76,266,-65,247,-62,266,-76,247,-62,234,-58,266,-76,234,-58,189,-76,105,153,93,142,127,137,105,153,127,137,127,147,34,199,46,172,46,297,34,199,46,297,34,270,34,199,34,270,30,235,160,-76,83,-65,83,-76,266,331,160,320,189,320,223,290,189,320,222,271,
+90,127,89,135,85,143,79,149,71,154,63,155,54,154,46,150,40,144,37,136,35,127,37,118,40,111,46,105,54,101,63,99,71,101,79,105,85,111,89,118,90,127,87,0,70,0,49,-49,52,-51,55,-50,57,-50,60,-49,66,-49,76,-50,84,-52,89,-55,92,-60,93,-67,92,-74,88,-81,83,-85,75,-88,65,-89,59,-89,47,-87,40,-86,
+35,127,37,118,37,136,37,136,37,118,40,111,37,136,40,111,40,144,40,144,40,111,46,105,40,144,46,105,46,150,46,150,46,105,54,101,46,150,54,101,54,154,54,154,54,101,62,99,54,154,62,99,63,155,63,155,62,99,71,101,63,155,71,101,71,154,71,154,71,101,79,105,71,154,79,105,79,149,79,149,79,105,85,111,79,149,85,111,85,143,85,143,85,111,89,118,85,143,89,118,89,135,89,135,89,118,90,127,
+87,0,70,0,49,-49,52,-51,55,-50,57,-50,60,-49,66,-49,76,-50,84,-52,89,-55,92,-60,93,-67,92,-74,88,-81,83,-85,75,-88,65,-89,59,-89,47,-87,40,-86,33,-83,26,-98,35,-102,51,-106,59,-106,68,-107,89,-105,107,-99,120,-91,128,-79,131,-64,129,-52,123,-43,114,-36,102,-32,88,-30,80,-30,77,-31,75,-31,124,135,124,147,113,148,105,150,99,154,96,159,95,166,95,336,89,338,30,310,30,299,36,302,41,304,45,305,52,305,54,301,55,297,55,157,52,153,47,150,40,148,28,147,28,135,152,271,148,293,139,312,123,326,103,335,79,338,54,335,33,325,17,310,6,291,3,267,6,244,16,225,32,210,52,200,75,197,100,201,
+59,-106,68,-107,59,-89,59,-89,68,-107,65,-89,75,-88,65,-89,68,-107,75,-88,68,-107,89,-105,57,-50,60,-49,70,0,70,0,60,-49,63,-49,70,0,63,-49,66,-49,66,-49,76,-50,70,0,70,0,76,-50,75,-31,70,0,75,-31,87,0,70,0,49,-49,52,-51,70,0,52,-51,55,-50,70,0,55,-50,57,-50,131,-64,129,-52,128,-79,128,-79,129,-52,123,-43,128,-79,123,-43,120,-91,120,-91,123,-43,114,-36,120,-91,114,-36,107,-99,107,-99,114,-36,102,-32,107,-99,102,-32,93,-67,93,-67,102,-32,92,-60,89,-55,92,-60,102,-32,89,-55,102,-32,88,-30,89,-55,88,-30,85,-30,89,-55,85,-30,84,-52,84,-52,85,-30,82,-30,84,-52,82,-30,80,-30,84,-52,80,-30,77,-31,84,-52,77,-31,76,-50,107,-99,93,-67,92,-74,107,-99,92,-74,89,-105,89,-105,92,-74,88,-81,89,-105,88,-81,83,-85,33,-83,35,-102,40,-86,40,-86,35,-102,43,-104,40,-86,43,-104,47,-87,47,-87,43,-104,51,-106,47,-87,51,-106,53,-88,53,-88,51,-106,59,-106,53,-88,59,-106,59,-89,35,-102,33,-83,26,-98,75,-88,89,-105,83,-85,75,-31,76,-50,77,-31,
+124,135,124,147,113,148,105,150,99,154,96,159,95,166,95,336,89,338,30,310,30,299,36,302,41,304,45,305,52,305,54,301,55,297,55,157,52,153,47,150,40,148,28,147,28,135,152,271,148,293,139,312,123,326,103,335,79,338,54,335,33,325,17,310,6,291,3,267,6,244,16,225,32,210,52,200,75,197,100,201,121,211,138,227,148,247,152,271,16383,16383,116,258,
+52,153,47,150,124,135,124,135,47,150,40,148,124,135,40,148,28,147,41,304,45,305,89,338,89,338,45,305,48,305,89,338,48,305,50,305,50,305,52,305,89,338,89,338,52,305,53,303,89,338,53,303,54,301,113,148,105,150,124,135,124,135,105,150,99,154,124,135,99,154,55,164,55,164,99,154,96,159,55,164,96,159,55,291,55,297,55,291,89,338,55,297,89,338,54,301,36,302,41,304,89,338,36,302,89,338,30,310,36,302,30,310,30,299,95,166,95,336,89,338,95,166,89,338,55,291,95,166,55,291,96,159,55,157,52,153,124,135,55,157,124,135,55,164,124,135,28,147,28,135,113,148,124,135,124,147,
+152,271,148,293,139,312,123,326,103,335,79,338,54,335,33,325,17,310,6,291,3,267,6,244,16,225,32,210,52,200,75,197,100,201,121,211,138,227,148,247,152,271,16383,16383,116,258,114,242,110,230,102,221,93,216,80,214,73,214,66,216,56,224,52,230,44,250,42,261,40,273,40,285,41,297,46,307,53,315,63,320,74,321,88,318,99,310,108,297,114,279,116,258,229,111,189,147,174,161,143,192,130,204,124,208,122,208,121,207,119,206,118,204,118,203,119,199,122,193,127,185,134,176,143,165,150,155,158,145,167,134,176,122,185,111,143,58,134,47,127,38,122,31,119,25,118,22,118,19,119,18,121,17,123,17,130,21,142,32,158,46,174,61,189,75,16383,16383,132,111,92,147,62,177,46,192,34,204,27,208,26,208,24,207,23,206,
+44,250,52,200,48,240,48,240,52,200,52,230,56,224,52,230,52,200,56,224,52,200,75,197,42,261,40,273,33,325,42,261,33,325,32,210,42,261,32,210,52,200,42,261,52,200,44,250,33,325,40,285,41,297,33,325,41,297,54,335,54,335,41,297,46,307,54,335,46,307,53,315,3,267,6,244,6,291,6,291,6,244,16,225,6,291,16,225,17,310,17,310,16,225,32,210,17,310,32,210,33,325,103,335,79,338,88,318,88,318,79,338,74,321,63,320,74,321,79,338,63,320,79,338,54,335,114,242,110,230,121,211,121,211,110,230,102,221,121,211,102,221,100,201,100,201,102,221,93,216,100,201,93,216,80,214,80,214,73,214,75,197,75,197,73,214,66,216,75,197,66,216,61,220,152,271,148,293,148,247,148,247,148,293,139,312,148,247,139,312,138,227,138,227,139,312,123,326,138,227,123,326,121,211,121,211,123,326,116,258,88,318,99,310,103,335,103,335,99,310,108,297,103,335,108,297,123,326,123,326,108,297,114,279,123,326,114,279,116,258,80,214,75,197,100,201,54,335,53,315,63,320,114,242,121,211,116,258,56,224,75,197,61,220,33,325,40,273,40,285,
+229,111,189,147,174,161,143,192,130,204,124,208,122,208,121,207,119,206,118,204,118,203,119,199,122,193,127,185,134,176,143,165,150,155,158,145,167,134,176,122,185,111,143,58,134,47,127,38,122,31,119,25,118,22,118,19,119,18,121,17,123,17,130,21,142,32,158,46,174,61,189,75,16383,16383,132,111,92,147,62,177,46,192,34,204,27,208,26,208,24,207,23,206,22,204,22,203,23,199,26,193,31,185,38,176,46,165,53,155,61,145,70,134,79,122,89,111,46,58,38,47,31,38,26,31,23,25,22,22,22,19,23,18,25,17,27,17,33,21,45,32,61,46,77,61,92,75,357,45,357,74,329,74,329,203,305,203,204,70,204,45,294,45,294,0,329,0,329,45,16383,16383,294,74,227,74,294,163,16383,16383,316,338,293,338,66,-6,91,-6,16383,16383,112,135,112,147,100,148,92,150,87,154,84,159,83,166,83,336,76,338,22,310,22,299,29,302,34,304,38,305,45,305,47,301,47,157,44,153,40,150,32,148,21,147,21,135,371,42,362,46,357,40,352,36,346,34,340,33,333,32,276,32,318,73,335,91,347,106,355,120,360,134,361,148,358,166,350,181,337,193,320,200,298,203,275,201,257,194,243,182,232,165,223,143,235,136,243,149,251,159,259,167,269,171,280,173,
+92,75,132,111,92,147,92,75,92,147,89,111,92,75,89,111,77,61,53,155,61,145,62,177,62,177,61,145,70,134,62,177,70,134,78,161,78,161,70,134,79,122,78,161,79,122,92,147,92,147,79,122,89,111,53,155,62,177,46,165,46,165,62,177,46,192,46,165,46,192,38,176,38,176,46,192,34,204,38,176,34,204,31,185,31,185,34,204,27,208,31,185,27,208,26,193,26,193,27,208,26,208,26,193,26,208,24,207,23,206,22,204,23,199,23,206,23,199,26,193,23,206,26,193,24,207,189,75,229,111,189,147,189,75,189,147,185,111,189,75,185,111,174,61,150,155,158,145,158,177,158,177,158,145,167,134,158,177,167,134,174,161,174,161,167,134,176,122,174,161,176,122,189,147,189,147,176,122,185,111,150,155,158,177,143,165,143,165,158,177,143,192,143,165,143,192,134,176,134,176,143,192,130,204,134,176,130,204,127,185,127,185,130,204,124,208,127,185,124,208,122,208,122,193,127,185,122,208,122,193,122,208,121,207,122,193,121,207,119,206,122,193,119,206,119,199,118,204,118,203,119,199,118,204,119,199,119,206,119,18,121,17,122,31,122,31,121,17,123,17,122,31,123,17,127,38,127,38,123,17,130,21,127,38,130,21,134,47,134,47,130,21,142,32,134,47,142,32,143,58,143,58,142,32,158,46,143,58,158,46,185,111,185,111,158,46,174,61,119,25,118,22,118,20,119,25,118,20,118,19,119,25,118,19,119,18,119,25,119,18,122,31,23,18,25,17,26,31,26,31,25,17,27,17,26,31,27,17,31,38,31,38,27,17,33,21,31,38,33,21,38,47,38,47,33,21,45,32,38,47,45,32,46,58,46,58,45,32,61,46,46,58,61,46,89,111,89,111,61,46,77,61,23,25,22,22,22,20,23,25,22,20,22,19,23,25,22,19,23,18,23,25,23,18,26,31,23,199,22,204,22,203,
+357,45,357,74,329,74,329,203,305,203,204,70,204,45,294,45,294,0,329,0,329,45,16383,16383,294,74,227,74,294,163,16383,16383,316,338,293,338,66,-6,91,-6,16383,16383,112,135,112,147,100,148,92,150,87,154,84,159,83,166,83,336,76,338,22,310,22,299,29,302,34,304,38,305,45,305,47,301,47,157,44,153,40,150,32,148,21,147,21,135,371,42,362,46,357,40,352,36,346,34,340,33,333,32,276,32,318,73,335,91,347,106,355,120,360,134,361,148,358,166,350,181,337,193,320,200,298,203,275,201,257,194,243,182,232,165,223,143,235,136,243,149,251,159,259,167,269,171,280,173,291,171,301,166,308,158,313,147,315,135,313,125,308,112,301,98,290,82,276,66,225,12,225,0,351,0,
+204,45,294,45,204,70,204,70,294,45,227,74,204,70,227,74,305,203,305,203,227,74,294,163,305,203,294,163,329,0,329,0,294,163,294,74,329,0,294,74,294,45,294,45,294,74,227,74,305,203,329,0,329,203,329,74,329,45,357,45,329,74,357,45,357,74,293,338,66,-6,91,-6,293,338,91,-6,316,338,44,153,40,150,112,135,112,135,40,150,32,148,112,135,32,148,21,147,34,304,38,305,76,338,76,338,38,305,41,305,76,338,41,305,43,305,43,305,45,305,76,338,76,338,45,305,46,303,76,338,46,303,47,301,100,148,92,150,112,135,112,135,92,150,87,154,112,135,87,154,47,164,47,164,87,154,84,159,47,164,84,159,47,291,47,297,47,291,76,338,47,297,76,338,47,301,29,302,34,304,76,338,29,302,76,338,22,310,29,302,22,310,22,299,83,166,83,336,76,338,83,166,76,338,47,291,83,166,47,291,84,159,47,157,44,153,112,135,47,157,112,135,47,164,112,135,21,147,21,135,100,148,112,135,112,147,329,0,294,45,294,0,
+371,42,362,46,357,40,352,36,346,34,340,33,333,32,276,32,318,73,335,91,347,106,355,120,360,134,361,148,358,166,350,181,337,193,320,200,298,203,275,201,257,194,243,182,232,165,223,143,235,136,243,149,251,159,259,167,269,171,280,173,291,171,301,166,308,158,313,147,315,135,313,125,308,112,301,98,290,82,276,66,225,12,225,0,351,0,16383,16383,297,338,275,338,48,-6,73,-6,16383,16383,108,135,108,147,97,148,89,150,84,154,81,159,80,166,80,336,73,338,19,310,19,299,26,302,31,304,35,305,42,305,44,301,44,297,45,291,45,164,44,157,41,153,37,150,29,148,18,147,18,135,359,45,359,74,331,74,331,203,308,203,206,70,206,45,296,45,296,0,331,0,331,45,16383,16383,296,74,229,74,296,163,16383,16383,319,338,296,338,69,-6,94,-6,16383,16383,102,256,114,263,123,271,129,279,131,288,132,296,130,310,122,321,110,330,95,336,78,338,61,336,46,331,33,322,22,309,11,291,23,281,31,293,39,301,47,306,56,309,66,310,76,309,83,306,89,301,93,295,94,286,92,276,87,267,78,259,65,252,46,244,46,230,52,231,59,231,60,232,76,230,88,225,97,216,103,205,105,190,103,179,99,169,92,162,82,157,71,155,66,155,61,156,57,158,52,161,40,169,32,173,28,174,
+308,112,301,98,318,73,318,73,301,98,290,82,318,73,290,82,276,66,276,66,225,12,276,32,276,32,225,12,351,0,276,32,351,0,333,32,340,33,333,32,351,0,340,33,351,0,346,34,346,34,351,0,352,36,235,136,243,149,243,182,243,182,243,149,251,159,243,182,251,159,257,194,257,194,251,159,259,167,257,194,259,167,275,201,275,201,259,167,269,171,275,201,269,171,280,173,280,173,291,171,298,203,298,203,291,171,301,166,298,203,301,166,320,200,320,200,301,166,308,158,320,200,308,158,313,147,232,165,223,143,235,136,232,165,235,136,243,182,371,42,362,46,357,40,371,42,357,40,352,36,371,42,352,36,351,0,275,338,48,-6,73,-6,275,338,73,-6,297,338,41,153,37,150,108,135,108,135,37,150,29,148,108,135,29,148,18,147,31,304,35,305,73,338,73,338,35,305,38,305,73,338,38,305,40,305,40,305,42,305,73,338,73,338,42,305,43,303,73,338,43,303,44,301,97,148,89,150,108,135,108,135,89,150,84,154,108,135,84,154,45,164,45,164,84,154,81,159,45,164,81,159,45,291,44,297,45,291,73,338,44,297,73,338,44,301,26,302,31,304,73,338,26,302,73,338,19,310,26,302,19,310,19,299,80,166,80,336,73,338,80,166,73,338,45,291,80,166,45,291,81,159,313,125,318,73,315,135,315,135,318,73,320,200,320,200,318,73,335,91,320,200,335,91,337,193,337,193,335,91,347,106,337,193,347,106,350,181,350,181,347,106,355,120,350,181,355,120,358,166,358,166,355,120,360,134,358,166,360,134,361,148,320,200,313,147,315,135,298,203,275,201,280,173,276,66,276,32,318,73,44,157,41,153,108,135,44,157,108,135,45,164,108,135,18,147,18,135,97,148,108,135,108,147,308,112,318,73,313,125,351,0,225,12,225,0,
+359,45,359,74,331,74,331,203,308,203,206,70,206,45,296,45,296,0,331,0,331,45,16383,16383,296,74,229,74,296,163,16383,16383,319,338,296,338,69,-6,94,-6,16383,16383,102,256,114,263,123,271,129,279,131,288,132,296,130,310,122,321,110,330,95,336,78,338,61,336,46,331,33,322,22,309,11,291,23,281,31,293,39,301,47,306,56,309,66,310,76,309,83,306,89,301,93,295,94,286,92,276,87,267,78,259,65,252,46,244,46,230,52,231,59,231,60,232,76,230,88,225,97,216,103,205,105,190,103,179,99,169,92,162,82,157,71,155,66,155,61,156,57,158,52,161,40,169,32,173,28,174,25,175,19,174,14,172,10,169,8,165,7,159,9,150,15,142,25,136,37,132,52,131,83,134,109,144,129,159,141,177,146,200,144,214,139,227,130,239,118,248,102,254,130,208,129,216,125,223,119,229,112,232,103,233,95,232,87,229,82,223,78,217,77,208,78,199,82,192,87,186,95,182,103,180,112,182,119,186,125,192,129,199,130,208,16383,16383,100,147,96,128,91,112,85,97,77,84,68,70,46,42,31,20,22,2,17,-13,15,-30,16,-42,18,-52,22,-62,27,-71,33,-79,45,-89,58,-97,74,-103,90,-107,107,-108,133,-104,155,-94,173,-79,184,-59,188,-35,187,-24,184,-16,179,-10,173,-6,164,-5,157,-5,151,-8,147,-12,144,-18,143,-25,145,-33,147,-37,150,-42,154,-46,160,-54,161,-57,162,-59,162,-62,160,-71,153,-80,142,-87,130,-91,116,-93,98,-90,83,-81,71,-69,64,-52,61,-34,62,-19,64,-4,67,11,72,27,79,44,93,75,101,99,106,118,108,133,108,147,225,378,153,453,148,457,144,460,140,462,132,464,125,463,120,461,117,458,
+206,45,296,45,206,70,206,70,296,45,229,74,206,70,229,74,308,203,308,203,229,74,296,163,308,203,296,163,331,0,331,0,296,163,296,74,331,0,296,74,296,45,296,45,296,74,229,74,308,203,331,0,331,203,331,74,331,45,359,45,331,74,359,45,359,74,296,338,69,-6,94,-6,296,338,94,-6,319,338,66,155,61,156,83,134,83,134,61,156,57,158,83,134,57,158,52,131,52,131,57,158,52,161,52,131,52,161,46,165,56,231,59,231,65,252,65,252,59,231,60,232,60,232,76,230,65,252,65,252,76,230,78,259,65,252,46,244,52,231,65,252,52,231,56,231,23,281,31,293,33,322,33,322,31,293,39,301,33,322,39,301,46,331,46,331,39,301,47,306,46,331,47,306,61,336,61,336,47,306,56,309,61,336,56,309,66,310,66,310,76,309,78,338,78,338,76,309,83,306,78,338,83,306,95,336,95,336,83,306,89,301,95,336,89,301,93,295,22,309,11,291,23,281,22,309,23,281,33,322,103,179,99,169,109,144,109,144,99,169,92,162,109,144,92,162,83,134,83,134,92,162,82,157,83,134,82,157,71,155,71,155,66,155,83,134,95,336,94,286,97,216,95,336,97,216,110,330,110,330,97,216,102,256,110,330,102,256,114,263,78,338,61,336,66,310,130,310,122,321,123,271,130,310,123,271,129,279,130,310,129,279,131,288,130,310,131,288,132,296,122,321,110,330,114,263,122,321,114,263,123,271,102,254,102,256,97,216,102,254,97,216,103,205,102,254,103,205,118,248,92,276,87,267,88,225,92,276,88,225,97,216,92,276,97,216,94,286,78,259,76,230,88,225,78,259,88,225,87,267,141,177,146,200,144,214,141,177,144,214,139,227,141,177,139,227,130,239,141,177,130,239,129,159,103,179,109,144,105,190,105,190,109,144,118,248,118,248,109,144,129,159,118,248,129,159,130,239,105,190,118,248,103,205,40,169,36,171,37,132,40,169,37,132,52,131,40,169,52,131,46,165,37,132,36,171,32,173,37,132,32,173,28,174,37,132,28,174,25,175,37,132,25,175,25,136,19,174,14,172,15,142,19,174,15,142,25,136,19,174,25,136,25,175,10,169,8,165,9,150,10,169,9,150,15,142,10,169,15,142,14,172,52,231,46,244,46,230,9,150,8,165,7,159,95,336,93,295,94,286,331,0,296,45,296,0,
+130,208,129,216,125,223,119,229,112,232,103,233,95,232,87,229,82,223,78,217,77,208,78,199,82,192,87,186,95,182,103,180,112,182,119,186,125,192,129,199,130,208,16383,16383,100,147,96,128,91,112,85,97,77,84,68,70,46,42,31,20,22,2,17,-13,15,-30,16,-42,18,-52,22,-62,27,-71,33,-79,45,-89,58,-97,74,-103,90,-107,107,-108,133,-104,155,-94,173,-79,184,-59,188,-35,187,-24,184,-16,179,-10,173,-6,164,-5,157,-5,151,-8,147,-12,144,-18,143,-25,145,-33,147,-37,150,-42,154,-46,160,-54,161,-57,162,-59,162,-62,160,-71,153,-80,142,-87,130,-91,116,-93,98,-90,83,-81,71,-69,64,-52,61,-34,62,-19,64,-4,67,11,72,27,79,44,93,75,101,99,106,118,108,133,108,147,225,378,153,453,148,457,144,460,140,462,132,464,125,463,120,461,117,458,114,454,113,448,114,443,116,439,119,434,123,430,128,426,205,378,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,138,378,158,378,235,427,245,435,248,439,249,443,250,448,249,454,247,458,243,461,239,463,233,464,228,463,224,462,221,460,216,457,211,453,16383,16383,353,0,353,9,340,12,
+103,180,112,182,112,232,112,232,112,182,119,186,112,232,119,186,119,229,119,229,119,186,125,192,119,229,125,192,125,223,125,223,125,192,129,199,125,223,129,199,129,216,129,216,129,199,130,208,78,217,78,199,82,223,82,223,78,199,82,192,82,223,82,192,87,229,87,229,82,192,87,186,87,229,87,186,95,232,95,232,87,186,95,182,95,232,95,182,103,233,103,233,95,182,103,180,103,233,103,180,112,232,72,27,79,44,77,84,72,27,77,84,68,70,68,70,46,42,62,-19,62,-19,46,42,61,-34,64,-52,61,-34,58,-97,64,-52,58,-97,74,-103,68,70,62,-19,64,-4,68,70,64,-4,67,11,68,70,67,11,72,27,33,-79,45,-89,46,42,46,42,45,-89,58,-97,46,42,58,-97,61,-34,31,20,22,2,22,-62,31,20,22,-62,27,-71,31,20,27,-71,33,-79,31,20,33,-79,46,42,15,-30,16,-42,17,-13,17,-13,16,-42,18,-52,17,-13,18,-52,22,2,22,2,18,-52,22,-62,108,147,100,147,101,99,108,147,101,99,106,118,108,147,106,118,108,133,96,128,91,112,93,75,96,128,93,75,101,99,96,128,101,99,100,147,85,97,77,84,79,44,85,97,79,44,93,75,85,97,93,75,91,112,160,-71,153,-80,155,-94,155,-94,153,-80,142,-87,155,-94,142,-87,133,-104,133,-104,142,-87,130,-91,133,-104,130,-91,116,-93,116,-93,98,-90,107,-108,107,-108,98,-90,90,-107,83,-81,71,-69,74,-103,83,-81,74,-103,90,-107,83,-81,90,-107,98,-90,147,-37,150,-42,151,-8,151,-8,150,-42,154,-46,151,-8,154,-46,157,-5,157,-5,154,-46,157,-50,157,-5,157,-50,164,-5,164,-5,157,-50,160,-54,164,-5,160,-54,161,-57,143,-25,144,-29,144,-18,144,-18,144,-29,145,-33,144,-18,145,-33,147,-12,147,-12,145,-33,147,-37,147,-12,147,-37,151,-8,173,-6,173,-79,179,-10,179,-10,173,-79,184,-59,179,-10,184,-59,184,-16,184,-16,184,-59,188,-35,184,-16,188,-35,187,-24,155,-94,173,-79,160,-71,160,-71,173,-79,162,-62,164,-5,162,-62,173,-79,164,-5,173,-79,173,-6,116,-93,107,-108,133,-104,164,-5,161,-57,162,-59,164,-5,162,-59,162,-62,64,-52,74,-103,71,-69,78,199,78,217,77,208,
+225,378,153,453,148,457,144,460,140,462,132,464,125,463,120,461,117,458,114,454,113,448,114,443,116,439,119,434,123,430,128,426,205,378,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,138,378,158,378,235,427,245,435,248,439,249,443,250,448,249,454,247,458,243,461,239,463,233,464,228,463,224,462,221,460,216,457,211,453,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,
+205,378,225,378,153,453,205,378,153,453,148,457,205,378,148,457,144,460,205,378,144,460,140,462,205,378,140,462,136,463,205,378,136,463,132,464,205,378,132,464,128,426,113,448,114,443,114,454,114,454,114,443,116,439,114,454,116,439,117,458,117,458,116,439,119,434,117,458,119,434,120,461,120,461,119,434,123,430,120,461,123,430,125,463,125,463,123,430,128,426,125,463,128,426,132,464,55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0,
+138,378,158,378,235,427,245,435,248,439,249,443,250,448,249,454,247,458,243,461,239,463,233,464,228,463,224,462,221,460,216,457,211,453,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,257,378,194,462,163,462,101,378,118,378,179,430,239,378,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,248,444,243,434,238,427,233,422,227,420,221,419,216,419,211,420,206,422,200,424,
+233,464,235,427,239,463,239,463,235,427,240,431,239,463,240,431,243,461,243,461,240,431,245,435,243,461,245,435,247,458,247,458,245,435,248,439,247,458,248,439,249,454,249,454,248,439,249,443,249,454,249,443,250,448,235,427,233,464,228,463,235,427,228,463,224,462,235,427,224,462,221,460,235,427,221,460,216,457,235,427,216,457,211,453,235,427,211,453,158,378,55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0,158,378,211,453,138,378,
+257,378,194,462,163,462,101,378,118,378,179,430,239,378,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,248,444,243,434,238,427,233,422,227,420,221,419,216,419,211,420,206,422,200,424,195,426,182,432,175,436,161,440,154,441,147,441,133,439,121,433,111,423,103,409,97,391,112,391,115,399,120,406,125,410,131,413,137,414,141,414,149,412,157,408,169,403,180,398,189,394,196,392,202,391,209,391,224,393,237,399,247,409,255,424,262,444,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,
+101,378,118,378,163,462,163,462,118,378,179,430,163,462,179,430,194,462,194,462,179,430,239,378,194,462,239,378,257,378,55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0,
+248,444,243,434,238,427,233,422,227,420,221,419,216,419,211,420,206,422,200,424,195,426,182,432,175,436,161,440,154,441,147,441,133,439,121,433,111,423,103,409,97,391,112,391,115,399,120,406,125,410,131,413,137,414,141,414,149,412,157,408,169,403,180,398,189,394,196,392,202,391,209,391,224,393,237,399,247,409,255,424,262,444,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,254,411,253,419,249,426,244,431,237,435,229,436,221,435,214,431,209,426,206,419,204,411,205,403,209,397,214,391,221,388,228,387,236,388,244,391,249,397,253,403,254,411,16383,16383,155,411,153,419,150,426,144,431,137,435,129,436,122,435,115,431,110,426,106,419,105,411,106,403,110,397,115,391,121,388,129,387,137,388,144,391,150,397,153,403,155,411,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,
+115,399,120,406,121,433,121,433,120,406,125,410,121,433,125,410,133,439,133,439,125,410,131,413,133,439,131,413,137,414,137,414,141,414,147,441,147,441,141,414,145,413,147,441,145,413,149,412,112,391,115,399,121,433,112,391,121,433,111,423,112,391,111,423,103,409,112,391,103,409,97,391,147,441,149,412,154,441,154,441,149,412,153,410,154,441,153,410,157,408,157,408,169,403,161,440,161,440,169,403,168,438,147,441,133,439,137,414,161,440,154,441,157,408,168,438,169,403,175,436,175,436,169,403,180,398,175,436,180,398,182,432,182,432,180,398,189,394,182,432,189,394,195,426,195,426,189,394,196,392,195,426,196,392,200,424,200,424,196,392,202,391,200,424,202,391,206,422,206,422,202,391,209,391,206,422,209,391,211,420,211,420,209,391,224,393,211,420,224,393,216,419,216,419,224,393,221,419,227,420,221,419,224,393,227,420,224,393,237,399,248,444,243,434,247,409,248,444,247,409,255,424,248,444,255,424,262,444,238,427,233,422,237,399,238,427,237,399,247,409,238,427,247,409,243,434,55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0,227,420,237,399,233,422,
+254,411,253,419,249,426,244,431,237,435,229,436,221,435,214,431,209,426,206,419,204,411,205,403,209,397,214,391,221,388,228,387,236,388,244,391,249,397,253,403,254,411,16383,16383,155,411,153,419,150,426,144,431,137,435,129,436,122,435,115,431,110,426,106,419,105,411,106,403,110,397,115,391,121,388,129,387,137,388,144,391,150,397,153,403,155,411,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,229,430,227,446,220,460,209,471,196,478,180,480,164,478,151,471,140,460,133,447,130,431,132,415,139,401,150,391,163,384,179,381,195,384,209,391,220,401,227,415,229,430,16383,16383,213,431,211,420,206,411,199,404,190,400,179,398,169,400,160,404,153,411,148,420,147,431,148,441,153,450,160,457,169,462,179,464,190,462,199,457,206,450,211,441,213,431,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,
+204,411,205,403,206,419,206,419,205,403,209,397,206,419,209,397,209,426,209,426,209,397,214,391,209,426,214,391,214,431,214,431,214,391,221,388,214,431,221,388,221,435,221,435,221,388,228,387,221,435,228,387,229,436,229,436,228,387,236,388,229,436,236,388,237,435,237,435,236,388,244,391,237,435,244,391,244,431,244,431,244,391,249,397,244,431,249,397,249,426,249,426,249,397,253,403,249,426,253,403,253,419,253,419,253,403,254,411,105,411,106,403,106,419,106,419,106,403,110,397,106,419,110,397,110,426,110,426,110,397,115,391,110,426,115,391,115,431,115,431,115,391,121,388,115,431,121,388,122,435,122,435,121,388,129,387,122,435,129,387,129,436,129,436,129,387,137,388,129,436,137,388,137,435,137,435,137,388,144,391,137,435,144,391,144,431,144,431,144,391,150,397,144,431,150,397,150,426,150,426,150,397,153,403,150,426,153,403,153,419,153,419,153,403,155,411,55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0,
+229,430,227,446,220,460,209,471,196,478,180,480,164,478,151,471,140,460,133,447,130,431,132,415,139,401,150,391,163,384,179,381,195,384,209,391,220,401,227,415,229,430,16383,16383,213,431,211,420,206,411,199,404,190,400,179,398,169,400,160,404,153,411,148,420,147,431,148,441,153,450,160,457,169,462,179,464,190,462,199,457,206,450,211,441,213,431,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,431,84,420,84,404,56,389,37,372,26,349,20,320,19,268,19,257,22,252,26,249,34,248,47,248,165,319,165,337,163,350,158,360,149,366,135,370,114,381,114,381,232,370,232,367,211,359,197,346,189,326,184,300,183,248,183,248,295,249,301,251,306,253,310,257,312,262,313,305,313,341,312,367,308,382,299,392,283,397,261,408,261,408,331,126,331,126,321,143,320,155,318,164,315,169,310,171,305,171,302,170,300,168,294,166,291,44,49,36,33,28,23,21,16,11,12,0,9,0,0,99,0,99,9,87,11,77,13,70,16,66,20,65,24,66,33,71,48,80,68,93,95,111,130,199,130,199,56,198,39,195,27,189,18,179,13,164,11,155,9,155,0,410,0,16383,16383,199,150,120,150,199,309,307,65,285,47,264,32,242,23,220,17,
+211,420,206,411,209,391,209,391,206,411,199,404,209,391,199,404,195,384,195,384,199,404,190,400,195,384,190,400,179,381,179,381,190,400,179,398,180,480,179,464,190,462,180,480,190,462,196,478,196,478,190,462,199,457,196,478,199,457,209,471,209,471,199,457,206,450,209,471,206,450,211,441,229,430,227,446,227,415,227,415,227,446,220,460,227,415,220,460,220,401,220,401,220,460,213,431,211,441,213,431,220,460,211,441,220,460,209,471,211,420,209,391,220,401,211,420,220,401,213,431,153,450,160,457,164,478,164,478,160,457,169,462,164,478,169,462,180,480,180,480,169,462,179,464,151,471,140,460,147,431,151,471,147,431,148,441,151,471,148,441,153,450,151,471,153,450,164,478,153,411,148,420,150,391,150,391,148,420,147,431,169,400,160,404,163,384,169,400,163,384,179,381,169,400,179,381,179,398,153,411,150,391,163,384,153,411,163,384,160,404,130,431,132,415,133,447,133,447,132,415,139,401,133,447,139,401,140,460,140,460,139,401,150,391,140,460,150,391,147,431,55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0,
+431,84,420,84,404,56,389,37,372,26,349,20,320,19,268,19,257,22,252,26,249,34,248,47,248,165,319,165,337,163,350,158,360,149,366,135,370,114,381,114,381,232,370,232,367,211,359,197,346,189,326,184,300,183,248,183,248,295,249,301,251,306,253,310,257,312,262,313,305,313,341,312,367,308,382,299,392,283,397,261,408,261,408,331,126,331,126,321,143,320,155,318,164,315,169,310,171,305,171,302,170,300,168,294,166,291,44,49,36,33,28,23,21,16,11,12,0,9,0,0,99,0,99,9,87,11,77,13,70,16,66,20,65,24,66,33,71,48,80,68,93,95,111,130,199,130,199,56,198,39,195,27,189,18,179,13,164,11,155,9,155,0,410,0,16383,16383,199,150,120,150,199,309,307,65,285,47,264,32,242,23,220,17,196,15,175,17,155,21,137,29,120,40,105,54,93,72,84,94,77,118,73,145,72,173,77,222,93,262,118,292,151,311,191,318,221,313,249,300,272,280,289,255,299,225,310,225,305,338,295,338,293,332,285,324,280,322,275,321,271,322,268,322,263,323,259,325,254,326,240,330,225,334,210,336,196,338,181,338,160,337,140,333,120,327,101,319,84,308,59,287,40,262,25,233,17,200,14,165,16,135,21,107,30,82,43,60,58,41,73,27,90,15,109,6,129,0,151,-4,132,-49,136,-51,139,-50,141,-50,144,-49,150,-49,160,-50,168,-52,173,-55,175,-60,176,-67,175,-74,172,-81,166,-85,158,-88,149,-89,143,-89,131,-87,124,-86,117,-83,109,-98,118,-102,134,-106,
+87,11,77,13,99,0,99,0,77,13,70,16,99,0,70,16,36,33,36,33,70,16,66,20,36,33,66,20,44,49,44,49,66,20,65,24,71,48,80,68,166,291,166,291,80,68,93,95,166,291,93,95,111,130,111,130,199,130,120,150,120,150,199,130,199,150,195,27,189,18,410,0,410,0,189,18,179,13,410,0,179,13,164,11,166,291,111,130,120,150,166,291,120,150,199,309,166,291,199,309,168,294,262,313,408,331,199,309,199,309,408,331,169,310,199,309,169,310,171,305,171,305,171,302,199,309,199,309,171,302,170,300,199,309,170,300,169,297,360,149,366,135,367,211,367,211,366,135,370,114,367,211,370,114,370,232,370,232,370,114,381,114,370,232,381,114,381,232,300,183,319,165,326,184,326,184,319,165,337,163,326,184,337,163,346,189,346,189,337,163,350,158,346,189,350,158,359,197,359,197,350,158,360,149,359,197,360,149,367,211,199,309,249,34,248,47,248,183,248,165,319,165,248,183,319,165,300,183,408,331,262,313,305,313,408,331,305,313,341,312,408,331,341,312,367,308,408,331,367,308,382,299,408,331,382,299,392,283,408,331,392,283,397,261,408,331,397,261,408,261,199,309,248,47,248,295,199,309,248,295,249,301,199,309,249,301,251,306,199,309,251,306,253,310,199,309,253,310,257,312,199,309,257,312,262,313,408,331,126,331,143,320,408,331,143,320,155,318,408,331,155,318,164,315,408,331,164,315,169,310,389,37,372,26,410,0,410,0,372,26,349,20,410,0,349,20,320,19,410,0,431,84,420,84,410,0,420,84,404,56,410,0,404,56,389,37,199,56,198,39,257,22,257,22,198,39,195,27,257,22,195,27,268,19,268,19,195,27,410,0,268,19,410,0,283,19,283,19,410,0,320,19,199,150,199,130,252,26,199,150,252,26,249,34,199,150,249,34,199,309,199,56,257,22,252,26,199,56,252,26,199,130,155,9,155,0,410,0,155,9,410,0,164,11,44,49,65,24,66,33,44,49,66,33,71,48,44,49,71,48,166,291,99,0,36,33,28,23,99,0,28,23,21,16,99,0,21,16,11,12,99,0,11,12,0,9,99,0,0,9,0,0,87,11,99,0,99,9,168,294,199,309,169,297,143,320,126,331,126,321,
+307,65,285,47,264,32,242,23,220,17,196,15,175,17,155,21,137,29,120,40,105,54,93,72,84,94,77,118,73,145,72,173,77,222,93,262,118,292,151,311,191,318,221,313,249,300,272,280,289,255,299,225,310,225,305,338,295,338,293,332,285,324,280,322,275,321,271,322,268,322,263,323,259,325,254,326,240,330,225,334,210,336,196,338,181,338,160,337,140,333,120,327,101,319,84,308,59,287,40,262,25,233,17,200,14,165,16,135,21,107,30,82,43,60,58,41,73,27,90,15,109,6,129,0,151,-4,132,-49,136,-51,139,-50,141,-50,144,-49,150,-49,160,-50,168,-52,173,-55,175,-60,176,-67,175,-74,172,-81,166,-85,158,-88,149,-89,143,-89,131,-87,124,-86,117,-83,109,-98,118,-102,134,-106,142,-106,151,-107,173,-105,190,-99,203,-91,211,-79,214,-64,212,-52,206,-43,198,-36,186,-32,171,-30,163,-30,161,-31,158,-31,168,-6,180,-6,213,-4,244,3,272,16,297,34,316,56,201,378,128,453,124,457,119,460,115,462,107,464,101,463,96,461,92,458,90,454,89,448,89,443,91,439,94,434,104,426,181,378,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,123,378,142,378,219,427,225,431,229,435,232,439,234,443,234,454,231,458,228,461,223,463,217,464,209,462,205,460,201,457,196,453,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,
+84,94,77,118,90,15,90,15,77,118,73,145,90,15,73,145,73,27,73,27,73,145,72,173,59,287,72,173,84,308,158,-31,175,17,155,21,158,-31,155,21,151,-4,151,-4,155,21,137,29,151,-4,137,29,129,0,129,0,137,29,120,40,129,0,120,40,109,6,109,6,120,40,105,54,142,-106,151,-107,143,-89,143,-89,151,-107,149,-89,158,-88,149,-89,151,-107,158,-88,151,-107,173,-105,141,-50,144,-49,151,-4,151,-4,144,-49,147,-49,151,-4,147,-49,150,-49,150,-49,160,-50,151,-4,151,-4,132,-49,136,-51,151,-4,136,-51,139,-50,151,-4,139,-50,141,-50,196,15,178,-6,180,-6,196,15,180,-6,213,-4,196,15,175,17,175,-6,196,15,175,-6,178,-6,175,17,158,-31,168,-6,175,17,168,-6,171,-6,175,17,171,-6,173,-6,175,17,173,-6,175,-6,316,56,307,65,297,34,297,34,307,65,285,47,297,34,285,47,272,16,272,16,285,47,264,32,272,16,264,32,244,3,244,3,264,32,242,23,244,3,242,23,220,17,220,17,196,15,213,-4,220,17,213,-4,244,3,191,318,181,338,160,337,191,318,160,337,151,311,191,318,196,338,181,338,72,173,77,222,84,308,84,308,77,222,93,262,84,308,93,262,101,319,101,319,93,262,118,292,101,319,118,292,120,327,120,327,118,292,151,311,120,327,151,311,140,333,140,333,151,311,160,337,210,336,221,313,225,334,225,334,221,313,249,300,225,334,249,300,240,330,240,330,249,300,254,326,221,313,210,336,196,338,221,313,196,338,191,318,289,328,285,324,289,255,289,255,285,324,280,322,289,255,280,322,275,321,275,321,271,322,272,280,272,280,271,322,268,322,272,280,268,322,263,323,272,280,263,323,259,325,272,280,259,325,254,326,272,280,254,326,249,300,299,225,310,225,305,338,299,225,305,338,295,338,299,225,295,338,293,332,299,225,293,332,289,255,275,321,272,280,289,255,214,-64,212,-52,211,-79,211,-79,212,-52,206,-43,211,-79,206,-43,203,-91,203,-91,206,-43,198,-36,203,-91,198,-36,190,-99,190,-99,198,-36,186,-32,190,-99,186,-32,176,-67,176,-67,186,-32,175,-60,173,-55,175,-60,186,-32,173,-55,186,-32,171,-30,173,-55,171,-30,168,-30,173,-55,168,-30,168,-52,168,-52,168,-30,166,-30,168,-52,166,-30,163,-30,168,-52,163,-30,161,-31,168,-52,161,-31,160,-50,158,-31,151,-4,160,-50,158,-31,160,-50,161,-31,190,-99,176,-67,175,-74,190,-99,175,-74,173,-105,173,-105,175,-74,172,-81,173,-105,172,-81,166,-85,117,-83,118,-102,124,-86,124,-86,118,-102,126,-104,124,-86,126,-104,131,-87,131,-87,126,-104,134,-106,131,-87,134,-106,137,-88,137,-88,134,-106,142,-106,137,-88,142,-106,143,-89,93,72,84,94,90,15,93,72,90,15,109,6,93,72,109,6,105,54,59,287,40,262,43,60,59,287,43,60,58,41,59,287,58,41,73,27,59,287,73,27,72,173,14,165,16,135,17,200,17,200,16,135,21,107,17,200,21,107,25,233,25,233,21,107,30,82,25,233,30,82,40,262,40,262,30,82,43,60,118,-102,117,-83,109,-98,158,-88,173,-105,166,-85,289,328,289,255,293,332,
+201,378,128,453,124,457,119,460,115,462,107,464,101,463,96,461,92,458,90,454,89,448,89,443,91,439,94,434,104,426,181,378,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,123,378,142,378,219,427,225,431,229,435,232,439,234,443,234,454,231,458,228,461,223,463,217,464,209,462,205,460,201,457,196,453,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,
+181,378,201,378,128,453,181,378,128,453,124,457,181,378,124,457,119,460,181,378,119,460,115,462,181,378,115,462,111,463,181,378,111,463,107,464,181,378,107,464,104,426,89,448,89,443,90,454,90,454,89,443,91,439,90,454,91,439,92,458,92,458,91,439,94,434,92,458,94,434,96,461,96,461,94,434,99,430,96,461,99,430,101,463,101,463,99,430,104,426,101,463,104,426,107,464,45,24,38,16,276,0,276,0,38,16,25,12,276,0,25,12,6,9,49,294,50,275,106,310,49,294,106,310,45,307,45,307,106,310,111,312,45,307,111,312,271,331,271,331,111,312,118,312,45,24,117,21,49,37,49,37,117,21,108,25,49,37,108,25,50,57,50,57,108,25,102,31,50,57,102,31,50,275,50,275,102,31,100,42,50,275,100,42,100,294,100,184,100,164,176,164,100,184,176,164,176,184,198,185,176,184,198,162,198,185,198,162,213,190,213,190,198,162,213,158,213,190,213,158,222,198,222,198,213,158,222,150,222,198,222,150,229,212,229,212,222,150,229,136,229,212,229,136,233,232,233,232,229,136,233,115,233,232,233,115,244,115,271,331,118,312,184,312,271,331,184,312,213,311,271,331,213,311,234,306,271,331,234,306,247,297,271,331,247,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,50,275,100,294,101,302,50,275,101,302,103,307,50,275,103,307,106,310,271,331,6,331,25,320,271,331,25,320,38,315,271,331,38,315,45,307,255,38,234,26,276,0,276,0,234,26,206,20,276,0,206,20,169,18,276,0,299,84,285,84,276,0,285,84,271,57,276,0,271,57,255,38,276,0,169,18,151,18,276,0,151,18,132,19,276,0,132,19,117,21,276,0,117,21,45,24,276,0,6,9,6,0,25,320,6,331,6,321,176,184,176,164,198,162,233,232,244,115,244,232,
+123,378,142,378,219,427,225,431,229,435,232,439,234,443,234,454,231,458,228,461,223,463,217,464,209,462,205,460,201,457,196,453,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,242,378,179,462,148,462,86,378,103,378,164,430,224,378,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,238,411,236,419,233,426,227,431,220,435,213,436,205,435,198,431,193,426,
+217,464,219,427,223,463,223,463,219,427,225,431,223,463,225,431,228,461,228,461,225,431,229,435,228,461,229,435,231,458,231,458,229,435,232,439,231,458,232,439,234,454,234,454,232,439,234,443,234,454,234,443,234,448,219,427,217,464,213,463,219,427,213,463,209,462,219,427,209,462,205,460,219,427,205,460,201,457,219,427,201,457,196,453,219,427,196,453,142,378,45,24,38,16,276,0,276,0,38,16,25,12,276,0,25,12,6,9,49,294,50,275,106,310,49,294,106,310,45,307,45,307,106,310,111,312,45,307,111,312,271,331,271,331,111,312,118,312,45,24,117,21,49,37,49,37,117,21,108,25,49,37,108,25,50,57,50,57,108,25,102,31,50,57,102,31,50,275,50,275,102,31,100,42,50,275,100,42,100,294,100,184,100,164,176,164,100,184,176,164,176,184,198,185,176,184,198,162,198,185,198,162,213,190,213,190,198,162,213,158,213,190,213,158,222,198,222,198,213,158,222,150,222,198,222,150,229,212,229,212,222,150,229,136,229,212,229,136,233,232,233,232,229,136,233,115,233,232,233,115,244,115,271,331,118,312,184,312,271,331,184,312,213,311,271,331,213,311,234,306,271,331,234,306,247,297,271,331,247,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,50,275,100,294,101,302,50,275,101,302,103,307,50,275,103,307,106,310,271,331,6,331,25,320,271,331,25,320,38,315,271,331,38,315,45,307,255,38,234,26,276,0,276,0,234,26,206,20,276,0,206,20,169,18,276,0,299,84,285,84,276,0,285,84,271,57,276,0,271,57,255,38,276,0,169,18,151,18,276,0,151,18,132,19,276,0,132,19,117,21,276,0,117,21,45,24,276,0,6,9,6,0,25,320,6,331,6,321,176,184,176,164,198,162,233,232,244,115,244,232,142,378,196,453,123,378,
+242,378,179,462,148,462,86,378,103,378,164,430,224,378,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,238,411,236,419,233,426,227,431,220,435,213,436,205,435,198,431,193,426,189,419,188,411,189,403,193,397,198,391,204,388,212,387,220,388,227,391,233,397,236,403,238,411,16383,16383,138,411,137,419,133,426,128,431,121,435,113,436,105,435,98,431,93,426,90,419,89,411,90,403,93,397,98,391,105,388,113,387,121,388,128,391,133,397,137,403,138,411,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,
+86,378,103,378,148,462,148,462,103,378,164,430,148,462,164,430,179,462,179,462,164,430,224,378,179,462,224,378,242,378,45,24,38,16,276,0,276,0,38,16,25,12,276,0,25,12,6,9,49,294,50,275,106,310,49,294,106,310,45,307,45,307,106,310,111,312,45,307,111,312,271,331,271,331,111,312,118,312,45,24,117,21,49,37,49,37,117,21,108,25,49,37,108,25,50,57,50,57,108,25,102,31,50,57,102,31,50,275,50,275,102,31,100,42,50,275,100,42,100,294,100,184,100,164,176,164,100,184,176,164,176,184,198,185,176,184,198,162,198,185,198,162,213,190,213,190,198,162,213,158,213,190,213,158,222,198,222,198,213,158,222,150,222,198,222,150,229,212,229,212,222,150,229,136,229,212,229,136,233,232,233,232,229,136,233,115,233,232,233,115,244,115,271,331,118,312,184,312,271,331,184,312,213,311,271,331,213,311,234,306,271,331,234,306,247,297,271,331,247,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,50,275,100,294,101,302,50,275,101,302,103,307,50,275,103,307,106,310,271,331,6,331,25,320,271,331,25,320,38,315,271,331,38,315,45,307,255,38,234,26,276,0,276,0,234,26,206,20,276,0,206,20,169,18,276,0,299,84,285,84,276,0,285,84,271,57,276,0,271,57,255,38,276,0,169,18,151,18,276,0,151,18,132,19,276,0,132,19,117,21,276,0,117,21,45,24,276,0,6,9,6,0,25,320,6,331,6,321,176,184,176,164,198,162,233,232,244,115,244,232,
+238,411,236,419,233,426,227,431,220,435,213,436,205,435,198,431,193,426,189,419,188,411,189,403,193,397,198,391,204,388,212,387,220,388,227,391,233,397,236,403,238,411,16383,16383,138,411,137,419,133,426,128,431,121,435,113,436,105,435,98,431,93,426,90,419,89,411,90,403,93,397,98,391,105,388,113,387,121,388,128,391,133,397,137,403,138,411,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,134,378,62,453,57,457,53,460,49,462,41,464,35,463,29,461,26,458,23,454,22,448,23,443,25,439,28,434,32,430,37,426,114,378,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,32,378,52,378,129,427,139,435,142,439,143,443,144,448,143,454,141,458,137,461,133,463,127,464,122,463,118,462,115,460,110,457,105,453,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,161,378,98,462,67,462,5,378,22,378,83,430,143,378,16383,16383,153,0,153,9,133,11,
+113,436,113,387,121,435,121,435,113,387,121,388,121,435,121,388,128,431,128,431,121,388,128,391,128,431,128,391,133,426,133,426,128,391,133,397,133,426,133,397,137,419,137,419,133,397,137,403,137,419,137,403,138,411,89,411,90,403,90,419,90,419,90,403,93,397,90,419,93,397,93,426,93,426,93,397,98,391,93,426,98,391,98,431,98,431,98,391,105,388,98,431,105,388,105,435,105,435,105,388,113,387,105,435,113,387,113,436,45,24,38,16,276,0,276,0,38,16,25,12,276,0,25,12,6,9,49,294,50,275,106,310,49,294,106,310,45,307,45,307,106,310,111,312,45,307,111,312,271,331,271,331,111,312,118,312,188,411,189,403,189,419,189,419,189,403,193,397,189,419,193,397,193,426,193,426,193,397,198,391,193,426,198,391,198,431,198,431,198,391,204,388,198,431,204,388,205,435,205,435,204,388,212,387,205,435,212,387,213,436,213,436,212,387,220,388,213,436,220,388,220,435,220,435,220,388,227,391,220,435,227,391,227,431,227,431,227,391,233,397,227,431,233,397,233,426,233,426,233,397,236,403,233,426,236,403,236,419,236,419,236,403,238,411,45,24,117,21,49,37,49,37,117,21,108,25,49,37,108,25,50,57,50,57,108,25,102,31,50,57,102,31,50,275,50,275,102,31,100,42,50,275,100,42,100,294,100,184,100,164,176,164,100,184,176,164,176,184,198,185,176,184,198,162,198,185,198,162,213,190,213,190,198,162,213,158,213,190,213,158,222,198,222,198,213,158,222,150,222,198,222,150,229,212,229,212,222,150,229,136,229,212,229,136,233,232,233,232,229,136,233,115,233,232,233,115,244,115,271,331,118,312,184,312,271,331,184,312,213,311,271,331,213,311,234,306,271,331,234,306,247,297,271,331,247,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,50,275,100,294,101,302,50,275,101,302,103,307,50,275,103,307,106,310,271,331,6,331,25,320,271,331,25,320,38,315,271,331,38,315,45,307,255,38,234,26,276,0,276,0,234,26,206,20,276,0,206,20,169,18,276,0,299,84,285,84,276,0,285,84,271,57,276,0,271,57,255,38,276,0,169,18,151,18,276,0,151,18,132,19,276,0,132,19,117,21,276,0,117,21,45,24,276,0,6,9,6,0,25,320,6,331,6,321,176,184,176,164,198,162,233,232,244,115,244,232,
+134,378,62,453,57,457,53,460,49,462,41,464,35,463,29,461,26,458,23,454,22,448,23,443,25,439,28,434,32,430,37,426,114,378,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,32,378,52,378,129,427,139,435,142,439,143,443,144,448,143,454,141,458,137,461,133,463,127,464,122,463,118,462,115,460,110,457,105,453,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,
+114,378,134,378,62,453,114,378,62,453,57,457,114,378,57,457,53,460,114,378,53,460,49,462,114,378,49,462,45,463,114,378,45,463,41,464,114,378,41,464,37,426,22,448,23,443,23,454,23,454,23,443,25,439,23,454,25,439,26,458,26,458,25,439,28,434,26,458,28,434,29,461,29,461,28,434,32,430,29,461,32,430,35,463,35,463,32,430,37,426,35,463,37,426,41,464,52,23,44,15,157,0,157,0,44,15,30,11,157,0,30,11,9,9,157,331,9,331,30,320,157,331,30,320,44,316,157,331,44,316,53,308,157,331,53,308,57,295,157,331,57,295,122,316,157,331,122,316,136,320,157,331,136,320,157,321,122,16,114,24,57,56,57,56,114,24,109,37,57,56,109,37,57,276,57,276,109,37,108,56,57,276,108,56,108,276,57,276,108,276,109,295,57,276,109,295,113,308,57,276,113,308,122,316,57,276,122,316,57,295,157,0,157,9,137,11,157,0,137,11,122,16,157,0,122,16,56,36,157,0,56,36,52,23,157,0,9,9,9,0,56,36,122,16,57,56,30,320,9,331,9,321,
+32,378,52,378,129,427,139,435,142,439,143,443,144,448,143,454,141,458,137,461,133,463,127,464,122,463,118,462,115,460,110,457,105,453,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,161,378,98,462,67,462,5,378,22,378,83,430,143,378,16383,16383,153,0,153,9,133,11,119,16,110,24,106,37,104,56,104,276,105,295,110,308,118,316,132,320,153,321,153,331,5,331,5,321,26,320,40,316,49,308,53,295,54,276,54,56,53,36,49,23,40,15,26,11,5,9,5,0,157,411,156,419,153,426,147,431,140,435,132,436,125,435,118,431,113,426,
+127,464,129,427,133,463,133,463,129,427,134,431,133,463,134,431,137,461,137,461,134,431,139,435,137,461,139,435,141,458,141,458,139,435,142,439,141,458,142,439,143,454,143,454,142,439,143,443,143,454,143,443,144,448,129,427,127,464,122,463,129,427,122,463,118,462,129,427,118,462,115,460,129,427,115,460,110,457,129,427,110,457,105,453,129,427,105,453,52,378,52,23,44,15,157,0,157,0,44,15,30,11,157,0,30,11,9,9,157,331,9,331,30,320,157,331,30,320,44,316,157,331,44,316,53,308,157,331,53,308,57,295,157,331,57,295,122,316,157,331,122,316,136,320,157,331,136,320,157,321,122,16,114,24,57,56,57,56,114,24,109,37,57,56,109,37,57,276,57,276,109,37,108,56,57,276,108,56,108,276,57,276,108,276,109,295,57,276,109,295,113,308,57,276,113,308,122,316,57,276,122,316,57,295,157,0,157,9,137,11,157,0,137,11,122,16,157,0,122,16,56,36,157,0,56,36,52,23,157,0,9,9,9,0,56,36,122,16,57,56,30,320,9,331,9,321,52,378,105,453,32,378,
+161,378,98,462,67,462,5,378,22,378,83,430,143,378,16383,16383,153,0,153,9,133,11,119,16,110,24,106,37,104,56,104,276,105,295,110,308,118,316,132,320,153,321,153,331,5,331,5,321,26,320,40,316,49,308,53,295,54,276,54,56,53,36,49,23,40,15,26,11,5,9,5,0,157,411,156,419,153,426,147,431,140,435,132,436,125,435,118,431,113,426,109,419,108,411,109,403,113,397,118,391,124,388,132,387,140,388,147,391,153,397,156,403,157,411,16383,16383,58,411,57,419,53,426,48,431,41,435,33,436,25,435,18,431,13,426,10,419,8,411,10,403,13,397,18,391,
+5,378,22,378,67,462,67,462,22,378,83,430,67,462,83,430,98,462,98,462,83,430,143,378,98,462,143,378,161,378,49,23,40,15,153,0,153,0,40,15,26,11,153,0,26,11,5,9,153,331,5,331,26,320,153,331,26,320,40,316,153,331,40,316,49,308,153,331,49,308,53,295,153,331,53,295,118,316,153,331,118,316,132,320,153,331,132,320,153,321,119,16,110,24,54,56,54,56,110,24,106,37,54,56,106,37,54,276,54,276,106,37,104,56,54,276,104,56,104,276,54,276,104,276,105,295,54,276,105,295,110,308,54,276,110,308,118,316,54,276,118,316,53,295,153,0,153,9,133,11,153,0,133,11,119,16,153,0,119,16,53,36,153,0,53,36,49,23,153,0,5,9,5,0,53,36,119,16,54,56,26,320,5,331,5,321,
+157,411,156,419,153,426,147,431,140,435,132,436,125,435,118,431,113,426,109,419,108,411,109,403,113,397,118,391,124,388,132,387,140,388,147,391,153,397,156,403,157,411,16383,16383,58,411,57,419,53,426,48,431,41,435,33,436,25,435,18,431,13,426,10,419,8,411,10,403,13,397,18,391,25,388,32,387,40,388,47,391,53,397,57,403,58,411,16383,16383,157,0,157,9,136,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,8,331,8,321,30,320,44,316,52,308,56,295,57,276,57,56,56,36,52,23,44,15,29,11,8,9,8,0,8,331,8,321,28,319,40,315,48,307,51,295,52,276,52,180,11,180,11,157,52,157,52,55,51,36,47,24,40,16,27,12,8,9,8,0,150,0,183,2,213,7,242,16,267,27,287,41,307,60,322,83,333,109,340,137,343,167,334,224,308,269,267,303,212,324,143,331,16383,16383,103,157,176,157,176,180,103,180,103,293,104,301,106,307,111,310,117,312,127,313,152,312,175,309,194,304,212,297,227,289,249,271,266,249,278,224,285,195,288,164,285,130,278,101,266,76,249,55,227,39,211,31,194,26,175,22,153,19,128,18,118,19,111,21,106,25,104,31,103,39,244,444,240,434,
+8,411,10,403,10,419,10,419,10,403,13,397,10,419,13,397,13,426,13,426,13,397,18,391,13,426,18,391,18,431,18,431,18,391,25,388,18,431,25,388,25,435,25,435,25,388,32,387,25,435,32,387,33,436,33,436,32,387,40,388,33,436,40,388,41,435,41,435,40,388,47,391,41,435,47,391,48,431,48,431,47,391,53,397,48,431,53,397,53,426,53,426,53,397,57,403,53,426,57,403,57,419,57,419,57,403,58,411,52,23,44,15,157,0,157,0,44,15,29,11,157,0,29,11,8,9,157,331,8,331,30,320,157,331,30,320,44,316,157,331,44,316,52,308,157,331,52,308,56,295,157,331,56,295,122,316,157,331,122,316,136,320,157,331,136,320,157,321,122,16,114,24,57,56,57,56,114,24,109,37,57,56,109,37,57,276,57,276,109,37,108,56,57,276,108,56,108,276,57,276,108,276,109,295,57,276,109,295,113,308,57,276,113,308,122,316,57,276,122,316,56,295,132,436,132,387,140,435,140,435,132,387,140,388,140,435,140,388,147,431,147,431,140,388,147,391,147,431,147,391,153,426,153,426,147,391,153,397,153,426,153,397,156,419,156,419,153,397,156,403,156,419,156,403,157,411,108,411,109,403,109,419,109,419,109,403,113,397,109,419,113,397,113,426,113,426,113,397,118,391,113,426,118,391,118,431,118,431,118,391,124,388,118,431,124,388,125,435,125,435,124,388,132,387,125,435,132,387,132,436,157,0,157,9,136,11,157,0,136,11,122,16,157,0,122,16,56,36,157,0,56,36,52,23,157,0,8,9,8,0,56,36,122,16,57,56,30,320,8,331,8,321,
+8,331,8,321,28,319,40,315,48,307,51,295,52,276,52,180,11,180,11,157,52,157,52,55,51,36,47,24,40,16,27,12,8,9,8,0,150,0,183,2,213,7,242,16,267,27,287,41,307,60,322,83,333,109,340,137,343,167,334,224,308,269,267,303,212,324,143,331,16383,16383,103,157,176,157,176,180,103,180,103,293,104,301,106,307,111,310,117,312,127,313,152,312,175,309,194,304,212,297,227,289,249,271,266,249,278,224,285,195,288,164,285,130,278,101,266,76,249,55,227,39,211,31,194,26,175,22,153,19,128,18,118,19,111,21,106,25,104,31,103,39,244,444,240,434,235,427,230,422,224,420,218,419,213,419,208,420,203,422,191,426,180,432,172,436,158,440,151,441,145,441,130,439,118,433,108,423,100,409,94,391,108,391,112,399,116,406,122,410,128,413,134,414,138,414,146,412,150,410,155,408,177,398,185,394,193,392,200,391,206,391,221,393,234,399,244,409,252,424,259,444,16383,16383,353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,
+47,24,40,16,150,0,150,0,40,16,27,12,150,0,27,12,8,9,40,315,48,307,143,331,143,331,48,307,51,295,143,331,51,295,52,276,104,31,52,276,52,180,104,31,52,180,52,157,52,157,52,180,11,180,52,157,11,180,11,157,104,301,106,307,52,276,52,276,106,307,111,310,52,276,111,310,143,331,143,331,111,310,117,312,143,331,117,312,127,313,127,313,117,312,127,312,127,313,127,312,152,312,127,313,152,312,143,331,143,331,152,312,212,324,175,22,183,2,194,26,194,26,183,2,213,7,194,26,213,7,211,31,211,31,213,7,227,39,249,55,227,39,242,16,249,55,242,16,267,27,128,18,150,0,153,19,153,19,150,0,183,2,153,19,183,2,175,22,175,309,194,304,212,324,212,324,194,304,212,297,212,324,212,297,227,289,227,289,249,271,267,303,267,303,249,271,266,249,267,303,266,249,278,224,334,224,308,269,322,83,334,224,322,83,333,109,334,224,333,109,340,137,334,224,340,137,343,167,322,83,308,269,307,60,307,60,308,269,288,164,287,41,288,164,285,130,287,41,285,130,278,101,267,303,278,224,308,269,308,269,278,224,285,195,308,269,285,195,288,164,267,303,212,324,227,289,267,27,287,41,278,101,267,27,278,101,266,76,267,27,266,76,249,55,227,39,213,7,242,16,52,276,104,31,103,39,103,180,103,157,176,157,103,180,176,157,176,180,103,293,104,301,52,276,103,293,52,276,103,39,143,331,8,331,28,319,143,331,28,319,40,315,52,55,51,36,111,21,111,21,51,36,150,0,111,21,150,0,118,19,118,19,150,0,128,18,52,55,111,21,106,25,52,55,106,25,104,31,52,55,104,31,52,157,150,0,8,9,8,0,47,24,150,0,51,36,28,319,8,331,8,321,288,164,287,41,307,60,212,324,152,312,175,309,
+244,444,240,434,235,427,230,422,224,420,218,419,213,419,208,420,203,422,191,426,180,432,172,436,158,440,151,441,145,441,130,439,118,433,108,423,100,409,94,391,108,391,112,399,116,406,122,410,128,413,134,414,138,414,146,412,150,410,155,408,177,398,185,394,193,392,200,391,206,391,221,393,234,399,244,409,252,424,259,444,16383,16383,353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,103,13,90,20,82,31,78,49,76,75,76,269,297,-5,306,-5,306,274,308,289,311,299,315,307,320,313,324,315,329,318,335,319,343,320,353,321,225,378,152,453,148,457,143,460,139,462,131,464,125,463,120,461,116,458,114,454,113,448,113,443,115,439,118,434,128,426,205,378,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,129,378,150,378,227,427,232,431,236,435,239,439,241,443,242,448,
+112,399,116,406,118,433,118,433,116,406,122,410,118,433,122,410,130,439,130,439,122,410,128,413,130,439,128,413,134,414,134,414,138,414,145,441,145,441,138,414,142,413,145,441,142,413,146,412,108,391,112,399,118,433,108,391,118,433,108,423,108,391,108,423,100,409,108,391,100,409,94,391,145,441,146,412,151,441,151,441,146,412,150,410,151,441,150,410,155,408,155,408,166,403,158,440,158,440,166,403,165,438,145,441,130,439,134,414,158,440,151,441,155,408,165,438,166,403,172,436,172,436,166,403,177,398,172,436,177,398,180,432,180,432,177,398,185,394,180,432,185,394,191,426,191,426,185,394,193,392,191,426,193,392,197,424,197,424,193,392,200,391,197,424,200,391,203,422,203,422,200,391,206,391,203,422,206,391,208,420,208,420,206,391,221,393,208,420,221,393,213,419,213,419,221,393,218,419,224,420,218,419,221,393,224,420,221,393,234,399,244,444,240,434,244,409,244,444,244,409,252,424,244,444,252,424,259,444,235,427,230,422,234,399,235,427,234,399,244,409,235,427,244,409,240,434,49,30,41,19,123,0,123,0,41,19,27,13,123,0,27,13,6,9,256,319,263,317,353,331,353,331,263,317,269,313,353,331,269,313,275,309,275,309,278,303,353,331,353,331,278,303,281,295,353,331,281,295,324,315,324,315,281,295,320,313,324,315,320,313,320,312,320,312,320,313,315,307,315,307,320,313,284,274,315,307,284,274,284,259,297,-5,284,259,284,89,297,-5,284,89,91,331,353,331,324,315,329,318,353,331,329,318,335,319,353,331,335,319,343,320,353,331,343,320,353,321,306,-5,306,253,297,-5,297,-5,306,253,306,274,297,-5,306,274,284,259,284,259,306,274,308,289,284,259,308,289,311,299,283,285,284,274,320,313,283,285,320,313,281,295,247,320,256,319,353,331,247,320,353,331,235,331,247,320,235,331,235,321,91,331,6,331,19,321,91,331,19,321,29,318,91,331,29,318,37,313,91,331,37,313,46,306,91,331,46,306,55,295,91,331,55,295,76,269,91,331,76,269,297,-5,55,295,78,49,76,75,54,48,49,30,90,20,90,20,49,30,123,0,90,20,123,0,103,13,103,13,123,0,123,9,55,75,54,48,82,31,55,75,82,31,78,49,55,75,78,49,55,295,123,0,6,9,6,0,54,48,90,20,82,31,19,321,6,331,6,321,76,269,55,295,76,75,315,307,284,259,311,299,224,420,234,399,230,422,
+225,378,152,453,148,457,143,460,139,462,131,464,125,463,120,461,116,458,114,454,113,448,113,443,115,439,118,434,128,426,205,378,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,129,378,150,378,227,427,232,431,236,435,239,439,241,443,242,448,241,454,239,458,235,461,230,463,224,464,216,462,212,460,208,457,203,453,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,
+205,378,225,378,152,453,205,378,152,453,148,457,205,378,148,457,143,460,205,378,143,460,139,462,205,378,139,462,135,463,205,378,135,463,131,464,205,378,131,464,128,426,113,448,113,443,114,454,114,454,113,443,115,439,114,454,115,439,116,458,116,458,115,439,118,434,116,458,118,434,120,461,120,461,118,434,123,430,120,461,123,430,125,463,125,463,123,430,128,426,125,463,128,426,131,464,149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,81,24,74,166,46,61,223,19,234,1,235,26,130,25,180,-6,142,19,
+129,378,150,378,227,427,232,431,236,435,239,439,241,443,242,448,241,454,239,458,235,461,230,463,224,464,216,462,212,460,208,457,203,453,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,255,378,193,462,161,462,99,378,117,378,177,430,238,378,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,244,444,240,434,235,427,230,422,224,420,218,419,213,419,208,420,203,422,191,426,
+149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,224,464,227,427,230,463,230,463,227,427,232,431,230,463,232,431,235,461,235,461,232,431,236,435,235,461,236,435,239,458,239,458,236,435,239,439,239,458,239,439,241,454,241,454,239,439,241,443,241,454,241,443,242,448,227,427,224,464,220,463,227,427,220,463,216,462,227,427,216,462,212,460,227,427,212,460,208,457,227,427,208,457,203,453,227,427,203,453,150,378,81,24,74,166,46,61,150,378,203,453,129,378,223,19,234,1,235,26,130,25,180,-6,142,19,
+255,378,193,462,161,462,99,378,117,378,177,430,238,378,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,244,444,240,434,235,427,230,422,224,420,218,419,213,419,208,420,203,422,191,426,180,432,172,436,158,440,151,441,145,441,130,439,118,433,108,423,100,409,94,391,108,391,112,399,116,406,122,410,128,413,134,414,138,414,146,412,150,410,155,408,177,398,185,394,193,392,200,391,206,391,221,393,234,399,244,409,252,424,259,444,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,
+99,378,117,378,161,462,161,462,117,378,177,430,161,462,177,430,193,462,193,462,177,430,238,378,193,462,238,378,255,378,149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,81,24,74,166,46,61,223,19,234,1,235,26,130,25,180,-6,142,19,
+244,444,240,434,235,427,230,422,224,420,218,419,213,419,208,420,203,422,191,426,180,432,172,436,158,440,151,441,145,441,130,439,118,433,108,423,100,409,94,391,108,391,112,399,116,406,122,410,128,413,134,414,138,414,146,412,150,410,155,408,177,398,185,394,193,392,200,391,206,391,221,393,234,399,244,409,252,424,259,444,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,252,411,250,419,247,426,241,431,234,435,227,436,219,435,212,431,207,426,203,419,202,411,203,403,207,397,212,391,218,388,226,387,234,388,241,391,247,397,250,403,252,411,16383,16383,152,411,151,419,147,426,142,431,135,435,127,436,119,435,113,431,107,426,104,419,103,411,104,403,107,397,112,391,119,388,127,387,135,388,142,391,147,397,151,403,152,411,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,
+112,399,116,406,118,433,118,433,116,406,122,410,118,433,122,410,130,439,130,439,122,410,128,413,130,439,128,413,134,414,134,414,138,414,145,441,145,441,138,414,142,413,145,441,142,413,146,412,108,391,112,399,118,433,108,391,118,433,108,423,108,391,108,423,100,409,108,391,100,409,94,391,145,441,146,412,151,441,151,441,146,412,150,410,151,441,150,410,155,408,155,408,166,403,158,440,158,440,166,403,165,438,145,441,130,439,134,414,158,440,151,441,155,408,165,438,166,403,172,436,172,436,166,403,177,398,172,436,177,398,180,432,180,432,177,398,185,394,180,432,185,394,191,426,191,426,185,394,193,392,191,426,193,392,197,424,197,424,193,392,200,391,197,424,200,391,203,422,203,422,200,391,206,391,203,422,206,391,208,420,208,420,206,391,221,393,208,420,221,393,213,419,213,419,221,393,218,419,224,420,218,419,221,393,224,420,221,393,234,399,244,444,240,434,244,409,244,444,244,409,252,424,244,444,252,424,259,444,235,427,230,422,234,399,235,427,234,399,244,409,235,427,244,409,240,434,149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,81,24,74,166,46,61,223,19,234,1,235,26,130,25,180,-6,142,19,224,420,234,399,230,422,
+252,411,250,419,247,426,241,431,234,435,227,436,219,435,212,431,207,426,203,419,202,411,203,403,207,397,212,391,218,388,226,387,234,388,241,391,247,397,250,403,252,411,16383,16383,152,411,151,419,147,426,142,431,135,435,127,436,119,435,113,431,107,426,104,419,103,411,104,403,107,397,112,391,119,388,127,387,135,388,142,391,147,397,151,403,152,411,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,299,11,184,126,299,242,276,265,160,150,45,265,22,242,137,126,22,11,45,-11,160,103,276,-11,329,367,305,367,268,314,250,323,233,330,217,335,200,337,181,338,127,330,81,307,47,270,25,222,17,165,18,147,20,129,24,111,30,94,36,79,48,59,55,50,75,30,28,-39,52,-39,92,18,110,8,127,1,143,-3,161,-5,180,-6,234,1,279,24,314,61,336,109,344,166,343,184,340,203,336,220,331,237,325,252,319,263,313,272,305,281,296,291,285,302,16383,16383,97,61,88,80,82,99,77,119,75,141,74,165,79,218,93,261,115,293,144,313,180,320,196,319,211,315,225,309,238,300,251,287,16383,16383,263,270,272,251,279,232,284,212,286,190,287,165,282,113,268,70,246,38,217,18,180,11,164,12,149,16,135,22,122,32,109,44,227,378,154,453,149,457,145,460,141,462,137,463,132,464,126,463,121,461,118,458,115,454,114,448,115,443,117,439,120,434,124,430,129,426,
+103,411,104,403,104,419,104,419,104,403,107,397,104,419,107,397,107,426,107,426,107,397,112,391,107,426,112,391,113,431,113,431,112,391,119,388,113,431,119,388,119,435,119,435,119,388,127,387,119,435,127,387,127,436,127,436,127,387,135,388,127,436,135,388,135,435,135,435,135,388,142,391,135,435,142,391,142,431,142,431,142,391,147,397,142,431,147,397,147,426,147,426,147,397,151,403,147,426,151,403,151,419,151,419,151,403,152,411,149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,202,411,203,403,203,419,203,419,203,403,207,397,203,419,207,397,207,426,207,426,207,397,212,391,207,426,212,391,212,431,212,431,212,391,218,388,212,431,218,388,219,435,219,435,218,388,226,387,219,435,226,387,227,436,227,436,226,387,234,388,227,436,234,388,234,435,234,435,234,388,241,391,234,435,241,391,241,431,241,431,241,391,247,397,241,431,247,397,247,426,247,426,247,397,250,403,247,426,250,403,250,419,250,419,250,403,252,411,81,24,74,166,46,61,223,19,234,1,235,26,130,25,180,-6,142,19,
+299,11,184,126,299,242,276,265,160,150,45,265,22,242,137,126,22,11,45,-11,160,103,276,-11,329,367,305,367,268,314,250,323,233,330,217,335,200,337,181,338,127,330,81,307,47,270,25,222,
+184,126,299,242,276,265,184,126,276,265,160,150,184,126,160,150,276,-11,184,126,276,-11,299,11,22,11,45,-11,137,126,137,126,45,-11,160,103,137,126,160,103,160,150,160,150,160,103,276,-11,45,265,22,242,137,126,45,265,137,126,160,150,
+329,367,305,367,268,314,250,323,233,330,217,335,200,337,181,338,127,330,81,307,47,270,25,222,17,165,18,147,20,129,24,111,30,94,36,79,48,59,55,50,75,30,28,-39,52,-39,92,18,110,8,127,1,143,-3,161,-5,180,-6,234,1,279,24,314,61,336,109,344,166,343,184,340,203,336,220,331,237,325,252,319,263,313,272,305,281,296,291,285,302,16383,16383,97,61,88,80,82,99,77,119,75,141,74,165,79,218,93,261,115,293,144,313,180,320,196,319,211,315,225,309,238,300,251,287,16383,16383,263,270,272,251,279,232,284,212,286,190,287,165,282,113,268,70,246,38,217,18,180,11,164,12,149,16,135,22,122,32,109,44,227,378,154,453,149,457,145,460,141,462,137,463,132,464,126,463,121,461,118,458,115,454,114,448,115,443,117,439,120,434,124,430,129,426,206,378,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,
+48,59,55,50,81,307,81,307,55,50,64,41,81,307,64,41,74,165,74,165,75,30,75,141,75,141,75,30,77,119,282,113,268,70,279,24,279,24,268,70,246,38,279,24,246,38,234,1,234,1,246,38,217,18,234,1,217,18,180,11,180,11,164,12,180,-6,180,-6,164,12,161,-5,88,80,92,18,97,61,97,61,92,18,110,8,97,61,110,8,109,44,109,44,110,8,122,32,122,32,110,8,127,1,122,32,127,1,135,22,135,22,127,1,143,-3,135,22,143,-3,149,16,149,16,143,-3,161,-5,149,16,161,-5,164,12,92,18,88,80,82,99,92,18,82,99,77,119,92,18,77,119,75,30,92,18,75,30,52,-39,75,30,28,-39,52,-39,109,44,263,270,251,287,251,287,268,314,250,323,251,287,250,323,238,300,238,300,250,323,233,330,238,300,233,330,225,309,225,309,233,330,217,335,225,309,217,335,211,315,211,315,217,335,200,337,211,315,200,337,196,319,196,319,200,337,181,338,196,319,181,338,180,320,343,184,340,203,344,166,344,166,340,203,336,220,344,166,336,220,336,109,336,109,336,220,331,237,336,109,331,237,325,252,319,263,313,272,314,61,319,263,314,61,336,109,319,263,336,109,325,252,279,24,314,61,282,113,282,113,314,61,287,165,296,291,287,165,314,61,296,291,314,61,305,281,305,281,314,61,313,272,180,11,180,-6,234,1,263,270,272,251,268,314,268,314,272,251,285,302,268,314,285,302,305,367,305,367,285,302,329,367,285,302,272,251,279,232,285,302,279,232,284,212,285,302,284,212,286,190,285,302,286,190,296,291,251,287,97,61,109,44,93,261,115,293,127,330,127,330,115,293,144,313,127,330,144,313,181,338,181,338,144,313,180,320,81,307,74,165,79,218,81,307,79,218,93,261,81,307,93,261,127,330,47,270,25,222,30,94,47,270,30,94,36,79,47,270,36,79,42,69,47,270,42,69,48,59,47,270,48,59,81,307,25,222,17,165,18,147,25,222,18,147,20,129,25,222,20,129,24,111,25,222,24,111,30,94,296,291,286,190,287,165,268,314,251,287,263,270,75,30,74,165,64,41,
+227,378,154,453,149,457,145,460,141,462,137,463,132,464,126,463,121,461,118,458,115,454,114,448,115,443,117,439,120,434,124,430,129,426,206,378,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,132,378,152,378,229,427,234,431,238,435,241,439,243,443,244,448,243,454,241,458,237,461,233,463,227,464,222,463,218,462,214,460,210,457,205,453,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,
+206,378,227,378,154,453,206,378,154,453,149,457,206,378,149,457,145,460,206,378,145,460,141,462,206,378,141,462,137,463,206,378,137,463,132,464,206,378,132,464,129,426,114,448,115,443,115,454,115,454,115,443,117,439,115,454,117,439,118,458,118,458,117,439,120,434,118,458,120,434,121,461,121,461,120,434,124,430,121,461,124,430,126,463,126,463,124,430,129,426,126,463,129,426,132,464,105,79,106,8,109,63,109,63,106,8,121,1,109,63,121,1,115,50,115,50,121,1,125,37,135,30,125,37,138,-3,135,30,138,-3,146,24,146,24,138,-3,157,-5,146,24,157,-5,158,19,158,19,157,-5,177,-6,158,19,177,-6,173,16,173,16,177,-6,189,15,208,16,189,15,204,-5,208,16,204,-5,227,0,103,118,103,275,93,16,103,118,93,16,104,97,104,97,93,16,106,8,104,97,106,8,105,79,125,37,121,1,138,-3,283,103,282,85,290,45,290,45,282,85,279,70,290,45,279,70,278,30,278,30,279,70,273,57,278,30,273,57,265,45,265,45,254,34,264,17,264,17,254,34,247,6,241,26,225,20,227,0,241,26,227,0,247,6,241,26,247,6,254,34,353,331,237,331,257,319,353,331,257,319,270,312,353,331,270,312,279,301,353,331,279,301,318,311,353,331,318,311,331,318,353,331,331,318,353,321,305,258,306,282,297,62,305,258,297,62,302,81,305,258,302,81,305,104,305,258,305,104,305,131,290,45,297,62,306,282,290,45,306,282,283,257,290,45,283,257,283,125,290,45,283,125,283,103,310,300,318,311,282,283,310,300,282,283,283,257,310,300,283,257,306,282,265,45,264,17,278,30,189,15,177,-6,204,-5,128,319,148,321,148,331,128,319,148,331,115,314,115,314,148,331,51,297,115,314,51,297,52,280,53,95,52,280,52,124,58,69,66,48,104,293,104,293,66,48,78,30,104,293,78,30,103,275,103,275,78,30,93,16,104,293,108,306,52,280,104,293,52,280,53,95,104,293,53,95,58,69,148,331,7,331,27,319,148,331,27,319,40,315,148,331,40,315,47,308,148,331,47,308,51,297,27,319,7,331,7,321,115,314,52,280,108,306,257,319,237,331,237,321,318,311,279,301,282,283,208,16,227,0,225,20,
+132,378,152,378,229,427,234,431,238,435,241,439,243,443,244,448,243,454,241,458,237,461,233,463,227,464,222,463,218,462,214,460,210,457,205,453,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,256,378,193,462,162,462,100,378,117,378,177,430,238,378,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,252,411,250,419,247,426,241,431,234,435,227,436,219,435,212,431,207,426,203,419,202,411,
+105,79,106,8,109,63,109,63,106,8,121,1,109,63,121,1,115,50,115,50,121,1,125,37,135,30,125,37,138,-3,135,30,138,-3,146,24,146,24,138,-3,157,-5,146,24,157,-5,158,19,158,19,157,-5,177,-6,158,19,177,-6,173,16,173,16,177,-6,189,15,208,16,189,15,204,-5,208,16,204,-5,227,0,103,118,103,275,93,16,103,118,93,16,104,97,104,97,93,16,106,8,104,97,106,8,105,79,125,37,121,1,138,-3,227,464,229,427,233,463,233,463,229,427,234,431,233,463,234,431,237,461,237,461,234,431,238,435,237,461,238,435,241,458,241,458,238,435,241,439,241,458,241,439,243,454,243,454,241,439,243,443,243,454,243,443,244,448,229,427,227,464,222,463,229,427,222,463,218,462,229,427,218,462,214,460,229,427,214,460,210,457,229,427,210,457,205,453,229,427,205,453,152,378,283,103,282,85,290,45,290,45,282,85,279,70,290,45,279,70,278,30,278,30,279,70,273,57,278,30,273,57,265,45,265,45,254,34,264,17,264,17,254,34,247,6,241,26,225,20,227,0,241,26,227,0,247,6,241,26,247,6,254,34,353,331,237,331,257,319,353,331,257,319,270,312,353,331,270,312,279,301,353,331,279,301,318,311,353,331,318,311,331,318,353,331,331,318,353,321,305,258,306,282,297,62,305,258,297,62,302,81,305,258,302,81,305,104,305,258,305,104,305,131,290,45,297,62,306,282,290,45,306,282,283,257,290,45,283,257,283,125,290,45,283,125,283,103,310,300,318,311,282,283,310,300,282,283,283,257,310,300,283,257,306,282,265,45,264,17,278,30,189,15,177,-6,204,-5,128,319,148,321,148,331,128,319,148,331,115,314,115,314,148,331,51,297,115,314,51,297,52,280,53,95,52,280,52,124,58,69,66,48,104,293,104,293,66,48,78,30,104,293,78,30,103,275,103,275,78,30,93,16,104,293,108,306,52,280,104,293,52,280,53,95,104,293,53,95,58,69,148,331,7,331,27,319,148,331,27,319,40,315,148,331,40,315,47,308,148,331,47,308,51,297,27,319,7,331,7,321,115,314,52,280,108,306,257,319,237,331,237,321,318,311,279,301,282,283,208,16,227,0,225,20,152,378,205,453,132,378,
+256,378,193,462,162,462,100,378,117,378,177,430,238,378,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,252,411,250,419,247,426,241,431,234,435,227,436,219,435,212,431,207,426,203,419,202,411,203,403,207,397,212,391,218,388,226,387,234,388,241,391,247,397,250,403,252,411,16383,16383,152,411,151,419,147,426,142,431,135,435,127,436,119,435,113,431,107,426,104,419,103,411,104,403,107,397,112,391,119,388,127,387,135,388,142,391,147,397,151,403,152,411,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,
+100,378,117,378,162,462,162,462,117,378,177,430,162,462,177,430,193,462,193,462,177,430,238,378,193,462,238,378,256,378,105,79,106,8,109,63,109,63,106,8,121,1,109,63,121,1,115,50,115,50,121,1,125,37,135,30,125,37,138,-3,135,30,138,-3,146,24,146,24,138,-3,157,-5,146,24,157,-5,158,19,158,19,157,-5,177,-6,158,19,177,-6,173,16,173,16,177,-6,189,15,208,16,189,15,204,-5,208,16,204,-5,227,0,103,118,103,275,93,16,103,118,93,16,104,97,104,97,93,16,106,8,104,97,106,8,105,79,125,37,121,1,138,-3,283,103,282,85,290,45,290,45,282,85,279,70,290,45,279,70,278,30,278,30,279,70,273,57,278,30,273,57,265,45,265,45,254,34,264,17,264,17,254,34,247,6,241,26,225,20,227,0,241,26,227,0,247,6,241,26,247,6,254,34,353,331,237,331,257,319,353,331,257,319,270,312,353,331,270,312,279,301,353,331,279,301,318,311,353,331,318,311,331,318,353,331,331,318,353,321,305,258,306,282,297,62,305,258,297,62,302,81,305,258,302,81,305,104,305,258,305,104,305,131,290,45,297,62,306,282,290,45,306,282,283,257,290,45,283,257,283,125,290,45,283,125,283,103,310,300,318,311,282,283,310,300,282,283,283,257,310,300,283,257,306,282,265,45,264,17,278,30,189,15,177,-6,204,-5,128,319,148,321,148,331,128,319,148,331,115,314,115,314,148,331,51,297,115,314,51,297,52,280,53,95,52,280,52,124,58,69,66,48,104,293,104,293,66,48,78,30,104,293,78,30,103,275,103,275,78,30,93,16,104,293,108,306,52,280,104,293,52,280,53,95,104,293,53,95,58,69,148,331,7,331,27,319,148,331,27,319,40,315,148,331,40,315,47,308,148,331,47,308,51,297,27,319,7,331,7,321,115,314,52,280,108,306,257,319,237,331,237,321,318,311,279,301,282,283,208,16,227,0,225,20,
+252,411,250,419,247,426,241,431,234,435,227,436,219,435,212,431,207,426,203,419,202,411,203,403,207,397,212,391,218,388,226,387,234,388,241,391,247,397,250,403,252,411,16383,16383,152,411,151,419,147,426,142,431,135,435,127,436,119,435,113,431,107,426,104,419,103,411,104,403,107,397,112,391,119,388,127,387,135,388,142,391,147,397,151,403,152,411,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,133,378,153,378,230,427,240,435,243,439,244,443,245,448,244,454,242,458,238,461,234,463,228,464,223,463,219,462,216,460,211,457,206,453,16383,16383,352,331,243,331,243,321,256,321,266,319,272,316,275,312,276,306,276,302,274,294,272,290,270,285,197,174,124,285,121,289,118,294,116,299,115,304,115,308,116,312,119,316,123,318,130,320,138,321,151,321,151,331,11,331,11,321,24,319,37,313,50,299,68,277,92,243,157,147,157,61,156,39,152,25,144,16,129,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,151,282,266,297,288,310,303,322,313,336,319,352,321,101,266,101,268,100,269,100,271,101,292,105,306,113,314,127,319,147,321,147,331,8,331,8,321,27,319,39,314,46,307,49,294,50,276,50,60,49,39,46,25,39,17,27,12,8,9,8,0,148,0,148,9,128,11,114,16,106,23,102,36,101,55,101,80,109,80,115,79,136,79,158,80,177,82,194,85,210,90,
+202,411,203,403,203,419,203,419,203,403,207,397,203,419,207,397,207,426,207,426,207,397,212,391,207,426,212,391,212,431,212,431,212,391,218,388,212,431,218,388,219,435,219,435,218,388,226,387,219,435,226,387,227,436,227,436,226,387,234,388,227,436,234,388,234,435,234,435,234,388,241,391,234,435,241,391,241,431,241,431,241,391,247,397,241,431,247,397,247,426,247,426,247,397,250,403,247,426,250,403,250,419,250,419,250,403,252,411,103,411,104,403,104,419,104,419,104,403,107,397,104,419,107,397,107,426,107,426,107,397,112,391,107,426,112,391,113,431,113,431,112,391,119,388,113,431,119,388,119,435,119,435,119,388,127,387,119,435,127,387,127,436,127,436,127,387,135,388,127,436,135,388,135,435,135,435,135,388,142,391,135,435,142,391,142,431,142,431,142,391,147,397,142,431,147,397,147,426,147,426,147,397,151,403,147,426,151,403,151,419,151,419,151,403,152,411,105,79,106,8,109,63,109,63,106,8,121,1,109,63,121,1,115,50,115,50,121,1,125,37,135,30,125,37,138,-3,135,30,138,-3,146,24,146,24,138,-3,157,-5,146,24,157,-5,158,19,158,19,157,-5,177,-6,158,19,177,-6,173,16,173,16,177,-6,189,15,208,16,189,15,204,-5,208,16,204,-5,227,0,103,118,103,275,93,16,103,118,93,16,104,97,104,97,93,16,106,8,104,97,106,8,105,79,125,37,121,1,138,-3,283,103,282,85,290,45,290,45,282,85,279,70,290,45,279,70,278,30,278,30,279,70,273,57,278,30,273,57,265,45,265,45,254,34,264,17,264,17,254,34,247,6,241,26,225,20,227,0,241,26,227,0,247,6,241,26,247,6,254,34,353,331,237,331,257,319,353,331,257,319,270,312,353,331,270,312,279,301,353,331,279,301,318,311,353,331,318,311,331,318,353,331,331,318,353,321,305,258,306,282,297,62,305,258,297,62,302,81,305,258,302,81,305,104,305,258,305,104,305,131,290,45,297,62,306,282,290,45,306,282,283,257,290,45,283,257,283,125,290,45,283,125,283,103,310,300,318,311,282,283,310,300,282,283,283,257,310,300,283,257,306,282,265,45,264,17,278,30,189,15,177,-6,204,-5,128,319,148,321,148,331,128,319,148,331,115,314,115,314,148,331,51,297,115,314,51,297,52,280,53,95,52,280,52,124,58,69,66,48,104,293,104,293,66,48,78,30,104,293,78,30,103,275,103,275,78,30,93,16,104,293,108,306,52,280,104,293,52,280,53,95,104,293,53,95,58,69,148,331,7,331,27,319,148,331,27,319,40,315,148,331,40,315,47,308,148,331,47,308,51,297,27,319,7,331,7,321,115,314,52,280,108,306,257,319,237,331,237,321,318,311,279,301,282,283,208,16,227,0,225,20,
+133,378,153,378,230,427,240,435,243,439,244,443,245,448,244,454,242,458,238,461,234,463,228,464,223,463,219,462,216,460,211,457,206,453,16383,16383,352,331,243,331,243,321,256,321,266,319,272,316,275,312,276,306,276,302,274,294,272,290,270,285,197,174,124,285,121,289,118,294,116,299,115,304,115,308,116,312,119,316,123,318,130,320,138,321,151,321,151,331,11,331,11,321,24,319,37,313,50,299,68,277,92,243,157,147,157,61,156,39,152,25,144,16,129,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,151,282,266,297,288,310,303,322,313,336,319,352,321,101,266,101,268,100,269,100,271,101,292,105,306,113,314,127,319,147,321,147,331,8,331,8,321,27,319,39,314,46,307,49,294,50,276,50,60,49,39,46,25,39,17,27,12,8,9,8,0,148,0,148,9,128,11,114,16,106,23,102,36,101,55,101,80,109,80,115,79,136,79,158,80,177,82,194,85,210,90,223,96,239,107,253,121,263,138,269,156,271,175,265,206,248,231,221,250,185,262,141,266,16383,16383,101,230,101,237,103,242,106,245,110,247,117,247,154,244,182,236,201,221,213,200,217,172,213,146,202,126,185,111,161,102,129,99,113,99,107,100,101,100,36,42,36,28,33,19,
+121,289,118,294,157,147,157,147,118,294,116,299,157,147,116,299,92,243,92,243,116,299,115,304,92,243,115,304,115,308,115,308,116,312,92,243,151,331,11,331,24,319,151,331,24,319,37,313,151,331,37,313,50,299,151,331,50,299,123,318,151,331,123,318,130,320,151,331,130,320,138,321,151,331,138,321,151,321,123,318,50,299,119,316,119,316,50,299,68,277,119,316,68,277,116,312,116,312,68,277,92,243,209,55,209,151,197,174,209,55,197,174,210,36,210,36,197,174,157,147,210,36,157,147,215,23,215,23,157,147,157,61,215,23,157,61,224,15,224,15,157,61,156,39,224,15,156,39,260,0,260,0,156,39,152,25,260,0,152,25,144,16,275,298,274,294,282,266,282,266,274,294,272,290,282,266,272,290,270,285,270,285,197,174,209,151,352,331,243,331,256,321,352,331,256,321,266,319,352,331,266,319,272,316,352,331,272,316,275,312,352,331,275,312,276,306,352,331,276,306,322,313,352,331,322,313,336,319,352,331,336,319,352,321,276,306,282,266,297,288,276,306,297,288,310,303,276,306,310,303,322,313,282,266,276,306,276,302,282,266,276,302,275,298,270,285,209,151,282,266,228,464,230,427,234,463,234,463,230,427,235,431,234,463,235,431,238,461,238,461,235,431,240,435,238,461,240,435,242,458,242,458,240,435,243,439,242,458,243,439,244,454,244,454,243,439,244,443,244,454,244,443,245,448,230,427,228,464,223,463,230,427,223,463,219,462,230,427,219,462,216,460,230,427,216,460,211,457,230,427,211,457,206,453,230,427,206,453,153,378,239,11,224,15,260,0,239,11,260,0,260,9,129,12,107,9,260,0,129,12,260,0,144,16,124,285,121,289,157,147,124,285,157,147,197,174,260,0,107,9,107,0,153,378,206,453,133,378,256,321,243,331,243,321,24,319,11,331,11,321,
+101,266,101,268,100,269,100,271,101,292,105,306,113,314,127,319,147,321,147,331,8,331,8,321,27,319,39,314,46,307,49,294,50,276,50,60,49,39,46,25,39,17,27,12,8,9,8,0,148,0,148,9,128,11,114,16,106,23,102,36,101,55,101,80,109,80,115,79,136,79,158,80,177,82,194,85,210,90,223,96,239,107,253,121,263,138,269,156,271,175,265,206,248,231,221,250,185,262,141,266,16383,16383,101,230,101,237,103,242,106,245,110,247,117,247,154,244,182,236,201,221,213,200,217,172,213,146,202,126,185,111,161,102,129,99,113,99,107,100,101,100,36,42,36,28,33,19,28,13,19,9,6,7,6,0,79,0,79,275,81,293,86,308,95,319,107,326,122,328,137,325,150,316,159,302,165,282,167,258,165,237,159,220,150,207,137,199,119,195,114,194,110,193,107,191,105,189,105,184,107,182,110,180,115,179,121,179,145,173,163,161,176,140,184,111,187,75,186,61,185,48,182,36,179,26,175,19,172,15,164,11,160,10,155,10,150,11,146,12,143,15,142,19,141,25,140,36,138,42,135,48,130,52,125,55,118,56,111,55,105,51,100,46,97,40,96,32,98,20,105,10,115,2,129,-2,145,-3,173,0,198,14,
+50,276,102,36,50,276,50,276,102,36,101,55,50,276,101,55,100,271,100,271,101,292,50,276,50,276,101,292,105,306,50,276,105,306,113,314,147,331,8,331,27,319,147,331,27,319,39,314,147,331,39,314,46,307,147,331,46,307,49,294,147,331,49,294,113,314,147,331,113,314,127,319,147,331,127,319,147,321,50,276,113,314,49,294,101,237,103,242,101,266,101,266,103,242,106,245,101,266,106,245,141,266,141,266,106,245,110,247,141,266,110,247,117,247,117,247,154,244,141,266,141,266,154,244,185,262,201,221,213,200,221,250,221,250,213,200,217,172,223,96,217,172,213,146,185,262,154,244,182,236,185,262,182,236,201,221,185,262,201,221,221,250,265,206,248,231,253,121,265,206,253,121,263,138,265,206,263,138,269,156,265,206,269,156,271,175,248,231,221,250,223,96,248,231,223,96,239,107,248,231,239,107,253,121,136,79,158,80,161,102,161,102,158,80,177,82,161,102,177,82,185,111,185,111,177,82,194,85,185,111,194,85,202,126,202,126,194,85,210,90,202,126,210,90,213,146,213,146,210,90,223,96,161,102,129,99,136,79,136,79,129,99,128,79,128,79,129,99,124,99,128,79,124,99,122,79,122,79,124,99,118,99,122,79,118,99,115,79,115,79,118,99,113,99,115,79,113,99,109,80,109,80,113,99,107,100,109,80,107,100,101,100,101,266,101,100,101,230,101,266,101,230,101,237,101,267,101,268,101,55,101,267,101,55,101,100,101,267,101,100,101,266,101,100,101,80,109,80,148,0,148,9,128,11,148,0,128,11,114,16,148,0,114,16,49,39,148,0,49,39,46,25,148,0,46,25,39,17,148,0,39,17,27,12,148,0,27,12,8,9,148,0,8,9,8,0,101,55,101,268,100,269,101,55,100,269,100,270,101,55,100,270,100,271,50,60,49,39,114,16,50,60,114,16,106,23,50,60,106,23,102,36,50,60,102,36,50,276,217,172,223,96,221,250,27,319,8,331,8,321,
+36,42,36,28,33,19,28,13,19,9,6,7,6,0,79,0,79,275,81,293,86,308,95,319,107,326,122,328,137,325,150,316,159,302,165,282,167,258,165,237,159,220,150,207,137,199,119,195,114,194,110,193,107,191,105,189,105,184,107,182,110,180,115,179,121,179,145,173,163,161,176,140,184,111,187,75,186,61,185,48,182,36,179,26,175,19,172,15,164,11,160,10,155,10,150,11,146,12,143,15,142,19,141,25,140,36,138,42,135,48,130,52,125,55,118,56,111,55,105,51,100,46,97,40,96,32,98,20,105,10,115,2,129,-2,145,-3,173,0,198,14,217,35,229,62,234,93,233,110,229,125,223,139,214,152,203,163,193,170,183,176,172,181,158,185,142,189,169,203,189,216,202,230,208,246,210,266,207,291,195,312,178,328,154,338,126,342,93,337,68,324,50,301,40,269,36,227,158,253,86,328,81,332,77,335,73,337,65,339,59,338,53,336,50,333,47,329,46,323,47,318,49,314,52,309,56,305,61,301,138,253,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,
+33,19,28,13,79,0,79,0,28,13,19,9,79,0,19,9,6,7,158,185,142,189,145,173,145,173,142,189,137,199,145,173,137,199,121,179,121,179,137,199,119,195,121,179,119,195,115,179,115,179,119,195,114,194,115,179,114,194,110,180,110,180,114,194,110,193,110,180,110,193,107,182,107,182,110,193,107,191,107,182,107,191,105,184,105,184,107,191,105,189,105,184,105,189,105,187,81,293,86,308,93,337,93,337,86,308,95,319,93,337,95,319,126,342,126,342,95,319,107,326,126,342,107,326,122,328,122,328,137,325,126,342,126,342,137,325,154,338,165,237,169,203,167,258,167,258,169,203,178,328,178,328,169,203,189,216,178,328,189,216,195,312,195,312,189,216,202,230,195,312,202,230,207,291,207,291,202,230,208,246,207,291,208,246,210,266,137,325,150,316,154,338,154,338,150,316,159,302,154,338,159,302,178,328,178,328,159,302,165,282,178,328,165,282,167,258,150,207,142,189,169,203,150,207,169,203,159,220,159,220,169,203,165,237,229,62,234,93,233,110,229,62,233,110,229,125,229,62,229,125,223,139,229,62,223,139,217,35,223,139,214,152,217,35,217,35,214,152,203,163,217,35,203,163,198,14,198,14,203,163,193,170,198,14,193,170,187,75,187,75,193,170,184,111,198,14,187,75,186,61,198,14,186,61,185,48,198,14,185,48,182,36,198,14,182,36,179,26,198,14,179,26,175,19,198,14,175,19,173,0,141,25,140,36,138,42,141,25,138,42,145,-3,141,25,145,-3,142,19,68,324,50,301,79,0,68,324,79,0,79,275,68,324,79,275,81,293,68,324,81,293,93,337,79,0,50,301,40,269,79,0,40,269,36,227,79,0,36,227,36,42,79,0,36,42,36,28,79,0,36,28,33,19,168,13,164,11,173,0,173,0,164,11,160,10,173,0,160,10,155,10,155,10,150,11,173,0,173,0,150,11,146,12,173,0,146,12,145,-3,145,-3,146,12,143,15,145,-3,143,15,142,19,168,13,173,0,172,15,172,15,173,0,175,19,138,42,135,48,145,-3,145,-3,135,48,130,52,145,-3,130,52,129,-2,129,-2,130,52,125,55,129,-2,125,55,118,56,115,2,129,-2,118,56,115,2,118,56,111,55,115,2,111,55,105,51,115,2,105,51,105,10,100,46,97,40,98,20,100,46,98,20,105,10,100,46,105,10,105,51,158,185,163,161,172,181,172,181,163,161,176,140,172,181,176,140,183,176,183,176,176,140,184,111,183,176,184,111,193,170,158,185,145,173,163,161,98,20,97,40,96,32,79,0,6,7,6,0,142,189,150,207,137,199,
+158,253,86,328,81,332,77,335,73,337,65,339,59,338,53,336,50,333,47,329,46,323,47,318,49,314,52,309,56,305,61,301,138,253,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,60,253,79,253,156,302,162,306,166,310,169,314,171,318,171,329,168,333,165,336,160,338,154,339,146,337,142,335,138,332,133,328,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,190,253,
+138,253,158,253,86,328,138,253,86,328,81,332,138,253,81,332,77,335,138,253,77,335,73,337,138,253,73,337,69,338,138,253,69,338,65,339,138,253,65,339,61,301,46,323,47,318,47,329,47,329,47,318,49,314,47,329,49,314,50,333,50,333,49,314,52,309,50,333,52,309,53,336,53,336,52,309,56,305,53,336,56,305,59,338,59,338,56,305,61,301,59,338,61,301,65,339,37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,184,56,186,-3,185,44,29,167,29,183,28,175,
+60,253,79,253,156,302,162,306,166,310,169,314,171,318,171,329,168,333,165,336,160,338,154,339,146,337,142,335,138,332,133,328,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,190,253,128,337,97,337,35,253,52,253,113,305,174,253,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,180,319,175,309,170,302,165,297,160,295,153,294,149,294,144,295,138,297,
+37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,154,339,156,302,160,338,160,338,156,302,162,306,160,338,162,306,165,336,165,336,162,306,166,310,165,336,166,310,168,333,168,333,166,310,169,314,168,333,169,314,171,329,171,329,169,314,171,318,171,329,171,318,171,323,156,302,154,339,150,338,156,302,150,338,146,337,156,302,146,337,142,335,156,302,142,335,138,332,156,302,138,332,133,328,156,302,133,328,79,253,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,79,253,133,328,60,253,184,56,186,-3,185,44,29,167,29,183,28,175,
+190,253,128,337,97,337,35,253,52,253,113,305,174,253,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,180,319,175,309,170,302,165,297,160,295,153,294,149,294,144,295,138,297,133,299,127,301,115,307,108,311,94,315,87,316,80,316,66,314,54,308,43,298,35,284,30,266,44,266,48,274,52,281,57,285,63,288,70,289,73,289,81,287,86,285,90,283,102,278,112,273,121,269,128,267,135,266,142,266,157,268,169,274,180,284,188,299,195,319,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,
+35,253,52,253,97,337,97,337,52,253,113,305,97,337,113,305,128,337,128,337,113,305,174,253,128,337,174,253,190,253,37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,184,56,186,-3,185,44,29,167,29,183,28,175,
+180,319,175,309,170,302,165,297,160,295,153,294,149,294,144,295,138,297,133,299,127,301,115,307,108,311,94,315,87,316,80,316,66,314,54,308,43,298,35,284,30,266,44,266,48,274,52,281,57,285,63,288,70,289,73,289,81,287,86,285,90,283,102,278,112,273,121,269,128,267,135,266,142,266,157,268,169,274,180,284,188,299,195,319,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,186,286,185,294,182,301,176,306,169,310,161,311,154,310,147,306,142,301,138,294,137,286,138,278,142,272,147,266,153,263,161,262,169,263,176,266,182,272,185,278,186,286,16383,16383,87,286,86,294,82,301,77,306,70,310,62,311,54,310,48,306,42,301,39,294,37,286,39,278,42,272,47,266,54,263,61,262,69,263,76,266,82,272,86,278,87,286,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,
+48,274,52,281,54,308,54,308,52,281,57,285,54,308,57,285,66,314,66,314,57,285,63,288,66,314,63,288,70,289,70,289,73,289,80,316,80,316,73,289,77,288,80,316,77,288,81,287,44,266,48,274,54,308,44,266,54,308,43,298,44,266,43,298,35,284,44,266,35,284,30,266,37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,80,316,81,287,87,316,87,316,81,287,86,285,87,316,86,285,90,283,90,283,102,278,94,315,94,315,102,278,101,313,80,316,66,314,70,289,94,315,87,316,90,283,101,313,102,278,108,311,108,311,102,278,112,273,108,311,112,273,115,307,115,307,112,273,121,269,115,307,121,269,127,301,127,301,121,269,128,267,127,301,128,267,133,299,133,299,128,267,135,266,133,299,135,266,138,297,138,297,135,266,142,266,138,297,142,266,144,295,144,295,142,266,157,268,144,295,157,268,149,294,149,294,157,268,153,294,160,295,153,294,157,268,160,295,157,268,169,274,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,180,319,175,309,180,284,180,319,180,284,188,299,180,319,188,299,195,319,170,302,165,297,169,274,170,302,169,274,180,284,170,302,180,284,175,309,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,29,167,29,183,28,175,160,295,169,274,165,297,184,56,186,-3,185,44,
+186,286,185,294,182,301,176,306,169,310,161,311,154,310,147,306,142,301,138,294,137,286,138,278,142,272,147,266,153,263,161,262,169,263,176,266,182,272,185,278,186,286,16383,16383,87,286,86,294,82,301,77,306,70,310,62,311,54,310,48,306,42,301,39,294,37,286,39,278,42,272,47,266,54,263,61,262,69,263,76,266,82,272,86,278,87,286,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,162,306,159,322,152,336,142,347,128,354,113,357,97,354,83,347,72,336,65,323,63,307,65,291,72,277,83,267,96,260,112,257,128,260,141,267,152,277,159,291,162,306,16383,16383,145,307,143,296,139,287,132,280,122,276,112,274,101,276,92,280,85,287,81,296,79,307,81,317,86,326,93,333,102,338,112,339,122,338,131,333,139,326,143,317,145,307,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,
+161,311,161,262,169,310,169,310,161,262,169,263,169,310,169,263,176,306,176,306,169,263,176,266,176,306,176,266,182,301,182,301,176,266,182,272,182,301,182,272,185,294,185,294,182,272,185,278,185,294,185,278,186,286,137,286,138,278,138,294,138,294,138,278,142,272,138,294,142,272,142,301,142,301,142,272,147,266,142,301,147,266,147,306,147,306,147,266,153,263,147,306,153,263,154,310,154,310,153,263,161,262,154,310,161,262,161,311,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,37,286,39,278,39,294,39,294,39,278,42,272,39,294,42,272,42,301,42,301,42,272,47,266,42,301,47,266,48,306,48,306,47,266,54,263,48,306,54,263,54,310,54,310,54,263,61,262,54,310,61,262,62,311,62,311,61,262,69,263,62,311,69,263,70,310,70,310,69,263,76,266,70,310,76,266,77,306,77,306,76,266,82,272,77,306,82,272,82,301,82,301,82,272,86,278,82,301,86,278,86,294,86,294,86,278,87,286,37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,29,167,29,183,28,175,184,56,186,-3,185,44,
+162,306,159,322,152,336,142,347,128,354,113,357,97,354,83,347,72,336,65,323,63,307,65,291,72,277,83,267,96,260,112,257,128,260,141,267,152,277,159,291,162,306,16383,16383,145,307,143,296,139,287,132,280,122,276,112,274,101,276,92,280,85,287,81,296,79,307,81,317,86,326,93,333,102,338,112,339,122,338,131,333,139,326,143,317,145,307,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,310,77,296,58,283,44,269,35,254,30,238,28,226,30,215,33,205,38,197,45,190,54,185,65,181,78,179,93,178,112,177,138,308,138,302,173,292,199,277,216,255,227,228,230,215,229,203,227,192,222,181,216,169,206,157,216,147,222,136,227,123,229,109,230,84,227,62,220,45,208,34,193,30,176,31,168,34,161,38,156,44,153,52,152,59,153,66,156,70,161,73,167,74,175,74,185,73,188,73,196,74,203,79,208,86,213,96,216,107,217,119,215,127,210,133,202,136,189,137,172,137,141,73,123,48,112,32,99,24,84,20,68,19,50,22,32,30,17,42,6,58,0,77,-2,91,-1,105,1,119,7,134,17,153,31,164,18,175,8,188,1,202,-1,218,-2,230,-2,243,0,254,3,266,9,276,17,285,24,293,33,300,44,308,58,316,75,16383,16383,177,153,180,177,186,194,194,206,206,212,221,214,235,212,246,206,254,194,259,177,261,153,16383,16383,137,100,138,90,140,68,146,46,146,45,147,45,147,44,143,38,134,31,121,25,108,21,95,19,83,21,74,28,67,37,64,49,63,63,64,79,71,92,85,103,106,114,137,127,199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,
+143,296,139,287,141,267,141,267,139,287,132,280,141,267,132,280,128,260,128,260,132,280,122,276,128,260,122,276,112,257,112,257,122,276,112,274,63,307,65,291,65,323,65,323,65,291,72,277,65,323,72,277,72,336,72,336,72,277,83,267,72,336,83,267,79,307,79,307,83,347,72,336,37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,113,357,112,339,122,338,113,357,122,338,128,354,128,354,122,338,131,333,128,354,131,333,142,347,142,347,131,333,139,326,142,347,139,326,143,317,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,162,306,159,322,159,291,159,291,159,322,152,336,159,291,152,336,152,277,152,277,152,336,145,307,143,317,145,307,152,336,143,317,152,336,142,347,143,296,141,267,152,277,143,296,152,277,145,307,86,326,93,333,97,354,97,354,93,333,102,338,97,354,102,338,113,357,113,357,102,338,112,339,83,347,79,307,81,317,83,347,81,317,86,326,83,347,86,326,97,354,101,276,92,280,96,260,101,276,96,260,112,257,101,276,112,257,112,274,85,287,81,296,83,267,85,287,83,267,96,260,85,287,96,260,92,280,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,79,307,83,267,81,296,184,56,186,-3,185,44,29,167,29,183,28,175,
+310,77,296,58,283,44,269,35,254,30,238,28,226,30,215,33,205,38,197,45,190,54,185,65,181,78,179,93,178,112,177,138,308,138,302,173,292,199,277,216,255,227,228,230,215,229,203,227,192,222,181,216,169,206,157,216,147,222,136,227,123,229,109,230,84,227,62,220,45,208,34,193,30,176,31,168,34,161,38,156,44,153,52,152,59,153,66,156,70,161,73,167,74,175,74,185,73,188,73,196,74,203,79,208,86,213,96,216,107,217,119,215,127,210,133,202,136,189,137,172,137,141,73,123,48,112,32,99,24,84,20,68,19,50,22,32,30,17,42,6,58,0,77,-2,91,-1,105,1,119,7,134,17,153,31,164,18,175,8,188,1,202,-1,218,-2,230,-2,243,0,254,3,266,9,276,17,285,24,293,33,300,44,308,58,316,75,16383,16383,177,153,180,177,186,194,194,206,206,212,221,214,235,212,246,206,254,194,259,177,261,153,16383,16383,137,100,138,90,140,68,146,46,146,45,147,45,147,44,143,38,134,31,121,25,108,21,95,19,83,21,74,28,67,37,64,49,63,63,64,79,71,92,85,103,106,114,137,127,199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,195,166,198,172,199,179,195,195,184,209,167,220,146,227,122,230,108,229,94,226,80,220,67,213,55,204,40,189,28,172,19,152,14,130,12,106,16,72,27,43,45,20,68,4,96,-3,77,-49,80,-51,83,-50,85,-50,88,-49,94,-49,104,-50,112,-52,117,-55,120,-60,121,-67,120,-74,116,-81,111,-85,103,-88,94,-89,88,-89,82,-88,75,-87,69,-86,61,-83,54,-98,63,-102,79,-106,87,-106,96,-107,117,-105,135,-99,148,-91,156,-79,158,-64,157,-52,151,-43,142,-36,130,-32,116,-30,108,-30,105,-31,103,-31,113,-4,136,0,156,9,174,24,190,46,206,74,155,253,83,328,78,332,74,335,69,337,61,339,55,338,50,336,46,333,44,329,43,323,44,318,46,314,49,309,53,305,58,301,135,253,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,
+73,196,73,196,73,196,73,196,74,203,62,220,73,196,62,220,66,156,73,196,66,156,70,161,143,38,134,31,134,17,134,17,134,31,121,25,134,17,121,25,119,7,119,7,121,25,108,21,119,7,108,21,105,1,105,1,108,21,95,19,105,1,95,19,91,-1,91,-1,95,19,83,21,91,-1,83,21,77,-2,77,-2,83,21,74,28,77,-2,74,28,67,37,63,63,58,0,64,49,64,49,58,0,77,-2,64,49,77,-2,67,37,74,203,79,208,84,227,84,227,79,208,86,213,84,227,86,213,109,230,109,230,86,213,96,216,109,230,96,216,107,217,107,217,119,215,109,230,109,230,119,215,123,229,175,8,177,138,169,206,175,8,169,206,164,18,164,18,169,206,157,216,164,18,157,216,153,31,153,31,157,216,147,44,147,45,147,44,147,222,147,222,147,44,157,216,147,222,136,227,136,189,147,222,136,189,137,172,147,222,137,172,137,127,147,222,137,127,138,90,147,222,138,90,139,79,147,222,139,79,140,68,147,222,140,68,143,57,147,222,143,57,146,46,147,222,146,46,146,45,147,222,146,45,147,45,137,141,137,127,137,172,136,227,123,229,127,210,136,227,127,210,133,202,136,227,133,202,136,189,228,230,221,214,235,212,228,230,235,212,255,227,255,227,235,212,246,206,255,227,246,206,254,194,177,153,180,177,181,216,181,216,180,177,186,194,181,216,186,194,192,222,192,222,186,194,194,206,192,222,194,206,203,227,203,227,194,206,206,212,203,227,206,212,215,229,215,229,206,212,221,214,215,229,221,214,228,230,277,216,261,153,308,138,308,138,261,153,177,153,308,138,177,153,177,138,169,206,177,138,177,153,169,206,177,153,181,216,259,177,261,153,277,216,259,177,277,216,255,227,259,177,255,227,254,194,292,199,277,216,308,138,292,199,308,138,302,173,226,30,215,33,218,-2,218,-2,215,33,205,38,218,-2,205,38,202,-1,202,-1,205,38,197,45,202,-1,197,45,190,54,190,54,185,65,188,1,188,1,185,65,181,78,188,1,181,78,179,93,175,8,188,1,179,93,175,8,179,93,178,112,175,8,178,112,177,138,218,-2,230,-2,226,30,226,30,230,-2,238,28,254,30,238,28,243,0,254,30,243,0,254,3,190,54,188,1,202,-1,285,24,293,33,296,58,296,58,293,33,300,44,296,58,300,44,310,77,310,77,300,44,308,58,310,77,308,58,316,75,254,3,266,9,269,35,269,35,266,9,276,17,269,35,276,17,283,44,283,44,276,17,285,24,283,44,285,24,296,58,238,28,230,-2,243,0,143,38,134,17,153,31,143,38,153,31,147,44,64,79,71,92,73,123,73,123,71,92,85,103,73,123,85,103,137,141,137,141,85,103,106,114,137,141,106,114,137,127,42,6,58,0,48,112,48,112,58,0,63,63,48,112,63,63,64,79,20,68,22,32,24,84,24,84,22,32,30,17,24,84,30,17,32,99,32,99,30,17,42,6,32,99,42,6,48,112,38,156,44,153,45,208,45,208,44,153,52,152,45,208,52,152,62,220,62,220,52,152,59,153,62,220,59,153,66,156,34,193,30,176,31,168,34,193,31,168,34,161,34,193,34,161,38,156,34,193,38,156,45,208,74,185,73,188,73,167,74,185,73,167,74,175,74,185,74,175,74,180,73,167,73,188,73,192,73,167,73,192,73,196,73,167,73,196,70,161,62,220,74,203,84,227,22,32,20,68,19,50,48,112,64,79,73,123,138,90,137,127,137,100,254,30,254,3,269,35,123,229,119,215,127,210,
+199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,195,166,198,172,199,179,195,195,184,209,167,220,146,227,122,230,108,229,94,226,80,220,67,213,55,204,40,189,28,172,19,152,14,130,12,106,16,72,27,43,45,20,68,4,96,-3,77,-49,80,-51,83,-50,85,-50,88,-49,94,-49,104,-50,112,-52,117,-55,120,-60,121,-67,120,-74,116,-81,111,-85,103,-88,94,-89,88,-89,82,-88,75,-87,69,-86,61,-83,54,-98,63,-102,79,-106,87,-106,96,-107,117,-105,135,-99,148,-91,156,-79,158,-64,157,-52,151,-43,142,-36,130,-32,116,-30,108,-30,105,-31,103,-31,113,-4,136,0,156,9,174,24,190,46,206,74,155,253,83,328,78,332,74,335,69,337,61,339,55,338,50,336,46,333,44,329,43,323,44,318,46,314,49,309,53,305,58,301,135,253,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,58,253,78,253,155,302,161,306,165,310,168,314,170,318,170,323,169,329,167,333,163,336,158,338,152,339,148,338,145,337,141,335,137,332,132,328,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,
+81,49,65,69,68,4,68,4,65,69,54,96,68,4,54,96,45,20,45,20,54,96,51,128,55,204,51,128,54,157,55,204,54,157,63,181,87,-106,96,-107,88,-89,88,-89,96,-107,94,-89,103,-88,94,-89,96,-107,103,-88,96,-107,117,-105,96,-3,94,-49,104,-50,96,-3,104,-50,103,-31,96,-3,103,-31,103,36,103,36,103,-31,113,-4,96,-3,77,-49,80,-51,96,-3,80,-51,83,-50,96,-3,83,-50,85,-50,96,-3,85,-50,88,-49,96,-3,88,-49,91,-49,96,-3,91,-49,94,-49,185,60,172,46,174,24,174,24,172,46,159,38,174,24,159,38,156,9,156,9,159,38,144,33,156,9,144,33,136,0,136,0,144,33,128,31,113,-4,136,0,128,31,113,-4,128,31,103,36,81,49,68,4,96,-3,81,49,96,-3,103,36,136,212,141,208,146,227,146,227,141,208,145,201,146,227,145,201,148,191,148,191,151,180,167,220,167,220,151,180,154,172,167,220,154,172,159,166,122,230,119,215,128,215,122,230,128,215,146,227,146,227,128,215,136,212,195,195,184,209,189,161,195,195,189,161,195,166,195,195,195,166,198,172,195,195,198,172,199,179,184,209,167,220,169,158,184,209,169,158,175,157,184,209,175,157,183,158,184,209,183,158,189,161,167,220,159,166,163,161,167,220,163,161,169,158,167,220,146,227,148,191,190,46,206,74,199,78,190,46,199,78,185,60,190,46,185,60,174,24,96,211,119,215,108,229,96,211,108,229,94,226,96,211,94,226,80,220,96,211,80,220,78,200,67,213,55,204,63,181,67,213,63,181,78,200,67,213,78,200,80,220,45,20,51,128,55,204,45,20,55,204,40,189,45,20,40,189,28,172,45,20,28,172,27,43,19,152,14,130,16,72,19,152,16,72,27,43,19,152,27,43,28,172,158,-64,157,-52,156,-79,156,-79,157,-52,151,-43,156,-79,151,-43,148,-91,148,-91,151,-43,142,-36,148,-91,142,-36,135,-99,135,-99,142,-36,130,-32,135,-99,130,-32,121,-67,121,-67,130,-32,120,-60,117,-55,120,-60,130,-32,117,-55,130,-32,116,-30,117,-55,116,-30,113,-30,117,-55,113,-30,112,-52,112,-52,113,-30,110,-30,112,-52,110,-30,108,-30,112,-52,108,-30,105,-31,112,-52,105,-31,104,-50,135,-99,121,-67,120,-74,135,-99,120,-74,117,-105,117,-105,120,-74,116,-81,117,-105,116,-81,111,-85,61,-83,63,-102,69,-86,69,-86,63,-102,71,-104,69,-86,71,-104,75,-87,75,-87,71,-104,79,-106,75,-87,79,-106,82,-88,82,-88,79,-106,87,-106,82,-88,87,-106,88,-89,63,-102,61,-83,54,-98,103,-88,117,-105,111,-85,103,-31,104,-50,105,-31,119,215,122,230,108,229,16,72,14,130,12,106,
+155,253,83,328,78,332,74,335,69,337,61,339,55,338,50,336,46,333,44,329,43,323,44,318,46,314,49,309,53,305,58,301,135,253,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,58,253,78,253,155,302,161,306,165,310,168,314,170,318,170,323,169,329,167,333,163,336,158,338,152,339,148,338,145,337,141,335,137,332,132,328,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,
+56,85,75,0,62,71,62,71,75,0,71,57,80,47,71,57,75,0,80,47,75,0,108,-4,52,100,50,118,49,15,52,100,49,15,75,0,52,100,75,0,56,85,12,108,17,70,17,148,17,148,17,70,29,39,17,148,29,39,31,182,31,182,29,39,49,15,31,182,49,15,49,138,49,138,49,15,50,118,135,253,155,253,83,328,135,253,83,328,78,332,135,253,78,332,74,335,135,253,74,335,69,337,135,253,69,337,65,338,135,253,65,338,61,339,135,253,61,339,58,301,43,323,44,318,44,329,44,329,44,318,46,314,44,329,46,314,46,333,46,333,46,314,49,309,46,333,49,309,50,336,50,336,49,309,53,305,50,336,53,305,55,338,55,338,53,305,58,301,55,338,58,301,61,339,133,228,116,230,120,210,120,210,116,230,103,212,87,210,103,212,116,230,87,210,116,230,81,224,190,62,176,48,181,26,181,26,176,48,162,37,181,26,162,37,160,9,160,9,162,37,146,31,160,9,146,31,136,-1,136,-1,146,31,127,30,203,138,201,153,198,166,203,138,198,166,195,177,203,138,195,177,190,186,203,138,190,186,185,195,203,138,185,195,175,207,203,138,175,207,163,217,203,138,163,217,151,155,203,138,151,155,50,155,203,138,50,155,49,138,141,192,147,176,149,224,149,224,147,176,151,155,149,224,151,155,163,217,198,49,212,79,204,82,198,49,204,82,190,62,198,49,190,62,181,26,114,31,101,34,108,-4,114,31,108,-4,136,-1,114,31,136,-1,127,30,90,39,80,47,108,-4,90,39,108,-4,101,34,133,228,120,210,133,203,133,228,133,203,141,192,133,228,141,192,149,224,50,155,55,175,52,207,52,207,55,175,63,191,52,207,63,191,81,224,81,224,63,191,74,203,81,224,74,203,87,210,52,207,31,182,49,138,52,207,49,138,50,155,
+58,253,78,253,155,302,161,306,165,310,168,314,170,318,170,323,169,329,167,333,163,336,158,338,152,339,148,338,145,337,141,335,137,332,132,328,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,190,253,127,337,97,337,35,253,51,253,112,305,173,253,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,186,286,185,294,181,301,176,306,169,310,161,311,153,310,147,306,141,301,138,294,137,286,
+203,138,201,153,198,166,203,138,198,166,195,177,203,138,195,177,190,186,203,138,190,186,185,195,203,138,185,195,175,207,203,138,175,207,163,217,203,138,163,217,151,155,203,138,151,155,50,155,203,138,50,155,49,138,141,192,147,176,149,224,149,224,147,176,151,155,149,224,151,155,163,217,152,339,155,302,158,338,158,338,155,302,161,306,158,338,161,306,163,336,163,336,161,306,165,310,163,336,165,310,167,333,167,333,165,310,168,314,167,333,168,314,169,329,169,329,168,314,170,318,169,329,170,318,170,323,155,302,152,339,148,338,155,302,148,338,145,337,155,302,145,337,141,335,155,302,141,335,137,332,155,302,137,332,132,328,155,302,132,328,78,253,52,100,50,118,49,15,49,15,50,118,49,138,49,15,49,138,31,182,49,15,31,182,29,39,29,39,31,182,17,148,29,39,17,148,17,70,17,70,17,148,12,108,133,228,116,230,120,210,120,210,116,230,103,212,87,210,103,212,116,230,87,210,116,230,81,224,190,62,176,48,181,26,181,26,176,48,162,37,181,26,162,37,160,9,160,9,162,37,146,31,160,9,146,31,136,-1,136,-1,146,31,127,30,198,49,212,79,204,82,198,49,204,82,190,62,198,49,190,62,181,26,114,31,101,34,108,-4,114,31,108,-4,136,-1,114,31,136,-1,127,30,101,34,90,39,108,-4,108,-4,90,39,80,47,108,-4,80,47,75,0,75,0,80,47,71,57,133,228,120,210,133,203,133,228,133,203,141,192,133,228,141,192,149,224,50,155,55,175,52,207,52,207,55,175,63,191,52,207,63,191,81,224,81,224,63,191,74,203,81,224,74,203,87,210,52,207,31,182,49,138,52,207,49,138,50,155,75,0,71,57,62,71,75,0,62,71,56,85,75,0,56,85,52,100,75,0,52,100,49,15,78,253,132,328,58,253,
+190,253,127,337,97,337,35,253,51,253,112,305,173,253,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,186,286,185,294,181,301,176,306,169,310,161,311,153,310,147,306,141,301,138,294,137,286,138,278,141,272,146,266,153,263,161,262,169,263,176,266,181,272,185,278,186,286,16383,16383,86,286,85,294,82,301,76,306,69,310,61,311,54,310,47,306,42,301,38,294,37,286,38,278,41,272,47,266,53,263,61,262,69,263,76,266,81,272,85,278,86,286,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,
+35,253,51,253,97,337,97,337,51,253,112,305,97,337,112,305,127,337,127,337,112,305,173,253,127,337,173,253,190,253,52,100,50,118,49,15,49,15,50,118,49,138,49,15,49,138,31,182,49,15,31,182,29,39,29,39,31,182,17,148,29,39,17,148,17,70,17,70,17,148,12,108,133,228,116,230,120,210,120,210,116,230,103,212,87,210,103,212,116,230,87,210,116,230,81,224,190,62,176,48,181,26,181,26,176,48,162,37,181,26,162,37,160,9,160,9,162,37,146,31,160,9,146,31,136,-1,136,-1,146,31,127,30,203,138,201,153,198,166,203,138,198,166,195,177,203,138,195,177,190,186,203,138,190,186,185,195,203,138,185,195,175,207,203,138,175,207,163,217,203,138,163,217,151,155,203,138,151,155,50,155,203,138,50,155,49,138,141,192,147,176,149,224,149,224,147,176,151,155,149,224,151,155,163,217,198,49,212,79,204,82,198,49,204,82,190,62,198,49,190,62,181,26,114,31,101,34,108,-4,114,31,108,-4,136,-1,114,31,136,-1,127,30,101,34,90,39,108,-4,108,-4,90,39,80,47,108,-4,80,47,75,0,75,0,80,47,71,57,133,228,120,210,133,203,133,228,133,203,141,192,133,228,141,192,149,224,50,155,55,175,52,207,52,207,55,175,63,191,52,207,63,191,81,224,81,224,63,191,74,203,81,224,74,203,87,210,52,207,31,182,49,138,52,207,49,138,50,155,75,0,71,57,62,71,75,0,62,71,56,85,75,0,56,85,52,100,75,0,52,100,49,15,
+186,286,185,294,181,301,176,306,169,310,161,311,153,310,147,306,141,301,138,294,137,286,138,278,141,272,146,266,153,263,161,262,169,263,176,266,181,272,185,278,186,286,16383,16383,86,286,85,294,82,301,76,306,69,310,61,311,54,310,47,306,42,301,38,294,37,286,38,278,41,272,47,266,53,263,61,262,69,263,76,266,81,272,85,278,86,286,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,115,253,42,328,38,332,33,335,29,337,21,339,15,338,10,336,6,333,4,329,3,323,3,318,5,314,8,309,18,301,95,253,16383,16383,122,0,122,7,105,9,94,14,88,21,85,34,84,52,84,228,82,230,5,203,5,195,15,197,26,197,33,196,37,193,40,187,42,178,42,33,38,20,32,13,20,9,3,7,3,0,25,253,45,253,122,302,127,306,131,310,134,314,136,318,137,323,136,329,134,333,130,336,125,338,119,339,111,337,107,335,103,332,98,328,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,87,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,8,0,147,253,84,337,54,337,-7,253,8,253,69,305,130,253,16383,16383,110,0,110,7,93,9,83,14,77,21,74,34,73,52,73,228,
+203,138,201,153,198,166,203,138,198,166,195,177,203,138,195,177,190,186,203,138,190,186,185,195,203,138,185,195,175,207,203,138,175,207,163,217,203,138,163,217,151,155,203,138,151,155,50,155,203,138,50,155,49,138,141,192,147,176,149,224,149,224,147,176,151,155,149,224,151,155,163,217,137,286,138,278,138,294,138,294,138,278,141,272,138,294,141,272,141,301,141,301,141,272,146,266,141,301,146,266,147,306,147,306,146,266,153,263,147,306,153,263,153,310,153,310,153,263,161,262,153,310,161,262,161,311,161,311,161,262,169,263,161,311,169,263,169,310,169,310,169,263,176,266,169,310,176,266,176,306,176,306,176,266,181,272,176,306,181,272,181,301,181,301,181,272,185,278,181,301,185,278,185,294,185,294,185,278,186,286,37,286,38,278,38,294,38,294,38,278,41,272,38,294,41,272,42,301,42,301,41,272,47,266,42,301,47,266,47,306,47,306,47,266,53,263,47,306,53,263,54,310,54,310,53,263,61,262,54,310,61,262,61,311,61,311,61,262,69,263,61,311,69,263,69,310,69,310,69,263,76,266,69,310,76,266,76,306,76,306,76,266,81,272,76,306,81,272,82,301,82,301,81,272,85,278,82,301,85,278,85,294,85,294,85,278,86,286,52,100,50,118,49,15,49,15,50,118,49,138,49,15,49,138,31,182,49,15,31,182,29,39,29,39,31,182,17,148,29,39,17,148,17,70,17,70,17,148,12,108,133,228,116,230,120,210,120,210,116,230,103,212,87,210,103,212,116,230,87,210,116,230,81,224,190,62,176,48,181,26,181,26,176,48,162,37,181,26,162,37,160,9,160,9,162,37,146,31,160,9,146,31,136,-1,136,-1,146,31,127,30,198,49,212,79,204,82,198,49,204,82,190,62,198,49,190,62,181,26,114,31,101,34,108,-4,114,31,108,-4,136,-1,114,31,136,-1,127,30,101,34,90,39,108,-4,108,-4,90,39,80,47,108,-4,80,47,75,0,75,0,80,47,71,57,133,228,120,210,133,203,133,228,133,203,141,192,133,228,141,192,149,224,50,155,55,175,52,207,52,207,55,175,63,191,52,207,63,191,81,224,81,224,63,191,74,203,81,224,74,203,87,210,52,207,31,182,49,138,52,207,49,138,50,155,75,0,71,57,62,71,75,0,62,71,56,85,75,0,56,85,52,100,75,0,52,100,49,15,
+115,253,42,328,38,332,33,335,29,337,21,339,15,338,10,336,6,333,4,329,3,323,3,318,5,314,8,309,18,301,95,253,16383,16383,122,0,122,7,105,9,94,14,88,21,85,34,84,52,84,228,82,230,5,203,5,195,15,197,26,197,33,196,37,193,40,187,42,178,42,33,38,20,32,13,20,9,3,7,3,0,25,253,45,253,122,302,127,306,131,310,134,314,136,318,137,323,136,329,134,333,130,336,125,338,119,339,111,337,107,335,103,332,98,328,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,87,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,
+95,253,115,253,42,328,95,253,42,328,38,332,95,253,38,332,33,335,95,253,33,335,29,337,95,253,29,337,25,338,95,253,25,338,21,339,95,253,21,339,18,301,3,323,3,318,4,329,4,329,3,318,5,314,4,329,5,314,6,333,6,333,5,314,8,309,6,333,8,309,10,336,10,336,8,309,13,305,10,336,13,305,15,338,15,338,13,305,18,301,15,338,18,301,21,339,38,20,32,13,122,0,122,0,32,13,20,9,122,0,20,9,3,7,15,197,19,197,82,230,82,230,19,197,23,197,82,230,23,197,26,197,26,197,33,196,82,230,82,230,33,196,37,193,82,230,37,193,40,187,38,20,122,0,42,33,42,33,122,0,94,14,42,33,94,14,42,52,42,52,94,14,88,21,42,52,88,21,42,166,42,178,42,166,82,230,42,178,82,230,40,187,10,196,15,197,82,230,10,196,82,230,5,203,10,196,5,203,5,195,84,52,84,228,82,230,84,52,82,230,42,166,84,52,42,166,85,34,105,9,94,14,122,0,105,9,122,0,122,7,122,0,3,7,3,0,42,166,88,21,85,34,
+25,253,45,253,122,302,127,306,131,310,134,314,136,318,137,323,136,329,134,333,130,336,125,338,119,339,111,337,107,335,103,332,98,328,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,87,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,8,0,147,253,84,337,54,337,-7,253,8,253,69,305,130,253,16383,16383,110,0,110,7,93,9,83,14,77,21,74,34,73,52,73,228,70,230,-6,203,-6,195,0,196,3,197,15,197,21,196,26,193,29,187,31,178,31,52,30,33,27,20,21,13,9,9,-7,7,-7,0,144,286,143,294,139,301,133,306,127,310,119,311,111,310,104,306,
+119,339,122,302,125,338,125,338,122,302,127,306,125,338,127,306,130,336,130,336,127,306,131,310,130,336,131,310,134,333,134,333,131,310,134,314,134,333,134,314,136,329,136,329,134,314,136,318,136,329,136,318,137,323,122,302,119,339,115,338,122,302,115,338,111,337,122,302,111,337,107,335,122,302,107,335,103,332,122,302,103,332,98,328,122,302,98,328,45,253,43,20,37,13,127,0,127,0,37,13,25,9,127,0,25,9,8,7,20,197,24,197,87,230,87,230,24,197,28,197,87,230,28,197,31,197,31,197,38,196,87,230,87,230,38,196,42,193,87,230,42,193,45,187,43,20,127,0,47,33,47,33,127,0,99,14,47,33,99,14,47,52,47,52,99,14,93,21,47,52,93,21,47,166,47,178,47,166,87,230,47,178,87,230,45,187,15,196,20,197,87,230,15,196,87,230,10,203,15,196,10,203,10,195,89,52,89,228,87,230,89,52,87,230,47,166,89,52,47,166,90,34,110,9,99,14,127,0,110,9,127,0,127,7,127,0,8,7,8,0,47,166,93,21,90,34,45,253,98,328,25,253,
+147,253,84,337,54,337,-7,253,8,253,69,305,130,253,16383,16383,110,0,110,7,93,9,83,14,77,21,74,34,73,52,73,228,70,230,-6,203,-6,195,0,196,3,197,15,197,21,196,26,193,29,187,31,178,31,52,30,33,27,20,21,13,9,9,-7,7,-7,0,144,286,143,294,139,301,133,306,127,310,119,311,111,310,104,306,99,301,96,294,94,286,96,278,99,272,104,266,111,263,118,262,126,263,133,266,139,272,143,278,144,286,16383,16383,45,286,43,294,40,301,34,306,27,310,20,311,12,310,5,306,0,301,-3,294,-4,286,
+-7,253,8,253,54,337,54,337,8,253,69,305,54,337,69,305,84,337,84,337,69,305,130,253,84,337,130,253,147,253,27,20,21,13,110,0,110,0,21,13,9,9,110,0,9,9,-7,7,3,197,8,197,70,230,70,230,8,197,11,197,70,230,11,197,15,197,15,197,21,196,70,230,70,230,21,196,26,193,70,230,26,193,29,187,31,166,31,52,77,21,31,166,77,21,74,34,31,166,74,34,73,52,31,166,73,52,70,230,31,166,70,230,31,178,0,196,3,197,70,230,0,196,70,230,-6,203,0,196,-6,203,-6,195,73,52,73,228,70,230,110,0,110,7,93,9,110,0,93,9,83,14,110,0,83,14,30,33,110,0,30,33,27,20,31,52,30,33,83,14,31,52,83,14,77,21,110,0,-7,7,-7,0,70,230,29,187,31,178,
+144,286,143,294,139,301,133,306,127,310,119,311,111,310,104,306,99,301,96,294,94,286,96,278,99,272,104,266,111,263,118,262,126,263,133,266,139,272,143,278,144,286,16383,16383,45,286,43,294,40,301,34,306,27,310,20,311,12,310,5,306,0,301,-3,294,-4,286,-3,278,0,272,5,266,11,263,19,262,27,263,34,266,40,272,43,278,45,286,16383,16383,113,0,113,7,97,9,86,14,80,21,77,34,76,52,76,228,74,230,-2,203,-2,195,2,196,7,197,18,197,25,196,29,193,32,187,34,178,35,166,35,52,34,33,31,20,24,13,12,9,-4,7,-4,0,212,328,195,343,148,318,135,326,122,332,107,337,90,340,71,342,50,329,66,326,80,323,93,318,105,311,118,302,57,270,74,255,135,287,151,272,163,256,172,239,179,220,184,200,170,212,159,221,148,226,136,229,123,230,89,224,59,208,35,182,20,148,15,108,20,70,35,38,58,15,88,0,123,-4,145,-2,165,3,182,13,196,26,209,44,218,60,225,79,231,99,234,120,235,142,233,179,225,215,211,248,192,278,166,304,16383,16383,190,101,187,69,179,44,167,25,151,13,132,9,104,18,83,41,70,73,62,108,60,141,62,165,70,185,83,201,99,212,118,216,142,211,
+31,20,113,0,34,33,34,33,113,0,86,14,34,33,86,14,35,52,35,52,86,14,80,21,35,52,80,21,35,166,35,166,80,21,77,34,35,166,77,34,76,52,74,230,-2,203,2,196,74,230,2,196,7,197,74,230,7,197,11,197,74,230,11,197,15,197,74,230,15,197,18,197,74,230,18,197,25,196,74,230,25,196,29,193,74,230,29,193,32,187,74,230,32,187,34,178,74,230,34,178,35,166,74,230,35,166,76,52,74,230,76,52,76,228,94,286,96,278,96,294,96,294,96,278,99,272,96,294,99,272,99,301,99,301,99,272,104,266,99,301,104,266,104,306,104,306,104,266,111,263,104,306,111,263,111,310,111,310,111,263,118,262,111,310,118,262,119,311,119,311,118,262,126,263,119,311,126,263,127,310,127,310,126,263,133,266,127,310,133,266,133,306,133,306,133,266,139,272,133,306,139,272,139,301,139,301,139,272,143,278,139,301,143,278,143,294,143,294,143,278,144,286,97,9,86,14,113,0,97,9,113,0,113,7,113,0,31,20,24,13,113,0,24,13,12,9,113,0,12,9,-4,7,113,0,-4,7,-4,0,-4,286,-3,278,-3,294,-3,294,-3,278,0,272,-3,294,0,272,0,301,0,301,0,272,5,266,0,301,5,266,5,306,5,306,5,266,11,263,5,306,11,263,12,310,12,310,11,263,19,262,12,310,19,262,20,311,20,311,19,262,27,263,20,311,27,263,27,310,27,310,27,263,34,266,27,310,34,266,34,306,34,306,34,266,40,272,34,306,40,272,40,301,40,301,40,272,43,278,40,301,43,278,43,294,43,294,43,278,45,286,2,196,-2,203,-2,195,
+212,328,195,343,148,318,135,326,122,332,107,337,90,340,71,342,50,329,66,326,80,323,93,318,105,311,118,302,57,270,74,255,135,287,151,272,163,256,172,239,179,220,184,200,170,212,159,221,148,226,136,229,123,230,89,224,59,208,35,182,20,148,15,108,20,70,35,38,58,15,88,0,123,-4,145,-2,165,3,182,13,196,26,209,44,218,60,225,79,231,99,234,120,235,142,233,179,225,215,211,248,192,278,166,304,16383,16383,190,101,187,69,179,44,167,25,151,13,132,9,104,18,83,41,70,73,62,108,60,141,62,165,70,185,83,201,99,212,118,216,142,211,162,195,177,171,187,139,190,101,196,319,191,309,186,302,181,297,176,295,170,294,165,294,160,295,154,297,149,299,143,301,131,307,124,311,110,315,103,316,96,316,82,314,70,308,59,298,51,284,46,266,60,266,64,274,68,281,73,285,79,288,85,289,89,289,97,287,102,285,106,283,118,278,128,273,137,269,144,267,151,266,158,266,173,268,185,274,195,284,203,299,210,319,16383,16383,243,0,243,7,230,9,221,13,216,19,213,29,212,42,212,153,210,180,202,201,190,217,174,227,153,230,139,229,125,224,111,216,96,205,81,190,80,190,80,228,76,230,50,220,37,216,23,212,8,208,8,199,10,200,13,200,16,201,22,201,30,200,
+136,229,123,230,142,211,142,211,123,230,118,216,99,212,118,216,123,230,99,212,123,230,89,224,122,332,118,302,135,287,122,332,135,287,135,326,135,326,135,287,151,272,135,326,151,272,148,318,148,318,151,272,166,304,148,318,166,304,195,343,195,343,166,304,212,328,107,337,90,340,93,318,107,337,93,318,105,311,107,337,105,311,118,302,107,337,118,302,122,332,50,329,66,326,71,342,71,342,66,326,80,323,71,342,80,323,90,340,90,340,80,323,93,318,187,69,179,44,182,13,182,13,179,44,167,25,182,13,167,25,165,3,165,3,167,25,151,13,165,3,151,13,145,-2,145,-2,151,13,132,9,145,-2,132,9,123,-4,123,-4,132,9,104,18,123,-4,104,18,88,0,88,0,104,18,83,41,88,0,83,41,70,73,88,0,70,73,58,15,58,15,70,73,62,108,58,15,62,108,60,141,60,141,62,165,59,208,59,208,62,165,70,185,59,208,70,185,89,224,89,224,70,185,83,201,89,224,83,201,99,212,15,108,20,70,20,148,20,148,20,70,35,38,20,148,35,38,35,182,35,182,35,38,58,15,35,182,58,15,59,208,59,208,58,15,60,141,151,272,163,256,166,304,166,304,163,256,172,239,166,304,172,239,192,278,192,278,172,239,179,220,192,278,179,220,184,200,118,302,57,270,74,255,118,302,74,255,135,287,184,200,187,139,192,278,192,278,187,139,190,101,196,26,190,101,187,69,233,179,225,215,225,79,233,179,225,79,231,99,233,179,231,99,234,120,233,179,234,120,235,142,196,26,209,44,211,248,211,248,209,44,218,60,211,248,218,60,225,215,225,215,218,60,225,79,192,278,190,101,196,26,192,278,196,26,211,248,187,139,184,200,177,171,177,171,184,200,170,212,177,171,170,212,162,195,162,195,170,212,159,221,162,195,159,221,148,226,148,226,136,229,142,211,148,226,142,211,162,195,187,69,182,13,196,26,
+196,319,191,309,186,302,181,297,176,295,170,294,165,294,160,295,154,297,149,299,143,301,131,307,124,311,110,315,103,316,96,316,82,314,70,308,59,298,51,284,46,266,60,266,64,274,68,281,73,285,79,288,85,289,89,289,97,287,102,285,106,283,118,278,128,273,137,269,144,267,151,266,158,266,173,268,185,274,195,284,203,299,210,319,16383,16383,243,0,243,7,230,9,221,13,216,19,213,29,212,42,212,153,210,180,202,201,190,217,174,227,153,230,139,229,125,224,111,216,96,205,81,190,80,190,80,228,76,230,50,220,37,216,23,212,8,208,8,199,10,200,13,200,16,201,22,201,30,200,35,197,38,191,40,181,40,47,39,32,37,21,31,14,22,9,9,7,9,0,114,0,114,7,101,9,92,13,86,18,83,26,82,36,82,174,95,186,105,194,115,199,124,202,133,203,147,201,157,195,164,185,169,171,170,152,170,52,169,35,166,23,161,15,152,10,139,7,138,0,166,253,94,328,89,332,84,335,80,337,72,339,66,338,61,336,57,333,55,329,54,323,55,318,57,314,60,309,64,305,69,301,146,253,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,77,253,97,253,174,302,180,306,184,310,187,314,189,318,189,323,188,329,186,333,182,336,177,338,171,339,163,337,160,335,156,332,151,328,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,
+37,21,31,14,114,0,114,0,31,14,22,9,114,0,22,9,9,7,13,200,16,201,23,212,23,212,16,201,19,201,23,212,19,201,22,201,22,201,30,200,23,212,23,212,30,200,37,216,23,212,8,208,10,200,23,212,10,200,13,200,30,200,35,197,37,216,37,216,35,197,38,191,37,216,38,191,50,220,50,220,38,191,40,181,50,220,40,181,40,169,83,26,40,169,40,47,83,26,40,47,86,18,86,18,40,47,92,13,80,228,76,230,80,190,80,190,76,230,82,36,80,190,82,36,81,190,81,190,82,36,82,174,81,190,82,174,96,205,96,205,82,174,95,186,96,205,95,186,105,194,64,274,68,281,70,308,70,308,68,281,73,285,70,308,73,285,82,314,82,314,73,285,79,288,82,314,79,288,85,289,85,289,89,289,96,316,96,316,89,289,93,288,96,316,93,288,97,287,60,266,64,274,70,308,60,266,70,308,59,298,60,266,59,298,51,284,60,266,51,284,46,266,96,316,97,287,103,316,103,316,97,287,102,285,103,316,102,285,106,283,106,283,118,278,110,315,110,315,118,278,117,313,96,316,82,314,85,289,110,315,103,316,106,283,117,313,118,278,124,311,124,311,118,278,128,273,124,311,128,273,131,307,131,307,128,273,137,269,131,307,137,269,143,301,143,301,137,269,144,267,143,301,144,267,149,299,149,299,144,267,151,266,149,299,151,266,154,297,154,297,151,266,158,266,154,297,158,266,160,295,160,295,158,266,173,268,160,295,173,268,165,294,165,294,173,268,170,294,176,295,170,294,173,268,176,295,173,268,185,274,96,205,105,194,111,216,111,216,105,194,115,199,111,216,115,199,125,224,125,224,115,199,124,202,125,224,124,202,133,203,133,203,147,201,139,229,139,229,147,201,153,230,82,36,76,230,63,225,82,36,63,225,83,26,139,229,125,224,133,203,166,23,161,15,243,0,243,0,161,15,152,10,243,0,152,10,139,7,157,195,164,185,174,227,174,227,164,185,169,171,174,227,169,171,170,152,216,19,170,152,170,52,216,19,170,52,221,13,221,13,170,52,169,35,221,13,169,35,243,0,243,0,169,35,166,23,153,230,147,201,157,195,153,230,157,195,174,227,212,42,212,153,210,180,212,42,210,180,202,201,212,42,202,201,213,29,230,9,221,13,243,0,230,9,243,0,243,7,213,29,202,201,190,217,213,29,190,217,174,227,213,29,174,227,170,152,213,29,170,152,216,19,196,319,191,309,195,284,196,319,195,284,203,299,196,319,203,299,210,319,186,302,181,297,185,274,186,302,185,274,195,284,186,302,195,284,191,309,114,0,114,7,101,9,114,0,101,9,92,13,114,0,92,13,39,32,114,0,39,32,37,21,50,220,40,169,83,26,50,220,83,26,63,225,10,200,8,208,8,199,114,0,9,7,9,0,39,32,92,13,40,47,176,295,185,274,181,297,243,0,139,7,138,0,
+166,253,94,328,89,332,84,335,80,337,72,339,66,338,61,336,57,333,55,329,54,323,55,318,57,314,60,309,64,305,69,301,146,253,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,77,253,97,253,174,302,180,306,184,310,187,314,189,318,189,323,188,329,186,333,182,336,177,338,171,339,163,337,160,335,156,332,151,328,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,
+146,253,166,253,94,328,146,253,94,328,89,332,146,253,89,332,84,335,146,253,84,335,80,337,146,253,80,337,76,338,146,253,76,338,72,339,146,253,72,339,69,301,54,323,55,318,55,329,55,329,55,318,57,314,55,329,57,314,57,333,57,333,57,314,60,309,57,333,60,309,61,336,61,336,60,309,64,305,61,336,64,305,66,338,66,338,64,305,69,301,66,338,69,301,72,339,64,91,58,17,69,70,69,70,58,17,88,1,69,70,88,1,76,51,76,51,88,1,86,34,93,25,86,34,88,1,93,25,88,1,123,-4,162,225,127,230,130,215,130,215,127,230,118,216,98,212,118,216,127,230,98,212,127,230,90,225,187,70,180,44,191,17,191,17,180,44,168,25,191,17,168,25,160,1,160,1,168,25,151,13,160,1,151,13,131,9,131,9,120,10,123,-4,123,-4,120,10,110,13,123,-4,110,13,101,18,140,211,149,206,162,225,162,225,149,206,158,199,162,225,158,199,165,191,165,191,174,177,191,210,191,210,174,177,181,161,191,210,181,161,186,142,230,154,215,186,215,43,230,154,215,43,230,76,230,154,230,76,235,116,187,70,191,17,190,102,190,102,191,17,191,210,191,210,191,17,215,43,191,210,215,43,215,186,191,210,186,142,189,122,191,210,189,122,190,102,191,210,162,225,165,191,131,9,123,-4,160,1,58,17,61,113,60,137,60,137,62,164,58,209,58,209,62,164,70,186,58,209,70,186,90,225,90,225,70,186,82,202,90,225,82,202,98,212,58,17,60,137,58,209,58,17,58,209,35,42,35,42,58,209,35,185,35,42,35,185,20,75,20,75,35,185,20,153,20,75,20,153,15,114,61,113,58,17,64,91,162,225,130,215,140,211,93,25,123,-4,101,18,
+77,253,97,253,174,302,180,306,184,310,187,314,189,318,189,323,188,329,186,333,182,336,177,338,171,339,163,337,160,335,156,332,151,328,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,200,253,138,337,107,337,45,253,62,253,123,305,184,253,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,190,319,185,309,181,302,176,297,170,295,164,294,159,294,154,295,149,297,137,301,
+171,339,174,302,177,338,177,338,174,302,180,306,177,338,180,306,182,336,182,336,180,306,184,310,182,336,184,310,186,333,186,333,184,310,187,314,186,333,187,314,188,329,188,329,187,314,189,318,188,329,189,318,189,323,174,302,171,339,167,338,174,302,167,338,163,337,174,302,163,337,160,335,174,302,160,335,156,332,174,302,156,332,151,328,174,302,151,328,97,253,64,91,58,17,69,70,69,70,58,17,88,1,69,70,88,1,76,51,76,51,88,1,86,34,93,25,86,34,88,1,93,25,88,1,123,-4,162,225,127,230,130,215,130,215,127,230,118,216,98,212,118,216,127,230,98,212,127,230,90,225,187,70,180,44,191,17,191,17,180,44,168,25,191,17,168,25,160,1,160,1,168,25,151,13,160,1,151,13,131,9,131,9,120,10,123,-4,123,-4,120,10,110,13,123,-4,110,13,101,18,140,211,149,206,162,225,162,225,149,206,158,199,162,225,158,199,165,191,165,191,174,177,191,210,191,210,174,177,181,161,191,210,181,161,186,142,230,154,215,186,215,43,230,154,215,43,230,76,230,154,230,76,235,116,187,70,191,17,190,102,190,102,191,17,191,210,191,210,191,17,215,43,191,210,215,43,215,186,191,210,186,142,189,122,191,210,189,122,190,102,191,210,162,225,165,191,131,9,123,-4,160,1,58,17,61,113,60,137,60,137,62,164,58,209,58,209,62,164,70,186,58,209,70,186,90,225,90,225,70,186,82,202,90,225,82,202,98,212,58,17,60,137,58,209,58,17,58,209,35,42,35,42,58,209,35,185,35,42,35,185,20,75,20,75,35,185,20,153,20,75,20,153,15,114,61,113,58,17,64,91,162,225,130,215,140,211,93,25,123,-4,101,18,97,253,151,328,77,253,
+200,253,138,337,107,337,45,253,62,253,123,305,184,253,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,190,319,185,309,181,302,176,297,170,295,164,294,159,294,154,295,149,297,137,301,126,307,118,311,104,315,97,316,90,316,76,314,64,308,54,298,46,284,40,266,55,266,58,274,63,281,68,285,73,288,80,289,84,289,92,287,100,283,112,278,123,273,131,269,139,267,145,266,152,266,168,268,180,274,190,284,198,299,205,319,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,
+45,253,62,253,107,337,107,337,62,253,123,305,107,337,123,305,138,337,138,337,123,305,184,253,138,337,184,253,200,253,64,91,58,17,69,70,69,70,58,17,88,1,69,70,88,1,76,51,76,51,88,1,86,34,93,25,86,34,88,1,93,25,88,1,123,-4,162,225,127,230,130,215,130,215,127,230,118,216,98,212,118,216,127,230,98,212,127,230,90,225,187,70,180,44,191,17,191,17,180,44,168,25,191,17,168,25,160,1,160,1,168,25,151,13,160,1,151,13,131,9,131,9,120,10,123,-4,123,-4,120,10,110,13,123,-4,110,13,101,18,140,211,149,206,162,225,162,225,149,206,158,199,162,225,158,199,165,191,165,191,174,177,191,210,191,210,174,177,181,161,191,210,181,161,186,142,230,154,215,186,215,43,230,154,215,43,230,76,230,154,230,76,235,116,187,70,191,17,190,102,190,102,191,17,191,210,191,210,191,17,215,43,191,210,215,43,215,186,191,210,186,142,189,122,191,210,189,122,190,102,191,210,162,225,165,191,131,9,123,-4,160,1,58,17,61,113,60,137,60,137,62,164,58,209,58,209,62,164,70,186,58,209,70,186,90,225,90,225,70,186,82,202,90,225,82,202,98,212,58,17,60,137,58,209,58,17,58,209,35,42,35,42,58,209,35,185,35,42,35,185,20,75,20,75,35,185,20,153,20,75,20,153,15,114,61,113,58,17,64,91,162,225,130,215,140,211,93,25,123,-4,101,18,
+190,319,185,309,181,302,176,297,170,295,164,294,159,294,154,295,149,297,137,301,126,307,118,311,104,315,97,316,90,316,76,314,64,308,54,298,46,284,40,266,55,266,58,274,63,281,68,285,73,288,80,289,84,289,92,287,100,283,112,278,123,273,131,269,139,267,145,266,152,266,168,268,180,274,190,284,198,299,205,319,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,197,286,196,294,192,301,186,306,180,310,172,311,164,310,157,306,152,301,149,294,147,286,149,278,152,272,157,266,164,263,171,262,179,263,186,266,192,272,196,278,197,286,16383,16383,98,286,96,294,93,301,87,306,80,310,73,311,65,310,58,306,53,301,49,294,48,286,49,278,53,272,58,266,64,263,72,262,80,263,87,266,93,272,96,278,98,286,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,
+58,274,63,281,64,308,64,308,63,281,68,285,64,308,68,285,76,314,76,314,68,285,73,288,76,314,73,288,80,289,80,289,84,289,90,316,90,316,84,289,88,288,90,316,88,288,92,287,55,266,58,274,64,308,55,266,64,308,54,298,55,266,54,298,46,284,55,266,46,284,40,266,90,316,92,287,97,316,97,316,92,287,96,285,97,316,96,285,100,283,100,283,112,278,104,315,104,315,112,278,111,313,90,316,76,314,80,289,104,315,97,316,100,283,111,313,112,278,118,311,118,311,112,278,123,273,118,311,123,273,126,307,126,307,123,273,131,269,126,307,131,269,137,301,137,301,131,269,139,267,137,301,139,267,143,299,143,299,139,267,145,266,143,299,145,266,149,297,149,297,145,266,152,266,149,297,152,266,154,295,154,295,152,266,168,268,154,295,168,268,159,294,159,294,168,268,164,294,170,295,164,294,168,268,170,295,168,268,180,274,190,319,185,309,190,284,190,319,190,284,198,299,190,319,198,299,205,319,181,302,176,297,180,274,181,302,180,274,190,284,181,302,190,284,185,309,64,91,58,17,69,70,69,70,58,17,88,1,69,70,88,1,76,51,76,51,88,1,86,34,93,25,86,34,88,1,93,25,88,1,123,-4,162,225,127,230,130,215,130,215,127,230,118,216,98,212,118,216,127,230,98,212,127,230,90,225,187,70,180,44,191,17,191,17,180,44,168,25,191,17,168,25,160,1,160,1,168,25,151,13,160,1,151,13,131,9,131,9,120,10,123,-4,123,-4,120,10,110,13,123,-4,110,13,101,18,140,211,149,206,162,225,162,225,149,206,158,199,162,225,158,199,165,191,165,191,174,177,191,210,191,210,174,177,181,161,191,210,181,161,186,142,230,154,215,186,215,43,230,154,215,43,230,76,230,154,230,76,235,116,187,70,191,17,190,102,190,102,191,17,191,210,191,210,191,17,215,43,191,210,215,43,215,186,191,210,186,142,189,122,191,210,189,122,190,102,191,210,162,225,165,191,131,9,123,-4,160,1,58,17,61,113,60,137,60,137,62,164,58,209,58,209,62,164,70,186,58,209,70,186,90,225,90,225,70,186,82,202,90,225,82,202,98,212,58,17,60,137,58,209,58,17,58,209,35,42,35,42,58,209,35,185,35,42,35,185,20,75,20,75,35,185,20,153,20,75,20,153,15,114,61,113,58,17,64,91,162,225,130,215,140,211,93,25,123,-4,101,18,170,295,180,274,176,297,
+197,286,196,294,192,301,186,306,180,310,172,311,164,310,157,306,152,301,149,294,147,286,149,278,152,272,157,266,164,263,171,262,179,263,186,266,192,272,196,278,197,286,16383,16383,98,286,96,294,93,301,87,306,80,310,73,311,65,310,58,306,53,301,49,294,48,286,49,278,53,272,58,266,64,263,72,262,80,263,87,266,93,272,96,278,98,286,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,169,229,168,238,164,246,158,252,150,256,142,258,133,256,125,252,119,246,115,239,113,230,115,221,119,214,125,208,132,204,141,203,150,204,158,208,164,214,168,221,169,229,16383,16383,267,110,267,143,15,143,15,110,16383,16383,169,22,168,31,164,38,158,45,150,49,142,50,133,49,125,45,119,39,115,31,113,22,115,14,119,6,125,0,132,-3,141,-4,150,-3,158,0,164,6,168,13,169,22,219,276,199,276,171,221,161,224,152,227,143,229,134,230,124,230,88,224,58,208,35,184,20,152,15,113,15,100,17,87,20,74,30,50,35,42,40,36,46,29,53,22,63,14,26,-55,45,-55,77,6,87,1,105,-3,114,-4,123,-4,159,1,190,18,214,44,229,78,235,117,233,141,227,162,218,181,204,198,186,213,16383,16383,79,46,72,63,66,81,63,99,60,118,60,138,62,164,70,186,82,202,
+48,286,49,278,49,294,49,294,49,278,53,272,49,294,53,272,53,301,53,301,53,272,58,266,53,301,58,266,58,306,58,306,58,266,64,263,58,306,64,263,65,310,65,310,64,263,72,262,65,310,72,262,73,311,73,311,72,262,80,263,73,311,80,263,80,310,80,310,80,263,87,266,80,310,87,266,87,306,87,306,87,266,93,272,87,306,93,272,93,301,93,301,93,272,96,278,93,301,96,278,96,294,96,294,96,278,98,286,64,91,58,17,69,70,69,70,58,17,88,1,69,70,88,1,76,51,76,51,88,1,86,34,93,25,86,34,88,1,93,25,88,1,123,-4,162,225,127,230,130,215,130,215,127,230,118,216,98,212,118,216,127,230,98,212,127,230,90,225,147,286,149,278,149,294,149,294,149,278,152,272,149,294,152,272,152,301,152,301,152,272,157,266,152,301,157,266,157,306,157,306,157,266,164,263,157,306,164,263,164,310,164,310,164,263,171,262,164,310,171,262,172,311,172,311,171,262,179,263,172,311,179,263,180,310,180,310,179,263,186,266,180,310,186,266,186,306,186,306,186,266,192,272,186,306,192,272,192,301,192,301,192,272,196,278,192,301,196,278,196,294,196,294,196,278,197,286,187,70,180,44,191,17,191,17,180,44,168,25,191,17,168,25,160,1,160,1,168,25,151,13,160,1,151,13,131,9,131,9,120,10,123,-4,123,-4,120,10,110,13,123,-4,110,13,101,18,140,211,149,206,162,225,162,225,149,206,158,199,162,225,158,199,165,191,165,191,174,177,191,210,191,210,174,177,181,161,191,210,181,161,186,142,230,154,215,186,215,43,230,154,215,43,230,76,230,154,230,76,235,116,187,70,191,17,190,102,190,102,191,17,191,210,191,210,191,17,215,43,191,210,215,43,215,186,191,210,186,142,189,122,191,210,189,122,190,102,191,210,162,225,165,191,131,9,123,-4,160,1,58,17,61,113,60,137,60,137,62,164,58,209,58,209,62,164,70,186,58,209,70,186,90,225,90,225,70,186,82,202,90,225,82,202,98,212,58,17,60,137,58,209,58,17,58,209,35,42,35,42,58,209,35,185,35,42,35,185,20,75,20,75,35,185,20,153,20,75,20,153,15,114,61,113,58,17,64,91,162,225,130,215,140,211,93,25,123,-4,101,18,
+169,229,168,238,164,246,158,252,150,256,142,258,133,256,125,252,119,246,115,239,113,230,115,221,119,214,125,208,132,204,141,203,150,204,158,208,164,214,168,221,169,229,16383,16383,267,110,267,143,15,143,15,110,16383,16383,169,22,168,31,164,38,158,45,150,49,142,50,133,49,125,45,119,39,115,31,113,22,115,14,119,6,125,0,132,-3,141,-4,150,-3,158,0,164,6,168,13,169,22,219,276,199,276,171,221,161,224,152,227,143,229,134,230,124,230,88,224,58,208,35,184,20,152,15,113,15,100,17,87,20,74,30,50,35,42,40,36,46,29,53,22,63,14,26,-55,45,-55,77,6,87,1,105,-3,114,-4,123,-4,159,1,190,18,214,44,229,78,235,117,233,141,227,162,218,181,204,198,186,213,16383,16383,79,46,72,63,66,81,63,99,60,118,60,138,62,164,70,186,
+113,230,115,221,115,239,115,239,115,221,119,214,115,239,119,214,119,246,119,246,119,214,125,208,119,246,125,208,125,252,125,252,125,208,132,204,125,252,132,204,133,256,133,256,132,204,141,203,133,256,141,203,142,258,142,258,141,203,150,204,142,258,150,204,150,256,150,256,150,204,158,208,150,256,158,208,158,252,158,252,158,208,164,214,158,252,164,214,164,246,164,246,164,214,168,221,164,246,168,221,168,238,168,238,168,221,169,229,15,143,15,110,267,110,15,143,267,110,267,143,113,22,115,14,115,31,115,31,115,14,119,6,115,31,119,6,119,39,119,39,119,6,125,0,119,39,125,0,125,45,125,45,125,0,132,-3,125,45,132,-3,133,49,133,49,132,-3,141,-4,133,49,141,-4,142,50,142,50,141,-4,150,-3,142,50,150,-3,150,49,150,49,150,-3,158,0,150,49,158,0,158,45,158,45,158,0,164,6,158,45,164,6,164,38,164,38,164,6,168,13,164,38,168,13,168,31,168,31,168,13,169,22,
+219,276,199,276,171,221,161,224,152,227,143,229,134,230,124,230,88,224,58,208,35,184,20,152,15,113,15,100,17,87,20,74,30,50,35,42,40,36,46,29,53,22,63,14,26,-55,45,-55,77,6,87,1,105,-3,114,-4,123,-4,159,1,190,18,214,44,229,78,235,117,233,141,227,162,218,181,204,198,186,213,16383,16383,79,46,72,63,66,81,63,99,60,118,60,138,62,164,70,186,82,202,99,212,118,216,127,215,135,213,143,210,151,205,158,198,16383,16383,170,183,178,167,183,152,187,136,189,120,190,102,187,69,180,44,168,25,151,13,131,9,121,10,112,12,104,16,97,22,89,30,170,253,97,328,92,332,88,335,84,337,80,338,75,339,69,338,64,336,61,333,58,329,57,323,58,318,60,314,63,309,67,305,73,301,150,253,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,
+63,14,63,14,45,-55,63,14,45,-55,77,6,63,14,77,6,63,99,63,14,63,99,60,118,63,14,60,118,60,138,63,14,60,138,58,208,63,14,58,208,53,22,58,208,35,184,35,42,58,208,35,42,40,36,58,208,40,36,46,29,58,208,46,29,53,22,35,184,20,152,20,74,35,184,20,74,25,62,35,184,25,62,30,50,35,184,30,50,35,42,20,152,15,113,15,100,20,152,15,100,17,87,20,152,17,87,20,74,124,230,118,216,127,215,124,230,127,215,134,230,134,230,127,215,135,213,134,230,135,213,143,229,143,229,135,213,143,210,143,229,143,210,152,227,152,227,143,210,151,205,152,227,151,205,158,198,187,69,180,44,190,18,190,18,180,44,168,25,190,18,168,25,159,1,159,1,168,25,151,13,159,1,151,13,131,9,131,9,121,10,123,-4,123,-4,121,10,114,-4,112,12,104,16,105,-3,112,12,105,-3,114,-4,112,12,114,-4,121,10,87,1,96,-1,89,30,89,30,96,-1,97,22,97,22,96,-1,105,-3,97,22,105,-3,104,16,161,224,158,198,170,183,161,224,170,183,171,221,171,221,170,183,178,167,171,221,178,167,186,213,186,213,178,167,183,152,186,213,183,152,187,136,199,276,171,221,186,213,199,276,186,213,219,276,158,198,79,46,89,30,158,198,89,30,170,183,79,46,72,63,77,6,79,46,77,6,87,1,79,46,87,1,89,30,66,81,63,99,77,6,66,81,77,6,72,63,229,78,235,117,233,141,229,78,233,141,227,162,229,78,227,162,218,181,229,78,218,181,214,44,187,69,190,18,190,102,190,102,190,18,204,198,204,198,190,18,214,44,204,198,214,44,218,181,186,213,187,136,204,198,204,198,187,136,189,120,204,198,189,120,190,102,131,9,123,-4,159,1,70,186,82,202,88,224,88,224,82,202,99,212,88,224,99,212,124,230,124,230,99,212,118,216,60,138,62,164,58,208,58,208,62,164,70,186,58,208,70,186,88,224,45,-55,63,14,26,-55,152,227,158,198,161,224,
+170,253,97,328,92,332,88,335,84,337,80,338,75,339,69,338,64,336,61,333,58,329,57,323,58,318,60,314,63,309,67,305,73,301,150,253,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,78,253,98,253,175,302,181,306,185,310,188,314,189,318,190,323,189,329,187,333,183,336,179,338,172,339,168,338,165,337,161,335,156,332,151,328,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,
+150,253,170,253,97,328,150,253,97,328,92,332,150,253,92,332,88,335,150,253,88,335,84,337,150,253,84,337,80,338,150,253,80,338,75,339,150,253,75,339,73,301,57,323,58,318,58,329,58,329,58,318,60,314,58,329,60,314,61,333,61,333,60,314,63,309,61,333,63,309,64,336,64,336,63,309,67,305,64,336,67,305,69,338,69,338,67,305,73,301,69,338,73,301,75,339,78,225,4,225,17,216,78,225,17,216,26,213,78,225,26,213,32,207,78,225,32,207,35,197,78,225,35,197,36,185,78,225,36,185,38,38,78,225,38,38,46,20,78,225,46,20,58,6,78,225,58,6,75,-1,78,225,75,-1,78,64,164,53,162,48,168,38,168,38,162,48,159,43,168,38,159,43,155,40,155,40,147,34,153,21,153,21,147,34,139,29,153,21,139,29,138,8,138,8,139,29,130,26,138,8,130,26,123,0,123,0,130,26,121,25,123,0,121,25,113,24,113,24,102,26,109,-3,109,-3,102,26,97,-4,97,-4,102,26,92,31,97,-4,92,31,84,40,97,-4,84,40,79,51,97,-4,79,51,75,-1,78,64,75,-1,79,51,113,24,109,-3,123,0,166,184,168,38,209,225,209,225,168,38,169,38,209,225,169,38,171,-3,171,-3,169,38,169,-2,168,38,166,184,166,69,168,38,166,69,166,59,168,38,166,59,164,53,155,40,153,21,168,38,225,26,217,29,225,14,225,14,217,29,212,34,225,14,212,34,212,10,212,10,212,34,209,42,212,10,209,42,199,6,199,6,209,42,209,54,199,6,209,54,209,225,209,225,171,-3,186,1,209,225,186,1,199,6,209,225,129,225,145,215,209,225,145,215,155,212,209,225,155,212,162,206,209,225,162,206,165,197,209,225,165,197,166,184,237,25,225,26,225,14,237,25,225,14,240,18,237,25,240,18,240,25,38,38,36,185,36,59,145,215,129,225,129,217,17,216,4,225,4,218,
+78,253,98,253,175,302,181,306,185,310,188,314,189,318,190,323,189,329,187,333,183,336,179,338,172,339,168,338,165,337,161,335,156,332,151,328,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,200,253,138,337,107,337,45,253,62,253,123,305,184,253,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,196,286,195,294,192,301,186,306,179,310,171,311,164,310,157,306,152,301,148,294,147,286,
+209,225,129,225,145,215,209,225,145,215,155,212,209,225,155,212,162,206,209,225,162,206,165,197,209,225,165,197,166,184,209,225,166,184,168,38,209,225,168,38,169,38,209,225,169,38,171,-3,209,225,171,-3,186,1,209,225,186,1,199,6,209,225,199,6,209,54,166,184,166,69,168,38,237,25,225,26,225,14,237,25,225,14,240,18,237,25,240,18,240,25,209,54,199,6,209,42,209,42,199,6,212,10,209,42,212,10,212,34,212,34,212,10,225,14,212,34,225,14,217,29,217,29,225,14,225,26,172,339,175,302,179,338,179,338,175,302,181,306,179,338,181,306,183,336,183,336,181,306,185,310,183,336,185,310,187,333,187,333,185,310,188,314,187,333,188,314,189,329,189,329,188,314,189,318,189,329,189,318,190,323,175,302,172,339,168,338,175,302,168,338,165,337,175,302,165,337,161,335,175,302,161,335,156,332,175,302,156,332,151,328,175,302,151,328,98,253,78,225,4,225,17,216,78,225,17,216,26,213,78,225,26,213,32,207,78,225,32,207,35,197,78,225,35,197,36,185,78,225,36,185,38,38,78,225,38,38,46,20,78,225,46,20,58,6,78,225,58,6,75,-1,78,225,75,-1,78,64,164,53,162,48,168,38,168,38,162,48,159,43,168,38,159,43,155,40,155,40,147,34,153,21,153,21,147,34,139,29,153,21,139,29,138,8,138,8,139,29,130,26,138,8,130,26,123,0,123,0,130,26,121,25,123,0,121,25,113,24,113,24,102,26,109,-3,109,-3,102,26,97,-4,97,-4,102,26,92,31,97,-4,92,31,84,40,97,-4,84,40,79,51,97,-4,79,51,75,-1,78,64,75,-1,79,51,113,24,109,-3,123,0,166,59,164,53,168,38,166,59,168,38,166,69,155,40,153,21,168,38,38,38,36,185,36,59,171,-3,169,38,169,-2,17,216,4,225,4,218,98,253,151,328,78,253,145,215,129,225,129,217,
+200,253,138,337,107,337,45,253,62,253,123,305,184,253,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,196,286,195,294,192,301,186,306,179,310,171,311,164,310,157,306,152,301,148,294,147,286,148,278,151,272,157,266,163,263,171,262,179,263,186,266,192,272,195,278,196,286,16383,16383,97,286,96,294,92,301,87,306,80,310,72,311,64,310,58,306,52,301,49,294,47,286,49,278,52,272,57,266,64,263,71,262,79,263,86,266,92,272,96,278,97,286,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,
+209,225,129,225,145,215,209,225,145,215,155,212,209,225,155,212,162,206,209,225,162,206,165,197,209,225,165,197,166,184,209,225,166,184,168,38,209,225,168,38,169,38,209,225,169,38,171,-3,209,225,171,-3,186,1,209,225,186,1,199,6,209,225,199,6,209,54,166,184,166,69,168,38,237,25,225,26,225,14,237,25,225,14,240,18,237,25,240,18,240,25,209,54,199,6,209,42,209,42,199,6,212,10,209,42,212,10,212,34,212,34,212,10,225,14,212,34,225,14,217,29,217,29,225,14,225,26,45,253,62,253,107,337,107,337,62,253,123,305,107,337,123,305,138,337,138,337,123,305,184,253,138,337,184,253,200,253,78,225,4,225,17,216,78,225,17,216,26,213,78,225,26,213,32,207,78,225,32,207,35,197,78,225,35,197,36,185,78,225,36,185,38,38,78,225,38,38,46,20,78,225,46,20,58,6,78,225,58,6,75,-1,78,225,75,-1,78,64,164,53,162,48,168,38,168,38,162,48,159,43,168,38,159,43,155,40,155,40,147,34,153,21,153,21,147,34,139,29,153,21,139,29,138,8,138,8,139,29,130,26,138,8,130,26,123,0,123,0,130,26,121,25,123,0,121,25,113,24,113,24,102,26,109,-3,109,-3,102,26,97,-4,97,-4,102,26,92,31,97,-4,92,31,84,40,97,-4,84,40,79,51,97,-4,79,51,75,-1,78,64,75,-1,79,51,113,24,109,-3,123,0,166,59,164,53,168,38,166,59,168,38,166,69,155,40,153,21,168,38,38,38,36,185,36,59,171,-3,169,38,169,-2,17,216,4,225,4,218,145,215,129,225,129,217,
+196,286,195,294,192,301,186,306,179,310,171,311,164,310,157,306,152,301,148,294,147,286,148,278,151,272,157,266,163,263,171,262,179,263,186,266,192,272,195,278,196,286,16383,16383,97,286,96,294,92,301,87,306,80,310,72,311,64,310,58,306,52,301,49,294,47,286,49,278,52,272,57,266,64,263,71,262,79,263,86,266,92,272,96,278,97,286,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,71,253,92,253,169,302,174,306,178,310,181,314,183,318,184,323,183,329,181,333,177,336,172,338,166,339,158,337,154,335,150,332,145,328,16383,16383,238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,26,211,30,206,33,200,99,60,105,47,111,35,116,24,121,9,119,2,116,-8,112,-21,106,-34,100,-44,96,-51,85,-62,80,-65,75,-66,71,-66,69,-65,66,-64,62,-63,63,-63,57,-60,52,-58,42,-56,36,-56,30,-57,24,-60,19,-65,16,-72,15,-79,17,-88,21,-96,28,-102,38,-106,50,-108,71,-105,90,-94,106,-76,122,-49,137,-11,213,192,217,202,221,208,226,213,231,216,238,218,79,339,76,342,63,337,51,333,38,329,23,325,
+209,225,129,225,145,215,209,225,145,215,155,212,209,225,155,212,162,206,209,225,162,206,165,197,209,225,165,197,166,184,209,225,166,184,168,38,209,225,168,38,169,38,209,225,169,38,171,-3,209,225,171,-3,186,1,209,225,186,1,199,6,209,225,199,6,209,54,166,184,166,69,168,38,237,25,225,26,225,14,237,25,225,14,240,18,237,25,240,18,240,25,209,54,199,6,209,42,209,42,199,6,212,10,209,42,212,10,212,34,212,34,212,10,225,14,212,34,225,14,217,29,217,29,225,14,225,26,147,286,148,278,148,294,148,294,148,278,151,272,148,294,151,272,152,301,152,301,151,272,157,266,152,301,157,266,157,306,157,306,157,266,163,263,157,306,163,263,164,310,164,310,163,263,171,262,164,310,171,262,171,311,171,311,171,262,179,263,171,311,179,263,179,310,179,310,179,263,186,266,179,310,186,266,186,306,186,306,186,266,192,272,186,306,192,272,192,301,192,301,192,272,195,278,192,301,195,278,195,294,195,294,195,278,196,286,47,286,49,278,49,294,49,294,49,278,52,272,49,294,52,272,52,301,52,301,52,272,57,266,52,301,57,266,58,306,58,306,57,266,64,263,58,306,64,263,64,310,64,310,64,263,71,262,64,310,71,262,72,311,72,311,71,262,79,263,72,311,79,263,80,310,80,310,79,263,86,266,80,310,86,266,87,306,87,306,86,266,92,272,87,306,92,272,92,301,92,301,92,272,96,278,92,301,96,278,96,294,96,294,96,278,97,286,78,225,4,225,17,216,78,225,17,216,26,213,78,225,26,213,32,207,78,225,32,207,35,197,78,225,35,197,36,185,78,225,36,185,38,38,78,225,38,38,46,20,78,225,46,20,58,6,78,225,58,6,75,-1,78,225,75,-1,78,64,164,53,162,48,168,38,168,38,162,48,159,43,168,38,159,43,155,40,155,40,147,34,153,21,153,21,147,34,139,29,153,21,139,29,138,8,138,8,139,29,130,26,138,8,130,26,123,0,123,0,130,26,121,25,123,0,121,25,113,24,113,24,102,26,109,-3,109,-3,102,26,97,-4,97,-4,102,26,92,31,97,-4,92,31,84,40,97,-4,84,40,79,51,97,-4,79,51,75,-1,78,64,75,-1,79,51,113,24,109,-3,123,0,166,59,164,53,168,38,166,59,168,38,166,69,155,40,153,21,168,38,38,38,36,185,36,59,171,-3,169,38,169,-2,17,216,4,225,4,218,145,215,129,225,129,217,
+71,253,92,253,169,302,174,306,178,310,181,314,183,318,184,323,183,329,181,333,177,336,172,338,166,339,158,337,154,335,150,332,145,328,16383,16383,238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,26,211,30,206,33,200,99,60,105,47,111,35,116,24,121,9,119,2,116,-8,112,-21,106,-34,100,-44,96,-51,85,-62,80,-65,75,-66,71,-66,69,-65,66,-64,62,-63,63,-63,57,-60,52,-58,42,-56,36,-56,30,-57,24,-60,19,-65,16,-72,15,-79,17,-88,21,-96,28,-102,38,-106,50,-108,71,-105,90,-94,106,-76,122,-49,137,-11,213,192,217,202,221,208,226,213,231,216,238,218,79,339,76,342,63,337,51,333,38,329,23,325,4,320,4,311,8,311,9,312,13,312,23,311,30,308,35,303,37,295,37,-76,34,-86,27,-92,17,-96,2,-98,2,-107,123,-107,123,-98,104,-97,91,-93,84,-87,80,-75,79,-59,79,17,90,8,99,2,108,-1,118,-3,130,-4,164,1,193,19,215,47,230,82,235,123,231,160,221,190,204,212,180,225,151,230,135,229,120,224,106,216,92,205,79,190,16383,16383,79,166,83,175,91,184,103,192,117,198,131,200,152,196,170,185,182,166,189,140,192,107,189,75,181,49,169,29,152,16,131,11,117,13,103,19,91,27,82,36,79,45,198,286,197,294,193,301,188,306,181,310,173,311,165,310,159,306,153,301,150,294,148,286,150,278,153,272,158,266,165,263,172,262,180,263,187,266,193,272,197,278,198,286,
+166,339,169,302,172,338,172,338,169,302,174,306,172,338,174,306,177,336,177,336,174,306,178,310,177,336,178,310,181,333,181,333,178,310,181,314,181,333,181,314,183,329,183,329,181,314,183,318,183,329,183,318,184,323,169,302,166,339,162,338,169,302,162,338,158,337,169,302,158,337,154,335,169,302,154,335,150,332,169,302,150,332,145,328,169,302,145,328,92,253,90,-57,85,-62,90,-94,90,-94,85,-62,80,-65,90,-94,80,-65,75,-66,75,-66,73,-66,90,-94,90,-94,73,-66,71,-105,90,-57,106,-76,96,-51,96,-51,106,-76,100,-44,106,-34,100,-44,106,-76,106,-34,106,-76,122,-49,143,59,88,184,99,60,143,59,99,60,105,47,143,59,105,47,111,35,143,59,111,35,116,24,143,59,116,24,119,15,143,59,119,15,121,9,143,59,121,9,122,-49,143,59,122,-49,137,-11,143,59,137,-11,213,192,143,59,213,192,192,196,122,-49,121,9,119,2,99,60,88,184,86,188,99,60,86,188,84,192,99,60,84,192,82,196,99,60,82,196,81,201,99,60,81,201,33,200,33,200,81,201,81,204,81,204,82,209,33,200,33,200,82,209,85,212,33,200,85,212,109,225,109,225,85,212,90,215,109,225,90,215,98,217,194,202,193,201,213,192,213,192,193,201,193,198,213,192,193,198,192,196,238,225,171,225,179,217,238,225,179,217,186,216,238,225,186,216,190,213,238,225,190,213,193,210,238,225,193,210,194,205,238,225,194,205,226,213,238,225,226,213,231,216,238,225,231,216,238,218,194,205,213,192,217,202,194,205,217,202,221,208,194,205,221,208,226,213,194,204,194,202,213,192,194,204,213,192,194,205,122,-49,119,2,116,-8,122,-49,116,-8,112,-21,122,-49,112,-21,106,-34,71,-105,73,-66,71,-66,71,-105,71,-66,69,-65,71,-105,69,-65,66,-64,71,-105,66,-64,63,-63,71,-105,63,-63,57,-60,71,-105,57,-60,52,-58,71,-105,52,-58,50,-108,52,-58,47,-57,50,-108,50,-108,47,-57,42,-56,50,-108,42,-56,38,-106,38,-106,42,-56,36,-56,38,-106,36,-56,30,-57,38,-106,30,-57,28,-102,28,-102,30,-57,24,-60,28,-102,24,-60,21,-96,21,-96,24,-60,19,-65,21,-96,19,-65,17,-88,17,-88,19,-65,16,-72,17,-88,16,-72,15,-79,98,217,109,218,109,225,109,225,7,225,14,217,109,225,14,217,21,214,109,225,21,214,26,211,109,225,26,211,30,206,109,225,30,206,33,200,66,-64,62,-63,63,-63,14,217,7,225,7,218,90,-57,90,-94,106,-76,179,217,171,225,171,218,92,253,145,328,71,253,
+79,339,76,342,63,337,51,333,38,329,23,325,4,320,4,311,8,311,9,312,13,312,23,311,30,308,35,303,37,295,37,-76,34,-86,27,-92,17,-96,2,-98,2,-107,123,-107,123,-98,104,-97,91,-93,84,-87,80,-75,79,-59,79,17,90,8,99,2,108,-1,118,-3,130,-4,164,1,193,19,215,47,230,82,235,123,231,160,221,190,204,212,180,225,151,230,135,229,120,224,106,216,92,205,79,190,16383,16383,79,166,83,175,91,184,103,192,117,198,131,200,152,196,170,185,182,166,189,140,192,107,189,75,181,49,169,29,152,16,131,11,117,13,103,19,91,27,82,36,79,45,198,286,197,294,193,301,188,306,181,310,173,311,165,310,159,306,153,301,150,294,148,286,150,278,153,272,158,266,165,263,172,262,180,263,187,266,193,272,197,278,198,286,16383,16383,99,286,97,294,94,301,88,306,81,310,74,311,66,310,59,306,54,301,50,294,49,286,50,278,54,272,59,266,65,263,73,262,81,263,88,266,94,272,97,278,99,286,16383,16383,238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,
+34,-86,27,-92,123,-107,123,-107,27,-92,17,-96,123,-107,17,-96,2,-98,8,311,9,312,23,325,23,325,9,312,11,312,23,325,11,312,13,312,13,312,23,311,23,325,23,325,23,311,38,329,23,325,4,320,6,311,23,325,6,311,8,311,30,308,35,303,38,329,38,329,35,303,37,295,38,329,37,295,37,284,80,-75,37,284,37,-63,80,-75,37,-63,84,-87,84,-87,37,-63,91,-93,79,190,79,339,76,342,79,190,76,342,79,-59,79,190,79,-59,79,166,79,190,79,166,92,205,235,123,231,160,230,82,230,82,231,160,221,190,230,82,221,190,215,47,215,47,221,190,204,212,215,47,204,212,193,19,193,19,204,212,192,107,193,19,192,107,189,75,193,19,189,75,181,49,152,196,170,185,180,225,180,225,170,185,182,166,180,225,182,166,204,212,204,212,182,166,189,140,204,212,189,140,192,107,135,229,131,200,152,196,135,229,152,196,151,230,151,230,152,196,180,225,108,-1,118,-3,117,13,117,13,118,-3,131,11,152,16,131,11,164,1,152,16,164,1,169,29,169,29,164,1,193,19,169,29,193,19,181,49,131,11,118,-3,130,-4,131,11,130,-4,164,1,123,-107,123,-98,104,-97,123,-107,104,-97,91,-93,123,-107,91,-93,37,-76,123,-107,37,-76,34,-86,82,36,79,45,90,8,90,8,79,45,79,17,80,-75,79,-59,51,333,80,-75,51,333,38,329,63,337,51,333,79,-59,63,337,79,-59,76,342,83,175,91,184,92,205,92,205,91,184,103,192,92,205,103,192,106,216,106,216,103,192,117,198,106,216,117,198,120,224,120,224,117,198,131,200,120,224,131,200,135,229,82,36,90,8,91,27,91,27,90,8,99,2,91,27,99,2,103,19,103,19,99,2,108,-1,103,19,108,-1,117,13,92,205,79,166,83,175,6,311,4,320,4,311,123,-107,2,-98,2,-107,37,-76,91,-93,37,-63,37,284,80,-75,38,329,38,329,23,311,30,308,
+198,286,197,294,193,301,188,306,181,310,173,311,165,310,159,306,153,301,150,294,148,286,150,278,153,272,158,266,165,263,172,262,180,263,187,266,193,272,197,278,198,286,16383,16383,99,286,97,294,94,301,88,306,81,310,74,311,66,310,59,306,54,301,50,294,49,286,50,278,54,272,59,266,65,263,73,262,81,263,88,266,94,272,97,278,99,286,16383,16383,238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,26,211,30,206,33,200,99,60,105,47,111,35,116,24,121,9,119,2,116,-8,112,-21,106,-34,100,-44,96,-51,85,-62,80,-65,75,-66,71,-66,69,-65,66,-64,62,-63,63,-63,57,-60,52,-58,42,-56,36,-56,30,-57,24,-60,19,-65,16,-72,15,-79,17,-88,21,-96,28,-102,38,-106,50,-108,71,-105,90,-94,106,-76,122,-49,137,-11,213,192,217,202,221,208,226,213,231,216,238,218,256,359,256,387,100,387,100,359,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,190,253,190,281,35,281,35,253,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,
+148,286,150,278,150,294,150,294,150,278,153,272,150,294,153,272,153,301,153,301,153,272,158,266,153,301,158,266,159,306,159,306,158,266,165,263,159,306,165,263,165,310,165,310,165,263,172,262,165,310,172,262,173,311,173,311,172,262,180,263,173,311,180,263,181,310,181,310,180,263,187,266,181,310,187,266,188,306,188,306,187,266,193,272,188,306,193,272,193,301,193,301,193,272,197,278,193,301,197,278,197,294,197,294,197,278,198,286,49,286,50,278,50,294,50,294,50,278,54,272,50,294,54,272,54,301,54,301,54,272,59,266,54,301,59,266,59,306,59,306,59,266,65,263,59,306,65,263,66,310,66,310,65,263,73,262,66,310,73,262,74,311,74,311,73,262,81,263,74,311,81,263,81,310,81,310,81,263,88,266,81,310,88,266,88,306,88,306,88,266,94,272,88,306,94,272,94,301,94,301,94,272,97,278,94,301,97,278,97,294,97,294,97,278,99,286,90,-57,85,-62,90,-94,90,-94,85,-62,80,-65,90,-94,80,-65,75,-66,75,-66,73,-66,90,-94,90,-94,73,-66,71,-105,90,-57,106,-76,96,-51,96,-51,106,-76,100,-44,106,-34,100,-44,106,-76,106,-34,106,-76,122,-49,143,59,88,184,99,60,143,59,99,60,105,47,143,59,105,47,111,35,143,59,111,35,116,24,143,59,116,24,119,15,143,59,119,15,121,9,143,59,121,9,122,-49,143,59,122,-49,137,-11,143,59,137,-11,213,192,143,59,213,192,192,196,122,-49,121,9,119,2,99,60,88,184,86,188,99,60,86,188,84,192,99,60,84,192,82,196,99,60,82,196,81,201,99,60,81,201,33,200,33,200,81,201,81,204,81,204,82,209,33,200,33,200,82,209,85,212,33,200,85,212,109,225,109,225,85,212,90,215,109,225,90,215,98,217,194,202,193,201,213,192,213,192,193,201,193,198,213,192,193,198,192,196,238,225,171,225,179,217,238,225,179,217,186,216,238,225,186,216,190,213,238,225,190,213,193,210,238,225,193,210,194,205,238,225,194,205,226,213,238,225,226,213,231,216,238,225,231,216,238,218,194,205,213,192,217,202,194,205,217,202,221,208,194,205,221,208,226,213,194,204,194,202,213,192,194,204,213,192,194,205,122,-49,119,2,116,-8,122,-49,116,-8,112,-21,122,-49,112,-21,106,-34,71,-105,73,-66,71,-66,71,-105,71,-66,69,-65,71,-105,69,-65,66,-64,71,-105,66,-64,63,-63,71,-105,63,-63,57,-60,71,-105,57,-60,52,-58,71,-105,52,-58,50,-108,52,-58,47,-57,50,-108,50,-108,47,-57,42,-56,50,-108,42,-56,38,-106,38,-106,42,-56,36,-56,38,-106,36,-56,30,-57,38,-106,30,-57,28,-102,28,-102,30,-57,24,-60,28,-102,24,-60,21,-96,21,-96,24,-60,19,-65,21,-96,19,-65,17,-88,17,-88,19,-65,16,-72,17,-88,16,-72,15,-79,98,217,109,218,109,225,109,225,7,225,14,217,109,225,14,217,21,214,109,225,21,214,26,211,109,225,26,211,30,206,109,225,30,206,33,200,66,-64,62,-63,63,-63,14,217,7,225,7,218,90,-57,90,-94,106,-76,179,217,171,225,171,218,
+166,253,94,328,89,332,85,335,81,337,73,339,66,338,61,336,58,333,55,329,55,318,57,314,60,309,70,301,147,253,55,253,75,253,151,301,157,305,161,309,164,314,166,318,166,329,163,333,160,336,155,338,148,339,140,337,136,335,132,332,
+147,253,166,253,94,328,147,253,94,328,89,332,147,253,89,332,85,335,147,253,85,335,81,337,147,253,81,337,77,338,147,253,77,338,73,339,147,253,73,339,70,301,55,323,55,318,55,329,55,329,55,318,57,314,55,329,57,314,58,333,58,333,57,314,60,309,58,333,60,309,61,336,61,336,60,309,65,305,61,336,65,305,66,338,66,338,65,305,70,301,66,338,70,301,73,339,
+55,253,75,253,151,301,157,305,161,309,164,314,166,318,166,329,163,333,160,336,155,338,148,339,140,337,136,335,132,332,127,328,203,253,140,337,109,337,47,253,64,253,124,305,185,253,193,319,188,309,183,302,178,297,173,294,161,294,155,295,148,298,139,302,
+148,339,151,301,155,338,155,338,151,301,157,305,155,338,157,305,160,336,160,336,157,305,161,309,160,336,161,309,163,333,163,333,161,309,164,314,163,333,164,314,166,329,166,329,164,314,166,318,166,329,166,318,166,323,151,301,148,339,144,338,151,301,144,338,140,337,151,301,140,337,136,335,151,301,136,335,132,332,151,301,132,332,127,328,151,301,127,328,75,253,127,328,55,253,75,253,
+203,253,140,337,109,337,47,253,64,253,124,305,185,253,193,319,188,309,183,302,178,297,173,294,161,294,155,295,
+47,253,64,253,109,337,109,337,64,253,124,305,109,337,124,305,140,337,140,337,124,305,185,253,140,337,185,253,203,253,
+193,319,188,309,183,302,178,297,173,294,161,294,155,295,148,298,139,302,128,307,121,311,107,315,100,316,93,316,79,314,67,308,56,298,48,284,42,266,57,266,61,274,65,281,70,285,76,288,83,289,88,289,92,288,98,286,105,282,114,278,125,273,134,269,141,267,148,266,155,266,170,268,182,274,192,284,201,299,208,319,203,273,203,300,47,300,47,273,250,385,250,410,0,410,0,385,180,332,171,313,162,300,151,290,139,285,124,283,107,285,93,291,82,301,73,315,68,332,54,332,56,305,64,283,78,267,98,257,123,253,145,256,164,266,178,281,188,303,194,332,150,286,148,294,145,301,140,306,133,310,124,311,116,310,109,306,104,301,101,294,
+61,274,65,281,67,308,67,308,65,281,70,285,67,308,70,285,79,314,79,314,70,285,76,288,79,314,76,288,83,289,83,289,88,289,93,316,93,316,88,289,92,288,93,316,92,288,98,286,57,266,61,274,67,308,57,266,67,308,56,298,57,266,56,298,48,284,57,266,48,284,42,266,155,266,170,268,161,294,161,294,170,268,166,294,173,294,166,294,170,268,173,294,170,268,182,274,193,319,188,309,192,284,193,319,192,284,201,299,193,319,201,299,208,319,183,302,178,297,182,274,183,302,182,274,192,284,183,302,192,284,188,309,114,313,114,278,121,311,121,311,114,278,125,273,121,311,125,273,128,307,128,307,125,273,134,269,128,307,134,269,139,302,139,302,134,269,141,267,139,302,141,267,148,298,148,298,141,267,148,266,148,298,148,266,155,295,155,295,148,266,155,266,155,295,155,266,161,294,93,316,98,286,100,316,100,316,98,286,105,282,100,316,105,282,107,315,107,315,105,282,114,278,107,315,114,278,114,313,93,316,79,314,83,289,173,294,182,274,178,297,
+203,273,203,300,47,300,47,273,250,385,250,410,0,410,0,385,
+203,273,203,300,47,300,203,273,47,300,47,273,
+250,385,250,410,0,410,0,385,180,332,171,313,162,300,151,290,
+250,385,250,410,0,410,250,385,0,410,0,385,
+180,332,171,313,162,300,151,290,139,285,124,283,107,285,93,291,82,301,73,315,68,332,54,332,56,305,64,283,78,267,98,257,123,253,145,256,164,266,178,281,188,303,194,332,150,286,148,294,145,301,140,306,133,310,124,311,116,310,109,306,104,301,101,294,100,286,101,278,105,272,110,266,117,263,124,262,132,263,139,266,145,271,148,278,150,286,200,286,
+107,285,93,291,98,257,98,257,93,291,82,301,98,257,82,301,78,267,78,267,82,301,73,315,78,267,73,315,68,332,171,313,162,300,164,266,164,266,162,300,151,290,164,266,151,290,145,256,145,256,151,290,139,285,145,256,139,285,124,283,124,283,107,285,123,253,123,253,107,285,98,257,68,332,54,332,56,305,68,332,56,305,64,283,68,332,64,283,78,267,180,332,171,313,178,281,180,332,178,281,188,303,180,332,188,303,194,332,124,283,123,253,145,256,171,313,164,266,178,281,
+150,286,148,294,145,301,140,306,133,310,124,311,116,310,109,306,104,301,101,294,100,286,101,278,105,272,110,266,117,263,124,262,132,263,139,266,145,271,148,278,150,286,200,286,198,294,195,301,189,306,182,310,175,311,167,310,160,306,155,301,151,294,150,286,151,278,155,272,160,266,166,263,174,262,182,263,189,266,195,272,198,278,200,286,
+124,262,132,263,133,310,133,310,132,263,139,266,133,310,139,266,140,306,140,306,139,266,145,271,140,306,145,271,145,301,145,301,145,271,148,278,145,301,148,278,148,294,148,294,148,278,150,286,101,294,101,278,104,301,104,301,101,278,105,272,104,301,105,272,109,306,109,306,105,272,110,266,109,306,110,266,116,310,116,310,110,266,117,263,116,310,117,263,124,311,124,311,117,263,124,262,124,311,124,262,133,310,101,278,101,294,100,286,
+200,286,198,294,195,301,189,306,182,310,175,311,167,310,160,306,155,301,151,294,150,286,151,278,155,272,160,266,166,263,174,262,182,263,189,266,195,272,198,278,200,286,16383,16383,100,286,99,294,95,301,90,306,83,310,75,311,67,310,60,306,55,301,51,294,50,286,51,278,55,272,60,266,67,263,75,262,83,263,90,266,95,272,99,278,100,286,109,291,109,246,126,246,127,263,131,263,147,266,160,274,171,287,178,303,181,321,179,337,175,352,165,364,150,373,129,376,122,375,116,374,109,372,104,370,99,367,94,363,91,359,88,354,86,346,87,342,89,338,92,335,96,333,100,332,109,335,113,343,116,353,121,361,131,364,139,362,146,356,150,347,153,336,153,325,152,314,146,304,138,297,128,292,
+75,311,75,262,83,310,83,310,75,262,83,263,83,310,83,263,90,306,90,306,83,263,90,266,90,306,90,266,95,301,95,301,90,266,95,272,95,301,95,272,99,294,99,294,95,272,99,278,99,294,99,278,100,286,50,286,51,278,51,294,51,294,51,278,55,272,51,294,55,272,55,301,55,301,55,272,60,266,55,301,60,266,60,306,60,306,60,266,67,263,60,306,67,263,67,310,67,310,67,263,75,262,67,310,75,262,75,311,150,286,151,278,151,294,151,294,151,278,155,272,151,294,155,272,155,301,155,301,155,272,160,266,155,301,160,266,160,306,160,306,160,266,166,263,160,306,166,263,167,310,167,310,166,263,174,262,167,310,174,262,175,311,175,311,174,262,182,263,175,311,182,263,182,310,182,310,182,263,189,266,182,310,189,266,189,306,189,306,189,266,195,272,189,306,195,272,195,301,195,301,195,272,198,278,195,301,198,278,198,294,198,294,198,278,200,286,
+109,291,109,246,126,246,127,263,131,263,147,266,160,274,171,287,178,303,181,321,179,337,175,352,165,364,150,373,129,376,122,375,116,374,109,372,104,370,99,367,94,363,91,359,88,354,86,346,87,342,89,338,92,335,96,333,100,332,109,335,113,343,116,353,121,361,131,364,139,362,146,356,150,347,153,336,153,325,152,314,146,304,138,297,128,292,116,291,175,305,173,321,165,335,155,346,141,353,126,355,110,353,96,346,85,335,78,322,75,306,78,290,85,276,95,266,109,259,124,256,140,259,154,266,165,276,173,290,175,305,16383,16383,158,306,156,295,152,286,144,279,135,275,124,273,114,275,106,279,99,286,94,295,93,306,94,316,99,325,106,332,115,337,124,339,135,337,144,332,151,325,156,316,158,306,118,253,
+131,364,129,376,122,375,131,364,122,375,121,361,131,364,150,373,129,376,121,361,122,375,116,353,116,353,122,375,116,374,116,353,116,374,113,343,113,343,116,374,109,372,113,343,109,372,109,335,109,335,109,372,104,370,109,335,104,370,100,332,100,332,104,370,99,367,100,332,99,367,96,333,96,333,99,367,94,363,96,333,94,363,92,335,92,335,94,363,91,359,92,335,91,359,89,338,89,338,91,359,88,354,89,338,88,354,87,342,87,342,88,354,87,350,87,342,87,350,86,346,181,321,179,337,178,303,178,303,179,337,175,352,178,303,175,352,171,287,171,287,175,352,165,364,171,287,165,364,160,274,160,274,165,364,153,325,153,336,153,325,165,364,153,336,165,364,150,373,153,336,150,373,150,347,150,373,131,364,139,362,150,373,139,362,146,356,150,373,146,356,150,347,152,314,146,304,147,266,152,314,147,266,160,274,152,314,160,274,153,325,126,246,127,263,128,292,128,292,127,263,131,263,128,292,131,263,138,297,138,297,131,263,147,266,138,297,147,266,146,304,126,246,128,292,116,291,126,246,116,291,109,291,126,246,109,291,109,246,
+175,305,173,321,165,335,155,346,141,353,126,355,110,353,96,346,85,335,78,322,75,306,78,290,85,276,95,266,109,259,124,256,140,259,154,266,165,276,173,290,175,305,16383,16383,158,306,156,295,152,286,144,279,135,275,124,273,114,275,106,279,99,286,94,295,93,306,94,316,99,325,106,332,115,337,124,339,135,337,144,332,151,325,156,316,158,306,118,253,137,253,214,301,220,305,224,310,227,314,229,324,228,329,226,333,222,336,218,338,212,339,208,339,204,338,200,336,196,333,190,328,16383,16383,40,253,60,253,137,301,142,305,146,310,149,314,151,319,151,324,150,329,148,333,144,336,140,338,134,339,130,339,126,338,123,336,118,333,113,328,203,337,185,337,125,286,65,337,47,337,109,253,141,253,
+156,295,152,286,154,266,154,266,152,286,144,279,154,266,144,279,140,259,140,259,144,279,135,275,140,259,135,275,124,256,124,256,135,275,124,273,126,355,124,339,135,337,126,355,135,337,141,353,141,353,135,337,144,332,141,353,144,332,155,346,155,346,144,332,151,325,155,346,151,325,156,316,175,305,173,321,173,290,173,290,173,321,165,335,173,290,165,335,165,276,165,276,165,335,158,306,156,316,158,306,165,335,156,316,165,335,155,346,156,295,154,266,165,276,156,295,165,276,158,306,99,325,106,332,110,353,110,353,106,332,115,337,110,353,115,337,126,355,126,355,115,337,124,339,96,346,85,335,93,306,96,346,93,306,94,316,96,346,94,316,99,325,96,346,99,325,110,353,99,286,94,295,95,266,95,266,94,295,93,306,114,275,106,279,109,259,114,275,109,259,124,256,114,275,124,256,124,273,99,286,95,266,109,259,99,286,109,259,106,279,75,306,78,290,78,322,78,322,78,290,85,276,78,322,85,276,85,335,85,335,85,276,95,266,85,335,95,266,93,306,
+118,253,137,253,214,301,220,305,224,310,227,314,229,324,228,329,226,333,222,336,218,338,212,339,208,339,204,338,200,336,196,333,190,328,16383,16383,40,253,60,253,137,301,142,305,146,310,149,314,151,319,151,324,150,329,148,333,144,336,140,338,134,339,130,339,126,338,123,336,118,333,113,328,203,337,185,337,125,286,65,337,47,337,109,253,141,253,142,250,142,350,115,350,115,250,174,250,174,350,146,350,146,250,16383,16383,104,250,104,350,77,350,77,250,229,253,156,328,151,333,146,336,142,338,138,339,134,339,129,338,124,336,121,333,119,329,118,324,118,319,120,314,123,310,127,305,
+212,339,214,301,218,338,218,338,214,301,220,305,218,338,220,305,222,336,222,336,220,305,224,310,222,336,224,310,226,333,226,333,224,310,227,314,226,333,227,314,228,329,228,329,227,314,228,319,228,329,228,319,229,324,214,301,212,339,208,339,214,301,208,339,204,338,214,301,204,338,200,336,214,301,200,336,196,333,214,301,196,333,190,328,214,301,190,328,137,253,134,339,137,301,140,338,140,338,137,301,142,305,140,338,142,305,144,336,144,336,142,305,146,310,144,336,146,310,148,333,148,333,146,310,149,314,148,333,149,314,150,329,150,329,149,314,151,319,150,329,151,319,151,324,137,301,134,339,130,339,137,301,130,339,126,338,137,301,126,338,123,336,137,301,123,336,118,333,137,301,118,333,113,328,137,301,113,328,60,253,60,253,113,328,40,253,137,253,190,328,118,253,
+203,337,185,337,125,286,65,337,47,337,109,253,141,253,142,250,142,350,115,350,115,250,174,250,174,350,146,350,
+203,337,185,337,141,253,141,253,185,337,125,286,141,253,125,286,109,253,109,253,125,286,65,337,109,253,65,337,47,337,
+142,250,142,350,115,350,115,250,174,250,174,350,146,350,146,250,
+142,250,142,350,115,350,142,250,115,350,115,250,
+174,250,174,350,146,350,146,250,16383,16383,104,250,104,350,77,350,77,250,229,253,156,328,151,333,146,336,142,338,138,339,134,339,129,338,124,336,
+146,350,146,250,174,250,146,350,174,250,174,350,77,350,77,250,104,250,77,350,104,250,104,350,
+229,253,156,328,151,333,146,336,142,338,138,339,134,339,129,338,124,336,121,333,119,329,118,324,118,319,120,314,123,310,127,305,132,301,209,253,16383,16383,151,253,78,328,73,333,68,336,64,338,60,339,56,339,51,338,46,336,43,333,40,329,40,319,42,314,44,310,49,305,54,301,131,253,150,358,148,366,145,373,140,379,133,382,124,383,116,382,109,379,104,373,101,366,100,358,101,351,105,344,110,339,117,335,124,334,132,335,139,339,145,344,148,350,150,358,16383,16383,180,332,171,313,162,300,151,290,139,285,124,283,107,285,93,291,82,301,73,315,68,332,54,332,56,305,64,283,
+209,253,229,253,156,328,209,253,156,328,151,333,209,253,151,333,146,336,209,253,146,336,142,338,209,253,142,338,138,339,209,253,138,339,134,339,209,253,134,339,132,301,118,324,118,319,119,329,119,329,118,319,120,314,119,329,120,314,121,333,121,333,120,314,123,310,121,333,123,310,124,336,124,336,123,310,127,305,124,336,127,305,129,338,129,338,127,305,132,301,129,338,132,301,134,339,131,253,151,253,78,328,131,253,78,328,73,333,131,253,73,333,68,336,131,253,68,336,64,338,131,253,64,338,60,339,131,253,60,339,56,339,131,253,56,339,54,301,40,324,40,319,40,329,40,329,40,319,42,314,40,329,42,314,43,333,43,333,42,314,44,310,43,333,44,310,46,336,46,336,44,310,49,305,46,336,49,305,51,338,51,338,49,305,54,301,51,338,54,301,56,339,
+353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,22,258,18,256,15,252,13,248,12,226,9,226,0,16383,16383,224,128,108,128,166,266,211,175,235,181,254,191,268,205,277,224,280,248,274,277,258,300,232,317,195,327,148,331,8,331,8,321,29,320,43,316,51,308,55,295,56,275,56,56,55,37,51,24,42,16,29,11,8,9,8,0,177,0,217,4,250,15,275,34,291,58,296,89,292,116,281,138,263,155,239,167,211,174,16383,16383,108,183,108,303,109,307,112,310,115,312,119,313,162,310,192,302,
+55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,258,18,256,15,353,0,353,0,256,15,252,13,353,0,252,13,248,12,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,22,258,18,353,0,260,22,353,0,261,26,226,9,226,0,353,0,226,9,353,0,248,12,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,
+211,175,235,181,254,191,268,205,277,224,280,248,274,277,258,300,232,317,195,327,148,331,8,331,8,321,29,320,43,316,51,308,55,295,56,275,56,56,55,37,51,24,42,16,29,11,8,9,8,0,177,0,217,4,250,15,275,34,291,58,296,89,292,116,281,138,263,155,239,167,211,174,16383,16383,108,183,108,303,109,307,112,310,115,312,119,313,162,310,192,302,213,289,225,270,228,245,225,223,214,205,197,193,172,186,139,183,16383,16383,108,163,140,163,171,161,198,155,220,142,234,121,239,89,234,59,220,39,198,26,170,20,138,18,126,19,118,21,112,26,109,32,108,41,289,247,286,331,6,331,6,321,25,319,38,315,45,307,49,294,50,276,50,62,49,40,45,25,37,16,25,12,6,9,6,0,146,0,146,9,126,11,113,16,105,24,101,37,100,56,100,292,101,300,103,306,106,310,111,311,118,312,206,312,232,310,251,303,264,291,272,273,276,247,338,0,184,337,174,337,24,0,16383,16383,262,46,68,46,166,266,299,84,285,84,271,57,254,38,230,26,197,20,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,
+51,24,42,16,177,0,177,0,42,16,29,11,177,0,29,11,8,9,55,295,56,275,112,310,55,295,112,310,148,331,148,331,112,310,115,312,148,331,115,312,119,313,119,313,162,310,148,331,148,331,162,310,195,327,239,89,234,59,250,15,250,15,234,59,220,39,250,15,220,39,217,4,217,4,220,39,198,26,217,4,198,26,177,0,177,0,198,26,170,20,177,0,170,20,138,18,138,18,126,19,177,0,177,0,126,19,118,21,177,0,118,21,55,37,55,37,118,21,56,56,213,289,225,270,232,317,232,317,225,270,228,245,235,181,228,245,225,223,195,327,162,310,192,302,195,327,192,302,213,289,195,327,213,289,232,317,235,181,254,191,258,300,258,300,254,191,268,205,258,300,268,205,274,277,274,277,268,205,277,224,274,277,277,224,280,248,232,317,228,245,235,181,232,317,235,181,258,300,234,121,239,167,220,142,220,142,239,167,211,174,220,142,211,174,198,155,198,155,211,174,211,175,198,155,211,175,214,205,214,205,211,175,235,181,214,205,235,181,225,223,140,163,171,161,172,186,172,186,171,161,198,155,172,186,198,155,197,193,197,193,198,155,214,205,140,163,172,186,139,183,140,163,139,183,108,183,140,163,108,183,108,163,109,32,108,41,56,275,109,32,56,275,56,56,296,89,292,116,291,58,291,58,292,116,281,138,291,58,281,138,275,34,275,34,281,138,263,155,275,34,263,155,250,15,250,15,263,155,239,167,250,15,239,167,239,89,56,56,118,21,112,26,56,56,112,26,109,32,56,275,108,41,108,296,56,275,108,296,108,303,56,275,108,303,109,307,56,275,109,307,112,310,148,331,8,331,29,320,148,331,29,320,43,316,148,331,43,316,51,308,148,331,51,308,55,295,29,320,8,331,8,321,177,0,8,9,8,0,51,24,177,0,55,37,239,167,234,121,239,89,
+289,247,286,331,6,331,6,321,25,319,38,315,45,307,49,294,50,276,50,62,49,40,45,25,37,16,25,12,6,9,6,0,146,0,146,9,126,11,113,16,105,24,101,37,100,56,100,292,101,300,103,306,106,310,111,311,118,312,206,312,232,310,251,303,264,291,272,273,276,247,338,0,184,337,174,337,24,0,16383,16383,262,46,68,46,166,266,299,84,285,84,271,57,254,38,230,26,197,20,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,
+38,315,45,307,286,331,286,331,45,307,111,311,286,331,111,311,118,312,286,331,118,312,206,312,286,331,206,312,232,310,286,331,232,310,251,303,286,331,251,303,264,291,286,331,264,291,272,273,286,331,272,273,276,247,286,331,276,247,289,247,100,56,100,292,50,276,50,276,100,292,101,300,50,276,101,300,103,306,50,276,103,306,106,310,50,276,106,310,49,294,50,276,101,37,100,56,111,311,45,307,49,294,111,311,49,294,106,310,25,319,38,315,286,331,25,319,286,331,6,331,25,319,6,331,6,321,146,0,146,9,126,11,146,0,126,11,113,16,146,0,113,16,49,40,146,0,49,40,45,25,146,0,45,25,37,16,146,0,37,16,25,12,146,0,25,12,6,9,146,0,6,9,6,0,50,62,49,40,113,16,50,62,113,16,105,24,50,62,105,24,101,37,50,62,101,37,50,276,
+338,0,184,337,174,337,24,0,16383,16383,262,46,68,46,166,266,299,84,285,84,271,57,254,38,230,26,197,20,151,18,132,19,
+174,337,24,0,68,46,68,46,24,0,338,0,68,46,338,0,262,46,262,46,338,0,184,337,262,46,184,337,174,337,174,337,68,46,166,266,174,337,166,266,262,46,
+299,84,285,84,271,57,254,38,230,26,197,20,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,118,312,179,311,219,306,243,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,299,88,287,88,282,72,278,59,273,49,266,40,257,33,249,28,240,24,228,21,215,20,199,19,73,19,289,324,289,331,26,331,16,246,29,246,32,260,35,271,38,279,43,287,50,295,58,301,68,306,81,309,97,311,117,312,224,312,5,7,5,0,286,0,352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,211,331,211,321,231,319,244,315,251,307,255,294,256,274,256,180,104,180,104,274,
+45,24,38,16,276,0,276,0,38,16,25,12,276,0,25,12,6,9,38,315,45,307,271,331,271,331,45,307,111,312,271,331,111,312,118,312,118,312,179,311,271,331,271,331,179,311,219,306,271,331,219,306,243,297,271,331,243,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,45,24,117,21,49,37,49,37,117,21,108,25,49,37,108,25,50,57,50,57,108,25,102,31,50,57,102,31,50,275,50,275,102,31,100,42,50,275,100,42,100,294,100,184,100,164,176,164,100,184,176,164,176,184,198,185,176,184,198,162,198,185,198,162,213,190,213,190,198,162,213,158,213,190,213,158,222,198,222,198,213,158,222,150,222,198,222,150,229,212,229,212,222,150,229,136,229,212,229,136,233,232,233,232,229,136,233,115,233,232,233,115,244,115,50,275,100,294,101,302,50,275,101,302,103,307,50,275,103,307,106,310,50,275,106,310,49,294,106,310,111,312,45,307,106,310,45,307,49,294,25,320,38,315,271,331,25,320,271,331,6,331,25,320,6,331,6,321,254,38,230,26,276,0,276,0,230,26,197,20,276,0,197,20,151,18,151,18,132,19,276,0,276,0,132,19,117,21,276,0,117,21,45,24,276,0,299,84,285,84,276,0,285,84,271,57,276,0,271,57,254,38,176,184,176,164,198,162,233,232,244,115,244,232,276,0,6,9,6,0,
+299,88,287,88,282,72,278,59,273,49,266,40,257,33,249,28,240,24,228,21,215,20,199,19,73,19,289,324,289,331,26,331,16,246,29,246,32,260,35,271,38,279,43,287,50,295,58,301,68,306,81,309,97,311,117,312,224,312,5,7,5,0,286,0,352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,211,331,211,321,231,319,244,315,251,307,255,294,256,274,256,180,104,180,104,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,
+35,271,38,279,26,331,26,331,38,279,43,287,26,331,43,287,50,295,50,295,58,301,26,331,26,331,58,301,68,306,26,331,68,306,81,309,73,19,289,324,224,312,224,312,289,324,289,331,224,312,289,331,117,312,97,311,117,312,289,331,97,311,289,331,26,331,26,331,16,246,29,246,26,331,29,246,32,260,26,331,32,260,35,271,224,312,5,7,73,19,73,19,5,7,286,0,73,19,286,0,199,19,199,19,286,0,215,20,278,59,273,49,286,0,286,0,273,49,266,40,286,0,266,40,257,33,257,33,249,28,286,0,286,0,249,28,240,24,286,0,240,24,228,21,286,0,299,88,287,88,286,0,287,88,282,72,286,0,282,72,278,59,286,0,5,7,5,0,215,20,286,0,228,21,26,331,81,309,97,311,
+352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,211,331,211,321,231,319,244,315,251,307,255,294,256,274,256,180,104,180,104,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,28,319,41,315,49,307,53,294,54,274,54,61,53,39,49,25,42,16,29,12,9,9,9,0,148,0,148,9,129,12,117,17,109,25,105,38,104,56,104,157,256,157,256,62,255,41,252,26,244,17,232,12,212,9,212,0,251,118,249,129,247,142,245,170,245,189,246,197,247,204,251,220,238,220,235,211,231,203,226,197,218,193,209,191,156,191,146,192,139,196,133,201,129,209,124,220,112,220,114,210,116,197,117,184,117,172,118,161,118,153,115,126,113,118,125,118,129,129,134,138,139,144,146,148,156,149,209,149,219,148,226,144,231,137,235,128,238,118,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,
+49,25,42,16,148,0,148,0,42,16,29,12,148,0,29,12,9,9,149,331,9,331,28,319,149,331,28,319,41,315,149,331,41,315,49,307,149,331,49,307,53,294,149,331,53,294,118,315,149,331,118,315,130,319,149,331,130,319,149,321,54,274,105,38,104,56,104,180,104,157,256,157,104,180,256,157,256,180,256,180,256,157,312,25,256,180,312,25,308,37,54,274,104,56,104,274,54,274,104,274,106,294,54,274,106,294,110,307,54,274,110,307,118,315,54,274,118,315,53,294,252,26,244,17,352,0,352,0,244,17,232,12,352,0,232,12,212,9,333,319,352,321,352,331,333,319,352,331,320,315,320,315,352,331,255,294,320,315,255,294,256,274,308,37,256,274,256,180,307,55,307,274,256,274,256,274,307,274,308,293,256,274,308,293,312,307,352,331,211,331,231,319,352,331,231,319,244,315,352,331,244,315,251,307,352,331,251,307,255,294,352,0,352,9,333,12,352,0,333,12,320,17,352,0,320,17,255,41,352,0,255,41,252,26,256,62,255,41,320,17,256,62,320,17,312,25,256,62,312,25,256,157,148,0,148,9,129,12,148,0,129,12,117,17,148,0,117,17,53,39,148,0,53,39,49,25,54,61,53,39,117,17,54,61,117,17,109,25,54,61,109,25,105,38,54,61,105,38,54,274,148,0,9,9,9,0,352,0,212,9,212,0,256,274,308,37,307,55,231,319,211,331,211,321,320,315,256,274,312,307,28,319,9,331,9,321,
+251,118,249,129,247,142,245,170,245,189,246,197,247,204,251,220,238,220,235,211,231,203,226,197,218,193,209,191,156,191,146,192,139,196,133,201,129,209,124,220,112,220,114,210,116,197,117,184,117,172,118,161,118,153,115,126,113,118,125,118,129,129,134,138,139,144,146,148,156,149,209,149,219,148,226,144,231,137,235,128,238,118,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,362,0,362,9,349,11,336,16,322,25,305,41,283,64,166,192,259,281,278,298,292,309,305,316,320,320,338,321,338,331,208,331,208,321,220,321,229,320,235,318,238,315,240,311,241,305,239,298,234,289,226,280,202,256,113,174,113,293,117,307,124,315,137,319,158,321,158,331,17,331,17,321,37,319,50,315,57,306,61,293,62,275,62,63,61,40,57,26,50,17,36,12,17,9,17,0,157,0,157,9,139,12,126,16,118,23,114,36,113,55,113,148,126,158,176,107,198,84,217,63,232,46,241,32,244,22,244,18,241,15,237,12,231,11,224,10,210,9,210,0,344,0,344,9,330,12,320,17,311,26,304,38,296,55,179,337,
+207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,134,308,149,314,180,338,180,338,149,314,164,318,180,338,164,318,180,320,180,320,194,319,235,330,235,330,194,319,207,316,235,330,180,338,180,320,247,142,246,156,238,220,238,220,246,156,245,170,238,220,245,170,245,180,245,180,245,189,238,220,238,220,245,189,246,197,238,220,246,197,247,204,249,212,251,220,238,220,249,212,238,220,247,204,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,234,1,235,26,223,19,234,1,223,19,209,15,234,1,209,15,196,12,234,1,196,12,181,11,234,1,181,11,180,-6,226,144,231,137,231,203,231,203,231,137,235,128,231,203,235,128,235,211,235,211,235,128,238,118,235,211,238,118,238,220,238,220,238,118,249,129,238,220,249,129,247,142,156,149,209,149,209,191,218,193,209,191,219,148,218,193,219,148,226,197,226,197,219,148,226,144,226,197,226,144,231,203,209,191,156,191,156,149,146,148,156,149,156,191,146,148,156,191,146,192,146,148,146,192,139,144,139,144,146,192,139,196,139,144,139,196,134,138,134,138,139,196,133,201,134,138,133,201,129,129,129,129,133,201,129,209,129,129,129,209,125,118,125,118,129,209,124,220,125,118,124,220,118,161,118,161,124,220,117,172,124,220,112,220,114,210,124,220,114,210,116,197,124,220,116,197,117,184,124,220,117,184,117,172,125,118,118,161,118,153,125,118,118,153,117,144,125,118,117,144,116,135,125,118,116,135,115,126,125,118,115,126,113,118,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,154,15,180,-6,167,12,167,12,180,-6,181,11,142,19,130,25,180,-6,142,19,180,-6,154,15,81,24,74,166,46,61,126,330,134,308,180,338,209,191,209,149,219,148,249,129,238,118,251,118,
+157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,362,0,362,9,349,11,336,16,322,25,305,41,283,64,166,192,259,281,278,298,292,309,305,316,320,320,338,321,338,331,208,331,208,321,220,321,229,320,235,318,238,315,240,311,241,305,239,298,234,289,226,280,202,256,
+52,23,44,15,157,0,157,0,44,15,30,11,157,0,30,11,9,9,157,331,9,331,30,320,157,331,30,320,44,316,157,331,44,316,53,308,157,331,53,308,57,295,157,331,57,295,122,316,157,331,122,316,136,320,157,331,136,320,157,321,122,16,114,24,57,56,57,56,114,24,109,37,57,56,109,37,57,276,57,276,109,37,108,56,57,276,108,56,108,276,57,276,108,276,109,295,57,276,109,295,113,308,57,276,113,308,122,316,57,276,122,316,57,295,157,0,157,9,137,11,157,0,137,11,122,16,157,0,122,16,56,36,157,0,56,36,52,23,157,0,9,9,9,0,56,36,122,16,57,56,30,320,9,331,9,321,
+362,0,362,9,349,11,336,16,322,25,305,41,283,64,166,192,259,281,278,298,292,309,305,316,320,320,338,321,338,331,208,331,208,321,220,321,229,320,235,318,238,315,240,311,241,305,239,298,234,289,226,280,202,256,113,174,113,293,117,307,124,315,137,319,158,321,158,331,17,331,17,321,37,319,50,315,57,306,61,293,62,275,62,63,61,40,57,26,50,17,36,12,17,9,17,0,157,0,157,9,139,12,126,16,118,23,114,36,113,55,113,148,126,158,176,107,198,84,217,63,232,46,241,32,244,22,244,18,241,15,237,12,231,11,224,10,210,9,210,0,344,0,344,9,330,12,320,17,311,26,304,38,296,55,179,337,169,337,70,93,56,58,44,34,34,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,160,267,161,267,241,61,244,51,247,44,249,37,250,31,251,26,249,18,244,13,236,11,227,10,216,9,216,0,432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,
+158,321,158,321,137,319,137,319,158,321,158,331,137,319,158,331,124,315,124,315,158,331,61,293,124,315,61,293,62,275,114,36,62,275,62,63,114,36,62,63,118,23,118,23,62,63,126,16,62,275,114,36,113,55,113,174,113,148,126,158,113,174,126,158,202,256,202,256,126,158,166,192,202,256,166,192,259,281,62,275,113,55,113,274,62,275,113,274,113,293,62,275,113,293,117,307,62,275,117,307,124,315,158,331,17,331,37,319,158,331,37,319,50,315,158,331,50,315,57,306,158,331,57,306,61,293,234,289,226,280,259,281,259,281,226,280,215,269,259,281,215,269,202,256,338,331,208,331,220,321,338,331,220,321,229,320,338,331,229,320,235,318,338,331,235,318,238,315,338,331,238,315,240,311,338,331,240,311,241,305,338,331,241,305,305,316,338,331,305,316,320,320,338,331,320,320,338,321,241,305,259,281,278,298,241,305,278,298,292,309,241,305,292,309,305,316,239,298,234,289,259,281,239,298,259,281,241,305,241,15,237,12,362,0,362,0,237,12,231,11,362,0,231,11,224,10,244,22,362,0,336,16,244,22,336,16,322,25,244,22,322,25,305,41,244,22,305,41,283,64,244,22,283,64,241,32,283,64,166,192,176,107,283,64,176,107,198,84,283,64,198,84,217,63,283,64,217,63,232,46,283,64,232,46,241,32,349,11,336,16,362,0,349,11,362,0,362,9,244,18,241,15,362,0,244,18,362,0,244,22,210,9,210,0,362,0,210,9,362,0,224,10,157,0,157,9,139,12,157,0,139,12,126,16,157,0,126,16,61,40,157,0,61,40,57,26,157,0,57,26,50,17,157,0,50,17,36,12,157,0,36,12,17,9,157,0,17,9,17,0,61,40,126,16,62,63,176,107,166,192,126,158,220,321,208,331,208,321,37,319,17,331,17,321,
+344,0,344,9,330,12,320,17,311,26,304,38,296,55,179,337,169,337,70,93,56,58,44,34,34,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,160,267,161,267,241,61,244,51,247,44,249,37,250,31,251,26,249,18,244,13,236,11,227,10,216,9,216,0,432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,6,9,6,0,123,0,123,9,103,12,90,18,82,29,78,48,76,75,76,275,203,0,209,0,
+56,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,161,267,169,337,160,267,160,267,169,337,76,51,75,47,76,51,169,337,75,47,169,337,70,93,251,26,344,0,320,17,251,26,320,17,311,26,251,26,311,26,304,38,251,26,304,38,296,55,251,26,296,55,250,31,296,55,179,337,241,61,296,55,241,61,244,51,296,55,244,51,247,44,296,55,247,44,249,37,296,55,249,37,250,31,169,337,161,267,241,61,169,337,241,61,179,337,70,93,56,58,72,30,330,12,320,17,344,0,330,12,344,0,344,9,249,18,244,13,344,0,249,18,344,0,251,26,344,0,244,13,236,11,344,0,236,11,227,10,344,0,227,10,216,9,344,0,216,9,216,0,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,34,20,107,0,34,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,34,20,84,12,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,56,58,75,47,70,93,74,43,
+432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,6,9,6,0,123,0,123,9,103,12,90,18,82,29,78,48,76,75,76,275,203,0,209,0,337,286,337,61,336,40,333,26,325,17,312,12,292,9,292,0,353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,103,13,90,20,82,31,78,49,76,75,76,269,297,-5,306,-5,306,274,308,289,311,299,315,307,320,313,324,315,329,318,335,319,343,320,353,321,295,247,295,331,
+49,29,41,18,123,0,123,0,41,18,27,12,123,0,27,12,6,9,333,26,325,17,432,0,432,0,325,17,312,12,432,0,312,12,292,9,413,320,431,321,431,331,413,320,431,331,401,316,401,316,431,331,337,286,401,316,337,286,393,307,393,307,337,286,389,294,401,17,393,25,337,61,337,61,393,25,389,38,337,61,389,38,337,286,337,286,389,38,388,56,337,286,388,56,388,275,203,0,209,0,222,80,222,80,209,0,337,286,222,80,337,286,332,331,332,331,337,286,431,331,106,331,7,331,28,319,106,331,28,319,42,315,106,331,42,315,50,307,106,331,50,307,54,294,106,331,54,294,55,275,106,331,55,275,76,275,106,331,76,275,203,0,106,331,203,0,222,80,76,75,76,275,55,275,76,75,55,275,78,48,78,48,55,275,55,75,78,48,55,75,82,29,82,29,55,75,54,47,82,29,54,47,90,18,90,18,54,47,49,29,90,18,49,29,123,0,432,0,432,9,413,12,432,0,413,12,401,17,432,0,401,17,336,40,432,0,336,40,333,26,103,12,90,18,123,0,103,12,123,0,123,9,123,0,6,9,6,0,432,0,292,9,292,0,336,40,401,17,337,61,28,319,7,331,7,321,389,294,337,286,388,275,
+353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,103,13,90,20,82,31,78,49,76,75,76,269,297,-5,306,-5,306,274,308,289,311,299,315,307,320,313,324,315,329,318,335,319,343,320,353,321,295,247,295,331,26,331,26,246,39,246,43,263,48,276,55,284,66,289,79,290,242,290,256,289,266,284,274,276,279,263,282,247,16383,16383,252,109,252,225,240,225,239,211,235,200,229,193,219,189,207,188,114,188,102,189,93,193,87,200,83,211,81,225,70,225,70,109,81,109,84,122,87,132,93,140,101,146,113,147,205,147,218,146,227,141,234,133,239,123,240,109,16383,16383,307,0,
+49,30,41,19,123,0,123,0,41,19,27,13,123,0,27,13,6,9,256,319,263,317,353,331,353,331,263,317,269,313,353,331,269,313,275,309,275,309,278,303,353,331,353,331,278,303,281,295,353,331,281,295,324,315,324,315,281,295,320,313,324,315,320,313,320,312,320,312,320,313,315,307,315,307,320,313,284,274,315,307,284,274,284,259,297,-5,284,259,284,89,297,-5,284,89,91,331,353,331,324,315,329,318,353,331,329,318,335,319,353,331,335,319,343,320,353,331,343,320,353,321,306,-5,306,253,297,-5,297,-5,306,253,306,274,297,-5,306,274,284,259,284,259,306,274,308,289,284,259,308,289,311,299,283,285,284,274,320,313,283,285,320,313,281,295,247,320,256,319,353,331,247,320,353,331,235,331,247,320,235,331,235,321,91,331,6,331,19,321,91,331,19,321,29,318,91,331,29,318,37,313,91,331,37,313,46,306,91,331,46,306,55,295,91,331,55,295,76,269,91,331,76,269,297,-5,55,295,78,49,76,75,54,48,49,30,90,20,90,20,49,30,123,0,90,20,123,0,103,13,103,13,123,0,123,9,55,75,54,48,82,31,55,75,82,31,78,49,55,75,78,49,55,295,123,0,6,9,6,0,54,48,90,20,82,31,19,321,6,331,6,321,76,269,55,295,76,75,315,307,284,259,311,299,
+295,247,295,331,26,331,26,246,39,246,43,263,48,276,55,284,66,289,79,290,242,290,256,289,266,284,274,276,279,263,282,247,16383,16383,252,109,252,225,240,225,239,211,235,200,229,193,219,189,207,188,114,188,102,189,93,193,87,200,83,211,81,225,70,225,70,109,81,109,84,122,87,132,93,140,101,146,113,147,205,147,218,146,227,141,234,133,239,123,240,109,16383,16383,307,0,307,85,295,85,293,70,287,57,278,49,265,44,248,42,70,42,56,44,44,49,35,57,29,69,27,85,15,85,15,0,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,
+295,331,26,331,66,289,295,331,66,289,79,290,295,331,79,290,242,290,295,331,242,290,256,289,295,331,256,289,266,284,295,331,266,284,274,276,295,331,274,276,279,263,295,331,279,263,282,247,295,331,282,247,295,247,26,331,26,246,39,246,26,331,39,246,43,263,26,331,43,263,48,276,26,331,48,276,55,284,26,331,55,284,66,289,219,189,207,188,218,146,218,146,207,188,205,147,205,147,207,188,114,188,205,147,114,188,113,147,101,146,113,147,102,189,101,146,102,189,93,193,83,211,84,122,87,200,87,200,84,122,87,132,87,200,87,132,93,193,93,193,87,132,93,140,93,193,93,140,101,146,83,211,81,225,84,122,84,122,81,225,81,109,81,109,81,225,70,225,81,109,70,225,70,109,240,225,239,211,240,109,240,225,240,109,252,109,240,225,252,109,252,225,240,109,239,211,239,123,239,123,239,211,235,200,239,123,235,200,234,133,234,133,235,200,229,193,234,133,229,193,227,141,227,141,229,193,219,189,227,141,219,189,218,146,287,57,278,49,307,0,307,0,278,49,265,44,307,0,265,44,248,42,307,0,307,85,295,85,307,0,295,85,293,70,307,0,293,70,287,57,248,42,70,42,307,0,307,0,70,42,56,44,307,0,56,44,15,0,15,0,56,44,44,49,15,0,44,49,35,57,15,0,35,57,15,85,15,85,35,57,29,69,15,85,29,69,27,85,113,147,114,188,102,189,
+344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,9,331,9,321,28,319,41,315,49,307,53,294,54,274,54,61,53,39,49,25,42,16,29,12,9,9,9,0,148,0,148,9,129,12,117,17,109,25,105,38,104,56,104,296,105,303,107,307,111,310,116,312,238,312,245,311,251,310,254,306,256,301,256,62,255,41,252,26,244,17,232,12,212,9,212,0,8,331,8,321,27,319,39,315,46,307,49,294,50,276,50,39,47,25,40,16,27,12,
+149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,81,24,74,166,46,61,223,19,234,1,235,26,130,25,180,-6,142,19,
+352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,9,331,9,321,28,319,41,315,49,307,53,294,54,274,54,61,53,39,49,25,42,16,29,12,9,9,9,0,148,0,148,9,129,12,117,17,109,25,105,38,104,56,104,296,105,303,107,307,111,310,116,312,238,312,245,311,251,310,254,306,256,301,256,62,255,41,252,26,244,17,232,12,212,9,212,0,8,331,8,321,27,319,39,315,46,307,49,294,50,276,50,39,47,25,40,16,27,12,8,9,8,0,148,0,148,9,128,12,114,16,106,24,102,37,101,56,101,146,109,145,115,145,122,144,136,144,164,145,188,147,208,153,225,161,243,175,253,185,260,197,266,210,270,225,271,240,270,254,267,268,262,280,255,291,246,300,231,310,213,319,191,325,166,329,137,331,16383,16383,101,295,101,302,103,307,106,310,111,312,118,313,
+49,25,42,16,148,0,148,0,42,16,29,12,148,0,29,12,9,9,53,294,54,274,111,310,53,294,111,310,49,307,49,307,111,310,116,312,49,307,116,312,352,331,352,331,116,312,123,312,252,26,244,17,352,0,352,0,244,17,232,12,352,0,232,12,212,9,352,331,123,312,238,312,352,331,238,312,245,311,352,331,245,311,251,310,352,331,251,310,254,306,352,331,254,306,256,301,352,331,256,301,256,294,352,331,256,294,320,315,352,331,320,315,333,319,352,331,333,319,352,321,307,55,307,274,256,294,256,294,307,274,308,293,256,294,308,293,312,307,320,17,312,25,256,62,256,62,312,25,308,37,256,62,308,37,256,294,117,17,109,25,54,61,54,61,109,25,105,38,54,61,105,38,54,274,54,274,105,38,104,56,54,274,104,56,104,296,54,274,104,296,105,303,54,274,105,303,107,307,54,274,107,307,111,310,352,331,9,331,28,319,352,331,28,319,41,315,352,331,41,315,49,307,352,0,352,9,333,12,352,0,333,12,320,17,352,0,320,17,255,41,352,0,255,41,252,26,148,0,148,9,129,12,148,0,129,12,117,17,148,0,117,17,53,39,148,0,53,39,49,25,148,0,9,9,9,0,53,39,117,17,54,61,352,0,212,9,212,0,255,41,320,17,256,62,256,294,308,37,307,55,28,319,9,331,9,321,320,315,256,294,312,307,
+8,331,8,321,27,319,39,315,46,307,49,294,50,276,50,39,47,25,40,16,27,12,8,9,8,0,148,0,148,9,128,12,114,16,106,24,102,37,101,56,101,146,109,145,115,145,122,144,136,144,164,145,188,147,208,153,225,161,243,175,253,185,260,197,266,210,270,225,271,240,270,254,267,268,262,280,255,291,246,300,231,310,213,319,191,325,166,329,137,331,16383,16383,101,295,101,302,103,307,106,310,111,312,118,313,155,310,182,302,202,288,213,266,217,238,213,213,202,192,185,177,162,167,132,164,120,164,114,165,108,165,101,166,300,102,289,102,283,82,275,66,264,56,249,49,229,47,74,47,193,184,86,312,190,312,214,310,234,305,248,294,259,276,266,251,278,251,278,331,15,331,15,324,148,162,15,7,15,0,286,0,296,246,293,331,12,331,8,246,21,246,28,274,37,292,50,303,70,309,97,310,127,310,127,61,126,39,123,25,115,16,101,12,80,9,80,0,226,0,226,9,205,11,192,16,183,23,179,36,178,55,178,310,208,310,235,309,254,303,268,292,277,274,284,246,352,329,345,332,338,334,332,335,320,335,289,330,259,315,232,290,211,258,198,218,
+111,312,118,312,118,313,137,331,118,313,155,310,137,331,155,310,166,329,166,329,155,310,182,302,166,329,182,302,191,325,191,325,182,302,202,288,191,325,202,288,213,319,213,319,202,288,213,266,213,319,213,266,231,310,231,310,213,266,217,238,231,310,217,238,225,161,225,161,213,213,208,153,208,153,213,213,202,192,208,153,202,192,188,147,188,147,202,192,185,177,188,147,185,177,164,145,164,145,185,177,162,167,164,145,162,167,136,144,136,144,162,167,132,164,136,144,132,164,128,144,128,144,132,164,126,164,128,144,126,164,122,144,122,144,126,164,120,164,122,144,120,164,115,145,115,145,120,164,114,165,115,145,114,165,109,145,109,145,114,165,108,165,109,145,108,165,101,166,101,56,101,166,50,276,101,56,50,276,102,37,102,37,50,276,50,61,101,166,101,146,109,145,271,240,270,254,270,225,270,225,270,254,267,268,270,225,267,268,266,210,266,210,267,268,262,280,266,210,262,280,260,197,260,197,262,280,255,291,260,197,255,291,253,185,253,185,255,291,246,300,253,185,246,300,243,175,243,175,246,300,231,310,243,175,231,310,225,161,137,331,8,331,27,319,137,331,27,319,39,315,137,331,39,315,46,307,137,331,46,307,49,294,137,331,49,294,50,276,137,331,50,276,106,310,137,331,106,310,111,312,137,331,111,312,118,313,101,295,101,302,50,276,101,295,50,276,101,166,103,307,106,310,50,276,103,307,50,276,101,302,148,0,148,9,128,12,148,0,128,12,114,16,148,0,114,16,50,39,148,0,50,39,47,25,148,0,47,25,40,16,148,0,40,16,27,12,148,0,27,12,8,9,148,0,8,9,8,0,50,61,50,39,114,16,50,61,114,16,106,24,50,61,106,24,102,37,27,319,8,331,8,321,213,213,225,161,217,238,155,310,118,313,118,312,
+
+
+300,102,289,102,283,82,275,66,264,56,249,49,229,47,74,47,193,184,86,312,190,312,214,310,234,305,248,294,259,276,266,251,278,251,278,331,15,331,15,324,148,162,15,7,15,0,286,0,296,246,293,331,12,331,8,246,21,246,28,274,37,292,50,303,70,309,97,310,127,310,127,61,126,39,123,25,115,16,101,12,80,9,80,0,226,0,226,9,205,11,192,16,183,23,179,36,
+278,331,15,331,86,312,278,331,86,312,190,312,278,331,190,312,214,310,278,331,214,310,234,305,278,331,234,305,248,294,278,331,248,294,259,276,278,331,259,276,266,251,278,331,266,251,278,251,148,162,15,7,74,47,148,162,74,47,193,184,148,162,193,184,86,312,148,162,86,312,15,331,148,162,15,331,15,324,275,66,264,56,286,0,286,0,264,56,249,49,286,0,249,49,229,47,286,0,300,102,289,102,286,0,289,102,283,82,286,0,283,82,275,66,286,0,229,47,74,47,286,0,74,47,15,7,286,0,15,7,15,0,
+296,246,293,331,12,331,8,246,21,246,28,274,37,292,50,303,70,309,97,310,127,310,127,61,126,39,123,25,115,16,101,12,80,9,80,0,226,0,226,9,205,11,192,16,183,23,179,36,178,55,178,310,208,310,235,309,254,303,268,292,277,274,284,246,352,329,345,332,338,334,332,335,320,335,289,330,259,315,232,290,211,258,198,218,196,218,186,260,169,293,146,318,117,332,81,337,67,336,53,332,39,327,26,319,15,311,18,303,25,305,33,308,41,310,49,311,55,312,84,306,109,289,130,257,146,211,157,147,
+293,331,12,331,70,309,293,331,70,309,97,310,293,331,97,310,127,310,293,331,127,310,178,310,293,331,178,310,208,310,293,331,208,310,235,309,293,331,235,309,254,303,293,331,254,303,268,292,293,331,268,292,277,274,293,331,277,274,284,246,293,331,284,246,296,246,192,16,183,23,127,61,127,61,183,23,179,36,127,61,179,36,127,310,127,310,179,36,178,55,127,310,178,55,178,310,12,331,8,246,21,246,12,331,21,246,28,274,12,331,28,274,37,292,12,331,37,292,50,303,12,331,50,303,70,309,226,0,226,9,205,11,226,0,205,11,192,16,226,0,192,16,126,39,226,0,126,39,123,25,226,0,123,25,115,16,226,0,115,16,101,12,226,0,101,12,80,9,226,0,80,9,80,0,126,39,192,16,127,61,
+352,329,345,332,338,334,332,335,320,335,289,330,259,315,232,290,211,258,198,218,196,218,186,260,169,293,146,318,117,332,81,337,67,336,53,332,39,327,26,319,15,311,18,303,25,305,33,308,41,310,49,311,55,312,84,306,109,289,130,257,146,211,157,147,157,61,156,39,153,25,144,16,130,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,152,215,204,233,251,261,288,296,313,335,322,342,322,348,320,352,320,216,290,217,301,221,310,230,316,245,320,267,321,267,331,114,331,114,321,136,320,151,317,160,311,164,302,165,290,165,280,122,276,82,263,49,241,26,209,17,165,23,128,39,97,67,72,106,57,156,51,165,51,165,42,163,29,157,20,146,14,132,10,114,9,114,0,267,0,267,9,248,11,234,15,224,20,218,29,216,43,216,51,228,51,264,56,300,69,332,91,355,123,364,165,355,209,332,241,298,263,258,276,216,280,16383,16383,215,262,250,256,
+18,303,25,305,26,319,26,319,25,305,33,308,26,319,33,308,39,327,39,327,33,308,41,310,39,327,41,310,53,332,53,332,41,310,49,311,53,332,49,311,55,312,55,312,84,306,67,336,67,336,84,306,81,337,67,336,53,332,55,312,198,218,196,218,210,36,198,218,210,36,209,55,198,218,209,55,209,152,198,218,209,152,211,258,332,335,326,335,335,322,335,322,326,335,320,335,335,322,320,335,296,313,296,313,320,335,289,330,296,313,289,330,261,288,261,288,289,330,259,315,261,288,259,315,233,251,233,251,259,315,232,290,233,251,232,290,215,204,215,204,232,290,211,258,215,204,211,258,209,152,338,334,335,322,339,322,338,334,339,322,345,332,345,332,339,322,342,322,345,332,342,322,345,321,348,320,352,320,352,329,348,320,352,329,345,321,345,321,352,329,345,332,260,0,260,9,239,11,260,0,239,11,224,15,260,0,224,15,156,39,260,0,156,39,153,25,260,0,153,25,144,16,260,0,144,16,130,12,260,0,130,12,107,9,260,0,107,9,107,0,169,293,157,147,210,36,169,293,210,36,186,260,186,260,210,36,196,218,156,39,224,15,157,61,157,61,224,15,215,23,157,61,215,23,157,147,157,147,215,23,210,36,84,306,109,289,117,332,117,332,109,289,130,257,117,332,130,257,146,318,146,318,130,257,146,211,146,318,146,211,169,293,169,293,146,211,157,147,81,337,84,306,117,332,335,322,338,334,332,335,18,303,26,319,15,311,
+216,290,217,301,221,310,230,316,245,320,267,321,267,331,114,331,114,321,136,320,151,317,160,311,164,302,165,290,165,280,122,276,82,263,49,241,26,209,17,165,23,128,39,97,67,72,106,57,156,51,165,51,165,42,163,29,157,20,146,14,132,10,114,9,114,0,267,0,267,9,248,11,234,15,224,20,218,29,216,43,216,51,228,51,264,56,300,69,332,91,355,123,364,165,355,209,332,241,298,263,258,276,216,280,16383,16383,215,262,250,256,276,240,295,216,306,188,310,159,304,128,290,103,268,85,243,74,215,70,16383,16383,166,70,133,75,107,88,88,107,76,132,72,159,76,189,89,216,109,240,135,256,166,262,352,0,352,9,338,12,327,16,317,22,307,32,296,46,200,184,272,272,289,292,303,305,316,314,331,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,263,301,260,296,257,290,251,282,243,272,188,202,166,234,151,255,139,272,131,286,126,297,124,306,125,312,128,316,133,319,139,320,147,321,161,321,161,331,11,331,11,321,29,319,44,312,59,299,78,276,103,242,156,164,78,66,58,42,43,26,31,17,19,12,5,9,5,0,121,0,121,9,106,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,100,57,109,70,169,145,217,74,226,60,233,48,238,38,241,31,242,25,241,20,
+267,321,267,321,245,320,245,320,267,321,267,331,245,320,267,331,230,316,230,316,267,331,164,302,230,316,164,302,165,290,166,262,165,290,165,280,166,262,165,280,135,256,135,256,165,280,122,276,135,256,122,276,109,240,109,240,122,276,89,216,216,43,215,70,166,262,166,262,215,70,215,262,166,262,215,262,216,290,216,290,215,262,216,280,166,262,216,290,217,301,166,262,217,301,221,310,166,262,218,29,216,43,165,290,166,262,221,310,165,290,221,310,230,316,267,331,114,331,136,320,267,331,136,320,151,317,267,331,151,317,160,311,267,331,160,311,164,302,82,263,49,241,72,159,82,263,72,159,76,189,82,263,76,189,89,216,82,263,89,216,122,276,17,165,23,128,26,209,26,209,23,128,39,97,26,209,39,97,49,241,49,241,39,97,67,72,49,241,67,72,72,159,332,91,310,159,304,128,332,91,304,128,300,69,300,69,304,128,290,103,300,69,290,103,268,85,306,188,310,159,332,241,332,241,310,159,332,91,332,241,332,91,355,209,355,209,332,91,355,123,355,209,355,123,364,165,298,263,258,276,276,240,298,263,276,240,295,216,298,263,295,216,306,188,298,263,306,188,332,241,250,256,276,240,258,276,250,256,258,276,216,280,250,256,216,280,215,262,216,51,228,51,243,74,243,74,228,51,264,56,243,74,264,56,268,85,268,85,264,56,300,69,216,43,216,51,215,70,215,70,216,51,243,74,267,0,267,9,248,11,267,0,248,11,234,15,267,0,234,15,165,42,267,0,165,42,163,29,267,0,163,29,157,20,267,0,157,20,146,14,267,0,146,14,132,10,267,0,132,10,114,9,267,0,114,9,114,0,166,70,133,75,156,51,166,70,156,51,165,51,166,70,165,51,224,20,166,70,224,20,218,29,166,70,218,29,166,262,165,51,165,42,234,15,165,51,234,15,224,20,107,88,88,107,106,57,107,88,106,57,156,51,107,88,156,51,133,75,76,132,72,159,67,72,76,132,67,72,106,57,76,132,106,57,88,107,136,320,114,331,114,321,
+352,0,352,9,338,12,327,16,317,22,307,32,296,46,200,184,272,272,289,292,303,305,316,314,331,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,263,301,260,296,257,290,251,282,243,272,188,202,166,234,151,255,139,272,131,286,126,297,124,306,125,312,128,316,133,319,139,320,147,321,161,321,161,331,11,331,11,321,29,319,44,312,59,299,78,276,103,242,156,164,78,66,58,42,43,26,31,17,19,12,5,9,5,0,121,0,121,9,106,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,100,57,109,70,169,145,217,74,226,60,233,48,238,38,241,31,242,25,241,20,238,16,233,14,226,12,217,11,204,9,204,0,362,345,332,341,310,328,295,309,287,284,285,254,283,226,278,198,267,175,248,159,218,153,212,153,212,281,214,299,221,311,232,318,246,321,263,321,263,331,110,331,110,321,128,321,142,317,152,310,159,299,161,281,161,153,156,153,125,159,106,175,95,198,90,226,89,254,86,284,78,309,64,328,42,341,11,345,11,335,21,330,28,320,32,308,34,295,35,283,34,274,34,265,33,256,33,247,32,238,39,199,59,170,87,150,122,139,161,135,161,62,160,40,156,25,147,16,132,12,110,9,110,0,263,0,263,9,244,11,229,14,220,22,214,35,212,55,212,135,251,139,286,150,314,170,333,199,340,238,340,256,339,265,339,295,341,308,345,320,352,330,362,335,358,0,
+31,17,121,0,43,26,43,26,121,0,88,17,43,26,88,17,58,42,58,42,88,17,84,21,58,42,84,21,83,26,83,26,84,31,78,66,78,66,84,31,87,38,78,66,87,38,156,164,156,164,87,38,92,46,156,164,92,46,100,57,103,242,156,164,126,297,103,242,126,297,124,306,124,306,125,312,103,242,156,164,100,57,109,70,109,70,169,145,156,164,156,164,169,145,166,234,156,164,166,234,151,255,78,66,58,42,83,26,103,242,125,312,78,276,78,276,125,312,128,316,78,276,128,316,59,299,59,299,128,316,133,319,59,299,133,319,161,331,161,331,133,319,139,320,161,331,139,320,147,321,147,321,161,321,161,331,161,331,11,331,29,319,161,331,29,319,44,312,161,331,44,312,59,299,260,296,257,290,272,272,272,272,257,290,251,282,272,272,251,282,243,272,243,272,188,202,200,184,200,184,188,202,217,74,200,184,217,74,296,46,296,46,217,74,226,60,296,46,226,60,233,48,348,331,229,331,243,320,348,331,243,320,253,319,348,331,253,319,259,316,348,331,259,316,262,311,348,331,262,311,263,305,348,331,263,305,316,314,348,331,316,314,331,319,348,331,331,319,348,321,263,305,272,272,289,292,263,305,289,292,303,305,263,305,303,305,316,314,263,301,260,296,272,272,263,301,272,272,263,305,243,272,200,184,272,272,238,16,233,14,352,0,352,0,233,14,226,12,352,0,226,12,217,11,242,25,352,0,327,16,242,25,327,16,317,22,242,25,317,22,307,32,242,25,307,32,296,46,242,25,296,46,241,31,296,46,233,48,238,38,296,46,238,38,241,31,188,202,166,234,169,145,188,202,169,145,217,74,338,12,327,16,352,0,338,12,352,0,352,9,241,20,238,16,352,0,241,20,352,0,242,25,204,9,204,0,352,0,204,9,352,0,217,11,156,164,151,255,139,272,156,164,139,272,131,286,156,164,131,286,126,297,121,0,121,9,106,11,121,0,106,11,95,13,121,0,95,13,88,17,19,12,5,9,121,0,19,12,121,0,31,17,121,0,5,9,5,0,243,320,229,331,229,321,29,319,11,331,11,321,
+362,345,332,341,310,328,295,309,287,284,285,254,283,226,278,198,267,175,248,159,218,153,212,153,212,281,214,299,221,311,232,318,246,321,263,321,263,331,110,331,110,321,128,321,142,317,152,310,159,299,161,281,161,153,156,153,125,159,106,175,95,198,90,226,89,254,86,284,78,309,64,328,42,341,11,345,11,335,21,330,28,320,32,308,34,295,35,283,34,274,34,265,33,256,33,247,32,238,39,199,59,170,87,150,122,139,161,135,161,62,160,40,156,25,147,16,132,12,110,9,110,0,263,0,263,9,244,11,229,14,220,22,214,35,212,55,212,135,251,139,286,150,314,170,333,199,340,238,340,256,339,265,339,295,341,308,345,320,352,330,362,335,358,0,358,84,345,84,343,71,339,61,333,53,325,49,314,47,237,47,238,66,275,80,305,100,327,126,341,159,345,199,338,242,318,280,285,310,241,331,186,338,130,330,86,309,53,277,33,239,26,199,31,159,44,126,65,100,95,80,132,66,133,47,58,47,46,48,38,52,32,59,28,70,27,85,15,85,15,0,158,0,153,80,129,93,110,114,96,140,87,170,84,200,88,235,100,268,120,295,149,313,186,320,222,314,250,298,271,273,284,239,289,200,285,168,276,138,261,112,242,92,218,80,214,0,158,411,157,419,153,426,148,432,141,435,133,436,125,435,118,432,113,426,110,420,108,412,109,404,113,397,118,392,125,388,132,387,140,388,148,392,153,397,
+263,321,263,321,246,321,246,321,263,321,263,331,246,321,263,331,232,318,232,318,263,331,159,299,232,318,159,299,161,281,161,135,161,281,161,153,161,135,161,153,156,153,161,135,220,22,214,35,161,135,214,35,212,55,212,153,212,135,251,139,212,153,251,139,218,153,218,153,251,139,248,159,212,55,212,281,161,135,161,135,212,281,214,299,161,135,214,299,161,281,161,281,214,299,221,311,161,281,221,311,232,318,263,331,110,331,128,321,263,331,128,321,142,317,263,331,142,317,152,310,263,331,152,310,159,299,310,328,295,309,314,170,314,170,295,309,287,284,314,170,287,284,286,150,286,150,287,284,285,254,286,150,285,254,283,226,310,328,314,170,332,341,332,341,314,170,333,199,332,341,333,199,339,295,339,295,333,199,339,283,339,274,339,283,333,199,339,274,333,199,340,238,352,330,362,335,362,345,352,330,362,345,345,320,345,320,362,345,332,341,345,320,332,341,341,308,341,308,332,341,339,295,248,159,251,139,267,175,267,175,251,139,286,150,267,175,286,150,278,198,278,198,286,150,283,226,340,238,340,247,340,256,340,238,340,256,339,265,340,238,339,265,339,274,263,0,263,9,244,11,263,0,244,11,229,14,263,0,229,14,160,40,263,0,160,40,156,25,263,0,156,25,147,16,263,0,147,16,132,12,263,0,132,12,110,9,263,0,110,9,110,0,161,62,160,40,229,14,161,62,229,14,220,22,161,62,220,22,161,135,125,159,106,175,122,139,125,159,122,139,161,135,125,159,161,135,156,153,90,226,89,254,87,150,90,226,87,150,95,198,95,198,87,150,122,139,95,198,122,139,106,175,87,150,89,254,86,284,87,150,86,284,78,309,87,150,78,309,64,328,87,150,64,328,59,170,42,341,11,345,21,330,42,341,21,330,28,320,42,341,28,320,32,308,42,341,32,308,34,295,42,341,34,295,35,283,42,341,35,283,39,199,42,341,39,199,59,170,42,341,59,170,64,328,39,199,35,283,34,274,39,199,34,274,34,265,39,199,34,265,33,256,39,199,33,256,33,247,39,199,33,247,32,238,21,330,11,345,11,335,128,321,110,331,110,321,
+358,0,358,84,345,84,343,71,339,61,333,53,325,49,314,47,237,47,238,66,275,80,305,100,327,126,341,159,345,199,338,242,318,280,285,310,241,331,186,338,130,330,86,309,53,277,33,239,26,199,31,159,44,126,65,100,95,80,132,66,133,47,58,47,46,48,38,52,32,59,28,70,27,85,15,85,15,0,158,0,153,80,129,93,110,114,96,140,87,170,84,200,88,235,100,268,120,295,149,313,186,320,222,314,250,298,271,273,284,239,289,200,285,168,276,138,261,112,242,92,218,80,214,0,158,411,157,419,153,426,148,432,141,435,133,436,125,435,118,432,113,426,110,420,108,412,109,404,113,397,118,392,125,388,132,387,140,388,148,392,153,397,157,404,158,411,16383,16383,59,411,57,419,54,426,48,432,41,435,33,436,26,435,19,432,14,426,10,420,9,412,10,404,14,397,19,392,25,388,33,387,41,388,48,392,54,397,57,404,59,411,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,
+58,47,46,48,158,0,158,0,46,48,38,52,158,0,38,52,15,0,15,0,38,52,32,59,15,0,32,59,15,85,15,85,32,59,28,70,15,85,28,70,27,85,26,199,31,159,33,239,33,239,31,159,44,126,33,239,44,126,53,277,53,277,44,126,65,100,53,277,65,100,86,309,86,309,65,100,84,200,95,80,84,200,65,100,186,338,149,313,186,320,186,320,222,314,241,331,241,331,222,314,250,298,241,331,250,298,285,310,285,310,250,298,271,273,285,310,271,273,284,239,289,200,305,100,318,280,318,280,305,100,327,126,318,280,327,126,338,242,338,242,327,126,341,159,338,242,341,159,345,199,285,310,284,239,289,200,285,310,289,200,318,280,241,331,186,338,186,320,261,112,275,80,276,138,276,138,275,80,305,100,276,138,305,100,285,168,285,168,305,100,289,200,214,0,237,47,218,80,218,80,237,47,238,66,218,80,238,66,242,92,242,92,238,66,275,80,242,92,275,80,261,112,339,61,333,53,358,0,358,0,333,53,325,49,358,0,325,49,314,47,358,0,358,84,345,84,358,0,345,84,343,71,358,0,343,71,339,61,237,47,214,0,358,0,237,47,358,0,314,47,130,330,86,309,100,268,130,330,100,268,120,295,130,330,120,295,149,313,130,330,149,313,186,338,86,309,84,200,88,235,86,309,88,235,100,268,132,66,133,47,153,80,132,66,153,80,129,93,132,66,129,93,110,114,132,66,110,114,96,140,132,66,96,140,95,80,87,170,84,200,95,80,87,170,95,80,96,140,133,47,58,47,158,0,133,47,158,0,153,80,
+158,411,157,419,153,426,148,432,141,435,133,436,125,435,118,432,113,426,110,420,108,412,109,404,113,397,118,392,125,388,132,387,140,388,148,392,153,397,157,404,158,411,16383,16383,59,411,57,419,54,426,48,432,41,435,33,436,26,435,19,432,14,426,10,420,9,412,10,404,14,397,19,392,25,388,33,387,41,388,48,392,54,397,57,404,59,411,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,257,411,256,419,252,426,247,432,240,435,233,436,225,435,218,432,213,426,209,420,208,412,209,404,213,397,218,392,225,388,232,387,240,388,247,392,252,397,256,404,257,411,16383,16383,158,411,157,419,153,426,148,432,141,435,133,436,125,435,118,432,113,426,110,420,108,412,109,404,113,397,118,392,125,388,132,387,140,388,148,392,153,397,157,404,158,411,16383,16383,352,329,345,332,338,334,332,335,320,335,289,330,259,315,232,290,211,258,198,218,196,218,186,260,169,293,146,318,117,332,81,337,67,336,53,332,39,327,26,319,15,311,18,303,25,305,33,308,41,310,49,311,55,312,
+9,412,10,404,10,420,10,420,10,404,14,397,10,420,14,397,14,426,14,426,14,397,19,392,14,426,19,392,19,432,19,432,19,392,25,388,19,432,25,388,26,435,26,435,25,388,33,387,26,435,33,387,33,436,33,436,33,387,41,388,33,436,41,388,41,435,41,435,41,388,48,392,41,435,48,392,48,432,48,432,48,392,54,397,48,432,54,397,54,426,54,426,54,397,57,404,54,426,57,404,57,419,57,419,57,404,59,411,52,23,44,15,157,0,157,0,44,15,30,11,157,0,30,11,9,9,157,331,9,331,30,320,157,331,30,320,44,316,157,331,44,316,53,308,157,331,53,308,57,295,157,331,57,295,122,316,157,331,122,316,136,320,157,331,136,320,157,321,122,16,114,24,57,56,57,56,114,24,109,37,57,56,109,37,57,276,57,276,109,37,108,56,57,276,108,56,108,276,57,276,108,276,109,295,57,276,109,295,113,308,57,276,113,308,122,316,57,276,122,316,57,295,108,412,109,404,110,420,110,420,109,404,113,397,110,420,113,397,113,426,113,426,113,397,118,392,113,426,118,392,118,432,118,432,118,392,125,388,118,432,125,388,125,435,125,435,125,388,132,387,125,435,132,387,133,436,133,436,132,387,140,388,133,436,140,388,141,435,141,435,140,388,148,392,141,435,148,392,148,432,148,432,148,392,153,397,148,432,153,397,153,426,153,426,153,397,157,404,153,426,157,404,157,419,157,419,157,404,158,411,157,0,157,9,137,11,157,0,137,11,122,16,157,0,122,16,56,36,157,0,56,36,52,23,157,0,9,9,9,0,56,36,122,16,57,56,30,320,9,331,9,321,
+257,411,256,419,252,426,247,432,240,435,233,436,225,435,218,432,213,426,209,420,208,412,209,404,213,397,218,392,225,388,232,387,240,388,247,392,252,397,256,404,257,411,16383,16383,158,411,157,419,153,426,148,432,141,435,133,436,125,435,118,432,113,426,110,420,108,412,109,404,113,397,118,392,125,388,132,387,140,388,148,392,153,397,157,404,158,411,16383,16383,352,329,345,332,338,334,332,335,320,335,289,330,259,315,232,290,211,258,198,218,196,218,186,260,169,293,146,318,117,332,81,337,67,336,53,332,39,327,26,319,15,311,18,303,25,305,33,308,41,310,49,311,55,312,84,306,109,289,130,257,146,211,157,147,157,61,156,39,153,25,144,16,130,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,152,215,204,233,251,261,288,296,313,335,322,342,322,348,320,352,320,108,253,126,253,158,294,163,299,167,304,169,309,171,313,172,316,171,322,168,326,165,329,157,331,151,330,147,329,143,327,140,324,138,320,16383,16383,257,65,255,50,252,39,248,32,245,27,241,26,232,31,223,43,216,60,210,78,206,94,261,225,212,225,190,157,182,178,171,198,156,215,137,226,113,230,79,224,52,207,31,181,19,148,15,112,19,73,32,41,52,16,78,1,108,-4,129,-1,147,5,162,17,174,32,185,50,190,32,196,17,204,5,213,-1,225,-4,239,0,250,8,258,24,263,43,265,65,16383,16383,166,104,162,84,155,59,145,35,131,16,113,9,90,19,75,43,66,76,61,109,60,137,63,167,70,189,81,204,95,213,110,216,129,208,144,187,154,159,161,130,166,104,76,253,94,253,127,294,135,304,138,309,139,313,140,316,139,322,137,326,133,329,125,331,119,330,115,329,111,327,108,324,
+18,303,25,305,26,319,26,319,25,305,33,308,26,319,33,308,39,327,39,327,33,308,41,310,39,327,41,310,53,332,53,332,41,310,49,311,53,332,49,311,55,312,55,312,84,306,67,336,67,336,84,306,81,337,67,336,53,332,55,312,198,218,196,218,210,36,198,218,210,36,209,55,198,218,209,55,209,152,198,218,209,152,211,258,260,0,260,9,239,11,260,0,239,11,224,15,260,0,224,15,156,39,260,0,156,39,153,25,260,0,153,25,144,16,260,0,144,16,130,12,260,0,130,12,107,9,260,0,107,9,107,0,169,293,157,147,210,36,169,293,210,36,186,260,186,260,210,36,196,218,156,39,224,15,157,61,157,61,224,15,215,23,157,61,215,23,157,147,157,147,215,23,210,36,332,335,326,335,335,322,335,322,326,335,320,335,335,322,320,335,296,313,296,313,320,335,289,330,296,313,289,330,261,288,261,288,289,330,259,315,261,288,259,315,233,251,233,251,259,315,232,290,233,251,232,290,215,204,215,204,232,290,211,258,215,204,211,258,209,152,338,334,335,322,339,322,338,334,339,322,345,332,345,332,339,322,342,322,345,332,342,322,345,321,348,320,352,320,352,329,348,320,352,329,345,321,345,321,352,329,345,332,208,412,209,404,209,420,209,420,209,404,213,397,209,420,213,397,213,426,213,426,213,397,218,392,213,426,218,392,218,432,218,432,218,392,225,388,218,432,225,388,225,435,225,435,225,388,232,387,225,435,232,387,233,436,233,436,232,387,240,388,233,436,240,388,240,435,240,435,240,388,247,392,240,435,247,392,247,432,247,432,247,392,252,397,247,432,252,397,252,426,252,426,252,397,256,404,252,426,256,404,256,419,256,419,256,404,257,411,108,412,109,404,110,420,110,420,109,404,113,397,110,420,113,397,113,426,113,426,113,397,118,392,113,426,118,392,118,432,118,432,118,392,125,388,118,432,125,388,125,435,125,435,125,388,132,387,125,435,132,387,133,436,133,436,132,387,140,388,133,436,140,388,141,435,141,435,140,388,148,392,141,435,148,392,148,432,148,432,148,392,153,397,148,432,153,397,153,426,153,426,153,397,157,404,153,426,157,404,157,419,157,419,157,404,158,411,84,306,109,289,117,332,117,332,109,289,130,257,117,332,130,257,146,318,146,318,130,257,146,211,146,318,146,211,169,293,169,293,146,211,157,147,81,337,84,306,117,332,335,322,338,334,332,335,18,303,26,319,15,311,
+108,253,126,253,158,294,163,299,167,304,169,309,171,313,172,316,171,322,168,326,165,329,157,331,151,330,147,329,143,327,140,324,138,320,16383,16383,257,65,255,50,252,39,248,32,245,27,241,26,232,31,223,43,216,60,210,78,206,94,261,225,212,225,190,157,182,178,171,198,156,215,137,226,113,230,79,224,52,207,31,181,19,148,15,112,19,73,32,41,52,16,78,1,108,-4,129,-1,147,5,162,17,174,32,185,50,190,32,196,17,204,5,213,-1,225,-4,239,0,250,8,258,24,263,43,265,65,16383,16383,166,104,162,84,155,59,145,35,131,16,113,9,90,19,75,43,66,76,61,109,60,137,63,167,70,189,81,204,95,213,110,216,129,208,144,187,154,159,161,130,166,104,76,253,94,253,127,294,135,304,138,309,139,313,140,316,139,322,137,326,133,329,125,331,119,330,115,329,111,327,108,324,106,320,16383,16383,196,73,182,54,166,39,149,29,131,22,110,20,95,22,80,27,69,36,60,49,57,65,61,81,70,94,83,102,97,107,111,108,117,108,125,106,128,106,133,105,142,106,148,108,153,111,156,115,157,118,156,122,154,124,150,127,145,128,138,129,131,128,121,126,115,125,108,124,92,127,80,133,72,142,67,154,65,167,67,182,74,195,83,206,96,213,112,215,127,215,140,212,148,208,154,203,156,195,155,193,155,190,154,187,154,183,153,179,155,171,158,166,163,161,168,158,175,157,182,158,188,161,194,165,198,171,199,179,194,199,181,214,163,223,
+63,167,70,189,79,224,79,224,70,189,81,204,79,224,81,204,113,230,113,230,81,204,95,213,113,230,95,213,110,216,110,216,129,208,113,230,113,230,129,208,137,226,157,331,158,294,161,330,161,330,158,294,163,299,161,330,163,299,165,329,165,329,163,299,167,304,165,329,167,304,168,326,168,326,167,304,169,309,168,326,169,309,171,322,171,322,169,309,171,313,171,322,171,313,172,316,158,294,157,331,151,330,158,294,151,330,147,329,158,294,147,329,143,327,158,294,143,327,140,324,158,294,140,324,138,320,158,294,138,320,126,253,144,187,154,159,156,215,156,215,154,159,161,130,156,215,161,130,171,198,171,198,161,130,166,104,171,198,166,104,174,32,171,198,174,32,182,178,182,178,174,32,185,50,182,178,185,50,190,157,190,157,185,50,190,32,190,157,190,32,212,225,212,225,190,32,196,17,212,225,196,17,206,94,206,94,196,17,204,5,206,94,204,5,213,-1,137,226,129,208,144,187,137,226,144,187,156,215,174,32,166,104,162,84,174,32,162,84,162,17,162,17,162,84,155,59,162,17,155,59,147,5,147,5,155,59,145,35,147,5,145,35,131,16,78,1,108,-4,90,19,90,19,108,-4,113,9,131,16,113,9,129,-1,131,16,129,-1,147,5,210,78,206,94,213,-1,212,225,206,94,261,225,252,39,248,32,250,8,250,8,248,32,245,27,250,8,245,27,241,26,241,26,232,31,239,0,239,0,232,31,225,-4,210,78,213,-1,216,60,216,60,213,-1,225,-4,216,60,225,-4,223,43,223,43,225,-4,232,31,258,24,263,43,265,65,258,24,265,65,257,65,258,24,257,65,255,50,258,24,255,50,252,39,258,24,252,39,250,8,241,26,239,0,250,8,113,9,108,-4,129,-1,90,19,75,43,78,1,78,1,75,43,66,76,78,1,66,76,52,16,52,16,66,76,61,109,52,16,61,109,60,137,60,137,63,167,52,207,52,207,63,167,79,224,52,16,60,137,52,207,52,16,52,207,32,41,32,41,52,207,31,181,32,41,31,181,19,73,19,73,31,181,19,148,19,73,19,148,15,112,126,253,138,320,108,253,
+76,253,94,253,127,294,135,304,138,309,139,313,140,316,139,322,137,326,133,329,125,331,119,330,115,329,111,327,108,324,106,320,16383,16383,196,73,182,54,166,39,149,29,131,22,110,20,95,22,80,27,69,36,60,49,57,65,61,81,70,94,83,102,97,107,111,108,117,108,125,106,128,106,133,105,142,106,148,108,153,111,156,115,157,118,156,122,154,124,150,127,145,128,138,129,131,128,121,126,115,125,108,124,92,127,80,133,72,142,67,154,65,167,67,182,74,195,83,206,96,213,112,215,127,215,140,212,148,208,154,203,156,195,155,193,155,190,154,187,154,183,153,179,155,171,158,166,163,161,168,158,175,157,182,158,188,161,194,165,198,171,199,179,194,199,181,214,163,223,142,228,121,230,87,226,60,217,40,202,28,184,24,165,26,152,31,141,39,131,49,123,63,118,47,113,33,103,22,91,15,77,12,61,14,46,21,29,37,13,65,0,108,-4,130,-1,151,6,171,20,189,40,204,68,84,253,101,253,134,294,142,304,145,309,147,313,147,316,146,322,144,326,140,329,132,331,122,329,119,327,116,324,113,320,16383,16383,226,-107,223,-101,221,-94,219,-86,218,-76,218,160,216,182,208,202,196,217,180,226,159,230,145,229,131,224,117,216,102,205,87,190,86,190,84,205,81,215,76,223,68,226,56,228,44,225,33,216,22,203,13,188,5,172,12,170,15,176,25,188,30,193,36,194,39,193,41,190,44,184,45,173,46,156,46,0,88,0,88,174,100,185,111,194,120,199,130,202,140,203,153,201,163,195,170,185,174,172,176,154,176,-79,177,-89,179,-97,181,-103,184,-107,40,253,57,253,90,294,98,304,101,309,103,313,103,316,102,322,100,326,96,329,93,330,89,331,83,330,78,329,75,327,72,324,70,320,16383,16383,126,54,120,43,115,36,110,31,105,29,99,28,95,29,91,33,90,36,89,40,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,37,196,42,193,45,188,
+37,13,65,0,47,113,47,113,65,0,57,65,63,118,57,65,61,81,63,118,61,81,70,94,72,142,67,154,70,94,70,94,67,154,65,167,63,118,65,167,60,217,63,118,60,217,49,123,49,123,60,217,40,202,49,123,40,202,39,131,39,131,40,202,31,141,142,228,121,230,127,215,127,215,121,230,112,215,96,213,112,215,121,230,96,213,121,230,87,226,125,331,127,294,129,330,129,330,127,294,131,299,129,330,131,299,133,329,133,329,131,299,135,304,133,329,135,304,137,326,137,326,135,304,138,309,137,326,138,309,139,322,139,322,138,309,139,313,139,322,139,313,140,316,127,294,125,331,119,330,127,294,119,330,115,329,127,294,115,329,111,327,127,294,111,327,108,324,127,294,108,324,106,320,127,294,106,320,94,253,194,199,181,214,182,158,194,199,182,158,188,161,194,199,188,161,194,165,194,199,194,165,198,171,194,199,198,171,199,179,158,166,163,161,163,223,163,223,163,161,168,158,163,223,168,158,181,214,181,214,168,158,175,157,181,214,175,157,182,158,127,215,140,212,142,228,142,228,140,212,148,208,142,228,148,208,163,223,163,223,148,208,154,203,163,223,154,203,156,195,156,195,158,166,163,223,156,195,155,193,158,166,158,166,155,193,155,190,158,166,155,190,155,171,155,171,155,190,154,187,155,171,154,187,154,183,87,226,60,217,67,182,87,226,67,182,74,195,87,226,74,195,83,206,87,226,83,206,96,213,67,182,60,217,65,167,28,184,24,165,26,152,28,184,26,152,31,141,28,184,31,141,40,202,83,102,97,107,92,127,92,127,97,107,108,124,115,125,108,124,111,108,83,102,92,127,80,133,83,102,80,133,72,142,83,102,72,142,70,94,63,118,70,94,65,167,111,108,108,124,97,107,117,108,121,107,121,126,121,126,121,107,125,106,121,126,125,106,126,127,126,127,125,106,128,106,126,127,128,106,131,128,131,128,128,106,133,105,131,128,133,105,138,129,138,129,133,105,142,106,138,129,142,106,145,128,145,128,142,106,148,108,145,128,148,108,150,127,150,127,148,108,153,111,150,127,153,111,154,124,154,124,153,111,156,115,154,124,156,115,156,122,156,122,156,115,157,118,115,125,111,108,117,108,115,125,117,108,121,126,80,27,108,-4,95,22,95,22,108,-4,110,20,131,22,110,20,130,-1,131,22,130,-1,151,6,69,36,60,49,65,0,69,36,65,0,108,-4,69,36,108,-4,80,27,57,65,65,0,60,49,12,61,14,46,15,77,15,77,14,46,21,29,15,77,21,29,22,91,22,91,21,29,37,13,22,91,37,13,33,103,33,103,37,13,47,113,204,68,196,73,189,40,189,40,196,73,182,54,189,40,182,54,171,20,171,20,182,54,166,39,171,20,166,39,151,6,151,6,166,39,149,29,151,6,149,29,131,22,110,20,108,-4,130,-1,47,113,57,65,63,118,155,171,154,183,153,179,94,253,106,320,76,253,
+84,253,101,253,134,294,142,304,145,309,147,313,147,316,146,322,144,326,140,329,132,331,122,329,119,327,116,324,113,320,16383,16383,226,-107,223,-101,221,-94,219,-86,218,-76,218,160,216,182,208,202,196,217,180,226,159,230,145,229,131,224,117,216,102,205,87,190,86,190,84,205,81,215,76,223,68,226,56,228,44,225,33,216,22,203,13,188,5,172,12,170,15,176,25,188,30,193,36,194,39,193,41,190,44,184,45,173,46,156,46,0,88,0,88,174,100,185,111,194,120,199,130,202,140,203,153,201,163,195,170,185,174,172,176,154,176,-79,177,-89,179,-97,181,-103,184,-107,40,253,57,253,90,294,98,304,101,309,103,313,103,316,102,322,100,326,96,329,93,330,89,331,83,330,78,329,75,327,72,324,70,320,16383,16383,126,54,120,43,115,36,110,31,105,29,99,28,95,29,91,33,90,36,89,40,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,37,196,42,193,45,188,47,181,47,39,48,26,51,14,57,4,65,-2,77,-4,92,-1,105,7,116,20,126,35,133,50,202,278,201,286,197,293,192,298,185,302,177,303,169,302,163,298,157,293,154,286,152,278,154,271,157,264,163,258,169,255,177,253,185,255,192,258,197,264,
+15,176,20,182,22,203,22,203,20,182,25,188,22,203,25,188,33,216,33,216,25,188,30,193,33,216,30,193,36,194,36,194,39,193,44,225,44,225,39,193,41,190,44,225,41,190,44,184,13,188,5,172,12,170,13,188,12,170,15,176,13,188,15,176,22,203,87,190,86,190,88,0,87,190,88,0,88,174,87,190,88,174,102,205,88,174,100,185,102,205,102,205,100,185,111,194,102,205,111,194,117,216,117,216,111,194,120,199,117,216,120,199,131,224,131,224,120,199,130,202,131,224,130,202,140,203,140,203,153,201,145,229,145,229,153,201,159,230,88,0,86,190,84,205,88,0,84,205,81,215,88,0,81,215,76,223,88,0,76,223,68,226,88,0,68,226,56,228,88,0,56,228,46,156,88,0,46,156,46,0,145,229,131,224,140,203,218,-65,218,160,216,182,218,-65,216,182,208,202,218,-65,208,202,218,-76,196,217,180,226,181,-103,196,217,181,-103,184,-107,196,217,184,-107,218,-76,196,217,218,-76,208,202,184,-107,226,-107,223,-101,184,-107,223,-101,221,-94,184,-107,221,-94,219,-86,184,-107,219,-86,218,-76,180,226,159,230,163,195,180,226,163,195,170,185,180,226,170,185,174,172,180,226,174,172,176,154,180,226,176,154,176,-79,180,226,176,-79,177,-89,180,226,177,-89,179,-97,180,226,179,-97,181,-103,176,154,176,-64,176,-79,132,331,134,294,136,330,136,330,134,294,138,299,136,330,138,299,140,329,140,329,138,299,142,304,140,329,142,304,144,326,144,326,142,304,145,309,144,326,145,309,146,322,146,322,145,309,147,313,146,322,147,313,147,316,134,294,132,331,127,330,134,294,127,330,122,329,134,294,122,329,119,327,134,294,119,327,116,324,134,294,116,324,113,320,134,294,113,320,101,253,45,173,46,156,56,228,45,173,56,228,44,225,45,173,44,225,44,184,44,225,33,216,36,194,101,253,113,320,84,253,159,230,153,201,163,195,
+40,253,57,253,90,294,98,304,101,309,103,313,103,316,102,322,100,326,96,329,93,330,89,331,83,330,78,329,75,327,72,324,70,320,16383,16383,126,54,120,43,115,36,110,31,105,29,99,28,95,29,91,33,90,36,89,40,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,37,196,42,193,45,188,47,181,47,39,48,26,51,14,57,4,65,-2,77,-4,92,-1,105,7,116,20,126,35,133,50,202,278,201,286,197,293,192,298,185,302,177,303,169,302,163,298,157,293,154,286,152,278,154,271,157,264,163,258,169,255,177,253,185,255,192,258,197,264,201,271,202,278,16383,16383,100,253,118,253,151,294,159,304,162,309,163,313,164,316,163,322,161,326,157,329,149,331,143,330,139,329,135,327,132,324,130,320,16383,16383,103,278,101,286,98,293,92,298,85,302,78,303,70,302,63,298,58,293,54,286,53,278,54,271,58,264,
+89,331,90,294,93,330,93,330,90,294,94,299,93,330,94,299,96,329,96,329,94,299,98,304,96,329,98,304,100,326,100,326,98,304,101,309,100,326,101,309,102,322,102,322,101,309,103,313,102,322,103,313,103,316,90,294,89,331,83,330,90,294,83,330,78,329,90,294,78,329,75,327,90,294,75,327,72,324,90,294,72,324,70,320,90,294,70,320,57,253,45,188,57,219,42,193,42,193,57,219,41,214,42,193,41,214,37,196,37,196,41,214,31,196,28,196,31,196,41,214,28,196,41,214,26,208,57,4,65,-2,72,224,72,224,65,-2,77,-4,72,224,77,-4,88,230,88,230,77,-4,89,40,88,230,89,40,89,228,91,33,92,-1,93,31,93,31,92,-1,105,7,93,31,105,7,95,29,95,29,105,7,99,28,105,29,99,28,105,7,105,29,105,7,116,20,133,50,126,54,126,35,126,35,126,54,120,43,126,35,120,43,116,20,116,20,120,43,115,36,116,20,115,36,110,31,92,-1,91,33,90,36,92,-1,90,36,89,40,92,-1,89,40,77,-4,57,219,45,188,47,181,57,219,47,181,47,172,57,219,47,172,48,26,57,219,48,26,51,14,57,219,51,14,57,4,57,219,57,4,72,224,47,172,47,39,48,26,26,208,10,204,15,196,26,208,15,196,20,196,26,208,20,196,24,196,26,208,24,196,28,196,15,196,10,204,10,195,105,29,116,20,110,31,57,253,70,320,40,253,
+202,278,201,286,197,293,192,298,185,302,177,303,169,302,163,298,157,293,154,286,152,278,154,271,157,264,163,258,169,255,177,253,185,255,192,258,197,264,201,271,202,278,16383,16383,100,253,118,253,151,294,159,304,162,309,163,313,164,316,163,322,161,326,157,329,149,331,143,330,139,329,135,327,132,324,130,320,16383,16383,103,278,101,286,98,293,92,298,85,302,78,303,70,302,63,298,58,293,54,286,53,278,54,271,58,264,63,258,70,255,78,253,85,255,92,258,98,264,101,271,103,278,16383,16383,127,230,127,220,139,218,149,214,159,209,168,201,177,191,186,176,193,159,198,141,201,122,202,104,200,75,193,49,182,28,165,14,142,9,121,14,106,28,97,47,92,68,91,87,91,193,90,205,86,215,80,222,71,226,60,228,47,225,36,216,26,203,16,188,8,172,15,170,18,176,28,188,33,193,39,194,43,192,46,187,48,180,49,170,49,99,51,66,60,38,76,15,102,0,139,-4,174,1,204,18,227,43,242,75,247,113,241,155,226,188,202,211,173,225,141,230,257,65,255,50,252,39,248,32,245,27,241,26,232,31,223,43,216,60,210,78,206,94,261,225,212,225,190,157,182,178,171,198,156,215,137,226,113,230,79,224,52,207,31,181,19,148,15,112,19,73,32,41,52,16,78,1,108,-4,129,-1,147,5,162,17,174,32,185,50,190,32,196,17,204,5,213,-1,225,-4,239,0,250,8,258,24,263,43,265,65,16383,16383,166,104,162,84,155,59,145,35,131,16,113,9,90,19,75,43,66,76,61,109,60,137,63,167,70,189,81,204,95,213,110,216,129,208,144,187,154,159,161,130,166,104,172,200,181,204,190,209,196,215,202,222,206,229,209,236,211,244,213,251,213,257,214,264,209,289,197,311,179,327,157,338,133,342,102,337,76,322,54,293,41,249,36,186,36,-67,34,-85,30,-101,27,-107,70,-107,72,-102,74,-95,76,-87,78,-67,78,16,88,7,98,1,108,-2,119,-3,131,-4,164,2,192,19,214,46,228,78,233,114,231,137,223,158,211,176,194,190,173,199,16383,16383,78,243,78,250,79,276,85,297,95,314,108,324,
+18,176,23,182,26,203,26,203,23,182,28,188,26,203,28,188,36,216,36,216,28,188,33,193,36,216,33,193,39,194,39,194,43,192,47,225,47,225,43,192,46,187,47,225,46,187,48,180,16,188,8,172,15,170,16,188,15,170,18,176,16,188,18,176,26,203,49,99,51,66,49,159,49,170,49,159,60,228,49,170,60,228,48,180,48,180,60,228,47,225,54,286,54,271,58,293,58,293,54,271,58,264,58,293,58,264,63,298,63,298,58,264,63,258,63,298,63,258,70,302,70,302,63,258,70,255,70,302,70,255,78,303,78,303,70,255,78,253,78,303,78,253,85,302,85,302,78,253,85,255,85,302,85,255,92,298,92,298,85,255,92,258,92,298,92,258,98,293,98,293,92,258,98,264,98,293,98,264,101,286,101,286,98,264,101,271,101,286,101,271,103,278,91,87,91,193,90,205,91,87,90,205,86,215,91,87,86,215,80,222,91,87,80,222,92,68,141,230,127,230,139,218,141,230,139,218,149,214,141,230,149,214,173,225,200,75,193,49,204,18,204,18,193,49,182,28,204,18,182,28,174,1,174,1,182,28,165,14,174,1,165,14,142,9,142,9,121,14,139,-4,139,-4,121,14,106,28,139,-4,106,28,102,0,102,0,106,28,97,47,102,0,97,47,92,68,76,15,102,0,92,68,76,15,92,68,80,222,76,15,80,222,71,226,76,15,71,226,60,228,76,15,60,228,60,38,60,228,49,159,51,66,60,228,51,66,60,38,47,225,36,216,39,194,149,214,159,209,173,225,173,225,159,209,168,201,173,225,168,201,177,191,177,191,186,176,202,211,202,211,186,176,193,159,202,211,193,159,198,141,202,211,202,104,204,18,202,211,204,18,226,188,226,188,204,18,227,43,226,188,227,43,241,155,241,155,227,43,242,75,241,155,242,75,247,113,202,211,198,141,201,122,202,211,201,122,202,104,202,211,173,225,177,191,142,9,139,-4,174,1,154,286,154,271,157,293,157,293,154,271,157,264,157,293,157,264,163,298,163,298,157,264,163,258,163,298,163,258,169,302,169,302,163,258,169,255,169,302,169,255,177,303,177,303,169,255,177,253,177,303,177,253,185,302,185,302,177,253,185,255,185,302,185,255,192,298,192,298,185,255,192,258,192,298,192,258,197,293,197,293,192,258,197,264,197,293,197,264,201,286,201,286,197,264,201,271,201,286,201,271,202,278,149,331,151,294,153,330,153,330,151,294,155,299,153,330,155,299,157,329,157,329,155,299,159,304,157,329,159,304,161,326,161,326,159,304,162,309,161,326,162,309,163,322,163,322,162,309,163,313,163,322,163,313,164,316,151,294,149,331,143,330,151,294,143,330,139,329,151,294,139,329,135,327,151,294,135,327,132,324,151,294,132,324,130,320,151,294,130,320,118,253,118,253,130,320,100,253,154,271,154,286,152,278,200,75,204,18,202,104,139,218,127,230,127,220,54,271,54,286,53,278,
+257,65,255,50,252,39,248,32,245,27,241,26,232,31,223,43,216,60,210,78,206,94,261,225,212,225,190,157,182,178,171,198,156,215,137,226,113,230,79,224,52,207,31,181,19,148,15,112,19,73,32,41,52,16,78,1,108,-4,129,-1,147,5,162,17,174,32,185,50,190,32,196,17,204,5,213,-1,225,-4,239,0,250,8,258,24,263,43,265,65,16383,16383,166,104,162,84,155,59,145,35,131,16,113,9,90,19,75,43,66,76,61,109,60,137,63,167,70,189,81,204,95,213,110,216,129,208,144,187,154,159,161,130,166,104,172,200,181,204,190,209,196,215,202,222,206,229,209,236,211,244,213,251,213,257,214,264,209,289,197,311,179,327,157,338,133,342,102,337,76,322,54,293,41,249,36,186,36,-67,34,-85,30,-101,27,-107,70,-107,72,-102,74,-95,76,-87,78,-67,78,16,88,7,98,1,108,-2,119,-3,131,-4,164,2,192,19,214,46,228,78,233,114,231,137,223,158,211,176,194,190,173,199,16383,16383,78,243,78,250,79,276,85,297,95,314,108,324,124,328,144,322,158,309,167,290,172,268,173,247,172,235,170,225,166,215,160,209,152,206,147,207,141,208,
+63,167,70,189,79,224,79,224,70,189,81,204,79,224,81,204,113,230,113,230,81,204,95,213,113,230,95,213,110,216,110,216,129,208,113,230,113,230,129,208,137,226,144,187,154,159,156,215,156,215,154,159,161,130,156,215,161,130,171,198,171,198,161,130,166,104,171,198,166,104,174,32,171,198,174,32,182,178,182,178,174,32,185,50,182,178,185,50,190,157,190,157,185,50,190,32,190,157,190,32,212,225,212,225,190,32,196,17,212,225,196,17,206,94,206,94,196,17,204,5,206,94,204,5,213,-1,137,226,129,208,144,187,137,226,144,187,156,215,174,32,166,104,162,84,174,32,162,84,162,17,162,17,162,84,155,59,162,17,155,59,147,5,147,5,155,59,145,35,147,5,145,35,131,16,78,1,108,-4,90,19,90,19,108,-4,113,9,131,16,113,9,129,-1,131,16,129,-1,147,5,210,78,206,94,213,-1,212,225,206,94,261,225,252,39,248,32,250,8,250,8,248,32,245,27,250,8,245,27,241,26,241,26,232,31,239,0,239,0,232,31,225,-4,210,78,213,-1,216,60,216,60,213,-1,225,-4,216,60,225,-4,223,43,223,43,225,-4,232,31,258,24,263,43,265,65,258,24,265,65,257,65,258,24,257,65,255,50,258,24,255,50,252,39,258,24,252,39,250,8,241,26,239,0,250,8,113,9,108,-4,129,-1,90,19,75,43,78,1,78,1,75,43,66,76,78,1,66,76,52,16,52,16,66,76,61,109,52,16,61,109,60,137,60,137,63,167,52,207,52,207,63,167,79,224,52,16,60,137,52,207,52,16,52,207,32,41,32,41,52,207,31,181,32,41,31,181,19,73,19,73,31,181,19,148,19,73,19,148,15,112,
+172,200,181,204,190,209,196,215,202,222,206,229,209,236,211,244,213,251,213,257,214,264,209,289,197,311,179,327,157,338,133,342,102,337,76,322,54,293,41,249,36,186,36,-67,34,-85,30,-101,27,-107,70,-107,72,-102,74,-95,76,-87,78,-67,78,16,88,7,98,1,108,-2,119,-3,131,-4,164,2,192,19,214,46,228,78,233,114,231,137,223,158,211,176,194,190,173,199,16383,16383,78,243,78,250,79,276,85,297,95,314,108,324,124,328,144,322,158,309,167,290,172,268,173,247,172,235,170,225,166,215,160,209,152,206,147,207,141,208,136,209,130,210,118,210,112,208,108,206,106,203,105,200,106,195,109,192,113,189,118,188,125,187,130,187,142,190,148,190,158,187,169,178,179,162,187,136,190,101,187,72,179,47,167,28,150,16,129,11,114,13,100,19,88,26,80,35,78,45,222,225,172,225,120,49,115,84,108,130,97,177,78,214,49,228,32,224,20,212,12,195,7,173,5,150,12,150,16,166,21,178,28,187,35,192,41,194,66,179,84,143,96,96,103,50,107,18,103,9,100,0,96,-7,90,-25,84,-47,82,-57,81,-66,81,-74,82,-85,85,-94,90,-101,96,-106,105,-108,118,-105,127,-98,133,-87,135,-73,136,-58,136,-45,135,-32,133,-19,131,-8,129,0,110,213,77,203,50,187,31,164,19,137,15,108,20,74,34,44,56,18,86,1,123,-4,161,1,192,17,215,43,230,76,235,116,232,141,225,164,213,184,197,202,176,217,145,233,114,248,87,261,68,274,61,290,64,302,72,310,83,316,95,319,106,320,137,316,154,307,165,296,176,286,191,282,198,284,203,288,206,293,208,299,209,304,203,318,188,328,168,336,145,340,124,342,102,340,81,334,61,324,
+108,324,124,328,124,328,133,342,124,328,144,322,133,342,144,322,157,338,157,338,144,322,158,309,157,338,158,309,179,327,179,327,158,309,167,290,179,327,167,290,172,268,172,200,181,204,172,235,172,200,172,235,170,225,172,200,170,225,169,178,172,200,169,178,179,162,172,200,179,162,173,199,233,114,231,137,228,78,228,78,231,137,223,158,228,78,223,158,214,46,214,46,223,158,211,176,214,46,211,176,194,190,192,19,214,46,194,190,192,19,194,190,190,101,192,19,190,101,187,72,192,19,187,72,179,47,192,19,179,47,167,28,192,19,167,28,164,2,194,190,173,199,179,162,194,190,179,162,187,136,194,190,187,136,190,101,170,225,166,215,169,178,169,178,166,215,160,209,169,178,160,209,158,187,158,187,160,209,152,206,129,11,131,-4,150,16,150,16,131,-4,164,2,150,16,164,2,167,28,85,297,95,314,102,337,102,337,95,314,108,324,102,337,108,324,133,342,133,342,108,324,124,328,78,250,79,276,76,322,78,250,76,322,76,-87,78,250,76,-87,77,-77,78,250,77,-77,78,-67,76,322,79,276,85,297,76,322,85,297,102,337,76,322,54,293,70,-107,76,322,70,-107,72,-102,76,322,72,-102,74,-95,76,322,74,-95,76,-87,70,-107,54,293,41,249,70,-107,41,249,36,186,70,-107,36,186,36,-67,70,-107,36,-67,35,-76,70,-107,35,-76,34,-85,70,-107,34,-85,32,-93,70,-107,32,-93,30,-101,70,-107,30,-101,27,-107,114,13,100,19,108,-2,114,13,108,-2,119,-3,114,13,119,-3,129,11,108,-2,100,19,98,1,98,1,100,19,88,26,98,1,88,26,88,7,88,7,88,26,80,35,88,7,80,35,78,45,78,45,78,16,88,7,148,190,152,206,147,207,148,190,147,207,142,190,118,188,125,187,127,210,127,210,125,187,130,187,127,210,130,187,130,210,130,210,130,187,134,188,130,210,134,188,136,209,136,209,134,188,138,189,136,209,138,189,141,208,141,208,138,189,142,190,141,208,142,190,147,207,106,203,106,195,108,206,108,206,106,195,109,192,108,206,109,192,112,208,112,208,109,192,113,189,112,208,113,189,118,210,118,210,113,189,118,188,118,210,118,188,127,210,173,247,181,204,179,327,173,247,179,327,172,268,206,229,209,236,209,289,209,289,209,236,211,244,209,289,211,244,214,264,214,264,211,244,213,251,214,264,213,251,213,257,190,209,196,215,197,311,197,311,196,215,202,222,197,311,202,222,209,289,209,289,202,222,206,229,197,311,179,327,181,204,197,311,181,204,190,209,172,235,181,204,173,247,148,190,158,187,152,206,131,-4,129,11,119,-3,106,195,106,203,105,200,
+222,225,172,225,120,49,115,84,108,130,97,177,78,214,49,228,32,224,20,212,12,195,7,173,5,150,12,150,16,166,21,178,28,187,35,192,41,194,66,179,84,143,96,96,103,50,107,18,103,9,100,0,96,-7,90,-25,84,-47,82,-57,81,-66,81,-74,82,-85,85,-94,90,-101,96,-106,105,-108,118,-105,127,-98,133,-87,135,-73,136,-58,136,-45,135,-32,133,-19,131,-8,129,0,110,213,77,203,50,187,31,164,19,137,15,108,20,74,34,44,56,18,86,1,123,-4,161,1,192,17,215,43,230,76,235,116,232,141,225,164,213,184,197,202,176,217,145,233,114,248,87,261,68,274,61,290,64,302,72,310,83,316,95,319,106,320,137,316,154,307,165,296,176,286,191,282,198,284,203,288,206,293,208,299,209,304,203,318,188,328,168,336,145,340,124,342,102,340,
+35,192,41,194,41,194,49,228,41,194,66,179,49,228,66,179,78,214,78,214,66,179,84,143,78,214,84,143,97,177,97,177,84,143,96,96,97,177,96,96,103,50,120,49,115,84,118,-105,118,-105,115,84,108,130,118,-105,108,130,107,18,107,18,108,130,103,50,103,50,108,130,97,177,118,-105,127,-98,120,49,120,49,127,-98,129,0,120,49,129,0,172,225,172,225,129,0,222,225,107,18,103,9,105,-108,107,18,105,-108,118,-105,100,0,96,-7,96,-106,100,0,96,-106,105,-108,100,0,105,-108,103,9,96,-7,93,-16,96,-106,96,-106,93,-16,90,-25,96,-106,90,-25,90,-101,90,-101,90,-25,87,-36,90,-101,87,-36,85,-94,85,-94,87,-36,84,-47,85,-94,84,-47,82,-57,82,-85,85,-94,82,-57,82,-85,82,-57,81,-66,82,-85,81,-66,81,-74,135,-73,136,-58,136,-45,135,-73,136,-45,135,-32,135,-73,135,-32,133,-19,135,-73,133,-19,133,-87,133,-87,133,-19,131,-8,133,-87,131,-8,129,0,133,-87,129,0,127,-98,21,178,28,187,32,224,32,224,28,187,35,192,32,224,35,192,49,228,49,228,35,192,41,194,20,212,12,195,12,150,20,212,12,150,16,166,20,212,16,166,21,178,20,212,21,178,32,224,7,173,5,150,12,150,7,173,12,150,12,195,
+110,213,77,203,50,187,31,164,19,137,15,108,20,74,34,44,56,18,86,1,123,-4,161,1,192,17,215,43,230,76,235,116,232,141,225,164,213,184,197,202,176,217,145,233,114,248,87,261,68,274,61,290,64,302,72,310,83,316,95,319,106,320,137,316,154,307,165,296,176,286,191,282,198,284,203,288,206,293,208,299,209,304,203,318,188,328,168,336,145,340,124,342,102,340,81,334,61,324,47,309,42,289,45,269,54,251,68,237,87,224,110,213,16383,16383,190,104,187,71,180,45,168,25,151,13,130,9,121,10,111,13,101,19,93,26,85,35,76,52,69,70,64,88,61,106,60,121,62,144,70,165,84,183,103,195,127,200,149,190,167,172,179,149,187,126,190,104,196,73,182,54,166,39,149,29,131,22,110,20,95,22,80,27,69,36,60,49,57,65,61,81,70,94,83,102,97,107,111,108,117,108,125,106,128,106,133,105,142,106,148,108,153,111,156,115,157,118,156,122,154,124,150,127,145,128,138,129,131,128,121,126,115,125,108,124,92,127,80,133,72,142,67,154,65,167,67,182,74,195,83,206,96,213,112,215,127,215,140,212,148,208,154,203,156,195,155,193,155,190,154,187,154,183,153,179,155,171,158,166,163,161,168,158,175,157,182,158,188,161,194,165,198,171,199,179,194,199,181,214,163,223,142,228,121,230,87,226,60,217,40,202,28,184,24,165,26,152,31,141,39,131,49,123,63,118,47,113,33,103,22,91,15,77,
+42,289,45,269,47,309,47,309,45,269,54,251,47,309,54,251,61,324,61,324,54,251,61,290,68,237,61,290,54,251,64,302,72,310,81,334,81,334,72,310,83,316,81,334,83,316,102,340,102,340,83,316,95,319,102,340,95,319,106,320,106,320,137,316,124,342,124,342,137,316,145,340,61,324,61,290,64,302,61,324,64,302,81,334,198,284,203,288,203,318,203,318,203,288,206,293,203,318,206,293,209,304,209,304,206,293,208,299,154,307,165,296,168,336,168,336,165,296,176,286,168,336,176,286,188,328,188,328,176,286,191,282,188,328,191,282,203,318,203,318,191,282,198,284,145,340,137,316,154,307,145,340,154,307,168,336,235,116,232,141,230,76,230,76,232,141,225,164,230,76,225,164,215,43,215,43,225,164,213,184,215,43,213,184,197,202,192,17,215,43,197,202,192,17,197,202,190,104,192,17,190,104,187,71,192,17,187,71,180,45,192,17,180,45,168,25,192,17,168,25,161,1,197,202,176,217,179,149,197,202,179,149,187,126,197,202,187,126,190,104,145,233,127,200,149,190,145,233,149,190,176,217,176,217,149,190,167,172,176,217,167,172,179,149,111,13,123,-4,121,10,121,10,123,-4,130,9,151,13,130,9,161,1,151,13,161,1,168,25,130,9,123,-4,161,1,124,342,102,340,106,320,69,70,86,1,76,52,76,52,86,1,85,35,93,26,85,35,86,1,93,26,86,1,123,-4,68,274,68,237,87,261,87,261,68,237,87,224,87,261,87,224,114,248,114,248,87,224,110,213,114,248,110,213,127,200,62,144,70,165,77,203,77,203,70,165,84,183,77,203,84,183,110,213,110,213,84,183,103,195,110,213,103,195,127,200,77,203,50,187,62,144,62,144,50,187,60,121,61,106,60,121,56,18,61,106,56,18,64,88,64,88,56,18,86,1,64,88,86,1,69,70,56,18,60,121,50,187,56,18,50,187,34,44,34,44,50,187,31,164,34,44,31,164,20,74,20,74,31,164,19,137,20,74,19,137,15,108,101,19,93,26,123,-4,101,19,123,-4,111,13,61,290,68,237,68,274,127,200,145,233,114,248,
+196,73,182,54,166,39,149,29,131,22,110,20,95,22,80,27,69,36,60,49,57,65,61,81,70,94,83,102,97,107,111,108,117,108,125,106,128,106,133,105,142,106,148,108,153,111,156,115,157,118,156,122,154,124,150,127,145,128,138,129,131,128,121,126,115,125,108,124,92,127,80,133,72,142,67,154,65,167,67,182,74,195,83,206,96,213,112,215,127,215,140,212,148,208,154,203,156,195,155,193,155,190,154,187,154,183,153,179,155,171,158,166,163,161,168,158,175,157,182,158,188,161,194,165,198,171,199,179,194,199,181,214,163,223,142,228,121,230,87,226,60,217,40,202,28,184,24,165,26,152,31,141,39,131,49,123,63,118,47,113,33,103,22,91,15,77,12,61,14,46,21,29,37,13,65,0,108,-4,130,-1,151,6,171,20,189,40,204,68,76,342,59,335,45,327,35,318,29,308,27,296,30,283,38,272,48,265,60,260,71,259,72,257,52,225,36,196,25,166,19,135,17,100,21,58,33,28,49,9,71,-1,95,-4,105,-4,117,-2,128,-1,137,0,143,0,158,-1,170,-5,180,-12,186,-22,188,-34,186,-47,180,-58,170,-67,159,-72,147,-74,140,-72,134,-69,128,-64,123,-61,117,-59,110,-60,104,-63,99,-68,97,-73,96,-80,98,-90,103,-98,111,-103,121,-107,132,-108,151,-104,170,-93,187,-76,199,-55,204,-29,201,-3,192,16,177,30,156,38,128,41,117,41,113,40,103,40,78,44,61,55,49,72,43,93,41,117,44,151,53,184,65,213,80,238,94,257,119,262,142,271,161,283,174,297,179,311,178,316,175,321,171,325,166,327,159,328,142,325,125,315,108,302,94,287,84,273,74,274,65,277,57,281,52,288,
+37,13,65,0,47,113,47,113,65,0,57,65,63,118,57,65,61,81,63,118,61,81,70,94,72,142,67,154,70,94,70,94,67,154,65,167,63,118,65,167,60,217,63,118,60,217,49,123,49,123,60,217,40,202,49,123,40,202,39,131,39,131,40,202,31,141,142,228,121,230,127,215,127,215,121,230,112,215,96,213,112,215,121,230,96,213,121,230,87,226,194,199,181,214,182,158,194,199,182,158,188,161,194,199,188,161,194,165,194,199,194,165,198,171,194,199,198,171,199,179,158,166,163,161,163,223,163,223,163,161,168,158,163,223,168,158,181,214,181,214,168,158,175,157,181,214,175,157,182,158,127,215,140,212,142,228,142,228,140,212,148,208,142,228,148,208,163,223,163,223,148,208,154,203,163,223,154,203,156,195,156,195,158,166,163,223,156,195,155,193,158,166,158,166,155,193,155,190,158,166,155,190,155,171,155,171,155,190,154,187,155,171,154,187,154,183,87,226,60,217,67,182,87,226,67,182,74,195,87,226,74,195,83,206,87,226,83,206,96,213,67,182,60,217,65,167,28,184,24,165,26,152,28,184,26,152,31,141,28,184,31,141,40,202,83,102,97,107,92,127,92,127,97,107,108,124,115,125,108,124,111,108,83,102,92,127,80,133,83,102,80,133,72,142,83,102,72,142,70,94,63,118,70,94,65,167,111,108,108,124,97,107,117,108,121,107,121,126,121,126,121,107,125,106,121,126,125,106,126,127,126,127,125,106,128,106,126,127,128,106,131,128,131,128,128,106,133,105,131,128,133,105,138,129,138,129,133,105,142,106,138,129,142,106,145,128,145,128,142,106,148,108,145,128,148,108,150,127,150,127,148,108,153,111,150,127,153,111,154,124,154,124,153,111,156,115,154,124,156,115,156,122,156,122,156,115,157,118,115,125,111,108,117,108,115,125,117,108,121,126,80,27,108,-4,95,22,95,22,108,-4,110,20,131,22,110,20,130,-1,131,22,130,-1,151,6,69,36,60,49,65,0,69,36,65,0,108,-4,69,36,108,-4,80,27,57,65,65,0,60,49,12,61,14,46,15,77,15,77,14,46,21,29,15,77,21,29,22,91,22,91,21,29,37,13,22,91,37,13,33,103,33,103,37,13,47,113,204,68,196,73,189,40,189,40,196,73,182,54,189,40,182,54,171,20,171,20,182,54,166,39,171,20,166,39,151,6,151,6,166,39,149,29,151,6,149,29,131,22,110,20,108,-4,130,-1,47,113,57,65,63,118,155,171,154,183,153,179,
+76,342,59,335,45,327,35,318,29,308,27,296,30,283,38,272,48,265,60,260,71,259,72,257,52,225,36,196,25,166,19,135,17,100,21,58,33,28,49,9,71,-1,95,-4,105,-4,117,-2,128,-1,137,0,143,0,158,-1,170,-5,180,-12,186,-22,188,-34,186,-47,180,-58,170,-67,159,-72,147,-74,140,-72,134,-69,128,-64,123,-61,117,-59,110,-60,104,-63,99,-68,97,-73,96,-80,98,-90,103,-98,111,-103,121,-107,132,-108,151,-104,170,-93,187,-76,199,-55,204,-29,201,-3,192,16,177,30,156,38,128,41,117,41,113,40,103,40,78,44,61,55,49,72,43,93,41,117,44,151,53,184,65,213,80,238,94,257,119,262,142,271,161,283,174,297,179,311,178,316,175,321,171,325,166,327,159,328,142,325,125,315,108,302,94,287,84,273,74,274,65,277,57,281,52,288,50,298,51,305,55,312,61,320,70,328,81,334,226,-107,223,-101,221,-94,219,-86,218,-76,218,160,216,182,208,202,196,217,180,226,159,230,145,229,131,224,117,216,102,205,87,190,86,190,84,205,81,215,76,223,68,226,56,228,44,225,33,216,22,203,13,188,5,172,12,170,15,176,25,188,30,193,36,194,39,193,41,190,44,184,45,173,46,156,46,0,88,0,88,174,100,185,111,194,120,199,130,202,140,203,153,201,163,195,170,185,174,172,176,154,176,-79,177,-89,179,-97,181,-103,184,-107,234,166,233,198,230,228,226,254,220,277,211,296,199,313,185,325,169,334,150,340,126,342,87,333,55,310,32,273,18,226,13,170,14,144,15,120,18,100,23,81,28,64,40,41,55,21,74,7,96,-1,122,-4,161,3,192,27,215,63,229,110,234,166,16383,16383,59,177,59,193,62,247,70,285,83,310,99,324,119,328,150,318,171,292,182,256,188,216,189,177,16383,16383,
+43,93,41,117,41,117,36,196,41,117,44,151,36,196,44,151,52,225,52,225,44,151,53,184,52,225,53,184,72,257,72,257,53,184,65,213,72,257,65,213,80,238,48,265,50,298,45,327,48,265,45,327,38,272,38,272,45,327,35,318,38,272,35,318,30,283,30,283,35,318,29,308,30,283,29,308,27,296,51,305,55,312,59,335,59,335,55,312,61,320,59,335,61,320,76,342,76,342,61,320,70,328,76,342,70,328,81,334,51,305,59,335,45,327,51,305,45,327,50,298,108,302,94,287,94,257,94,257,94,287,84,273,94,257,84,273,80,238,80,238,84,273,74,274,80,238,74,274,72,257,72,257,74,274,71,259,166,327,159,328,161,283,161,283,159,328,142,325,161,283,142,325,142,271,142,271,142,325,125,315,142,271,125,315,119,262,119,262,125,315,108,302,119,262,108,302,94,257,65,277,57,281,60,260,65,277,60,260,71,259,65,277,71,259,74,274,52,288,50,298,48,265,52,288,48,265,60,260,52,288,60,260,57,281,71,-1,95,-4,78,44,78,44,95,-4,103,40,108,40,103,40,105,-4,108,40,105,-4,117,-2,61,55,49,72,49,9,61,55,49,9,71,-1,61,55,71,-1,78,44,43,93,41,117,33,28,43,93,33,28,49,9,43,93,49,9,49,72,41,117,36,196,33,28,33,28,36,196,25,166,33,28,25,166,21,58,21,58,25,166,19,135,21,58,19,135,17,100,177,30,156,38,158,-1,158,-1,156,38,143,0,137,0,143,0,156,38,137,0,156,38,128,41,128,-1,137,0,128,41,128,-1,128,41,123,41,128,-1,123,41,117,41,128,-1,117,41,117,-2,113,40,108,40,117,-2,113,40,117,-2,117,41,128,-64,132,-108,134,-69,134,-69,132,-108,151,-104,134,-69,151,-104,140,-72,140,-72,151,-104,147,-74,159,-72,147,-74,151,-104,159,-72,151,-104,170,-93,204,-29,201,-3,199,-55,199,-55,201,-3,192,16,199,-55,192,16,188,-34,188,-34,187,-76,199,-55,158,-1,170,-5,177,30,177,30,170,-5,180,-12,177,30,180,-12,192,16,192,16,180,-12,186,-22,192,16,186,-22,188,-34,187,-76,188,-34,186,-47,187,-76,186,-47,180,-58,187,-76,180,-58,170,-67,187,-76,170,-67,170,-93,110,-60,111,-103,117,-59,117,-59,111,-103,121,-107,117,-59,121,-107,123,-61,123,-61,121,-107,132,-108,123,-61,132,-108,128,-64,97,-73,98,-90,99,-68,99,-68,98,-90,103,-98,99,-68,103,-98,104,-63,104,-63,103,-98,111,-103,104,-63,111,-103,110,-60,175,321,171,325,174,297,175,321,174,297,179,311,175,321,179,311,178,316,166,327,161,283,174,297,166,327,174,297,171,325,103,40,95,-4,105,-4,98,-90,97,-73,96,-80,159,-72,170,-93,170,-67,
+226,-107,223,-101,221,-94,219,-86,218,-76,218,160,216,182,208,202,196,217,180,226,159,230,145,229,131,224,117,216,102,205,87,190,86,190,84,205,81,215,76,223,68,226,56,228,44,225,33,216,22,203,13,188,5,172,12,170,15,176,25,188,30,193,36,194,39,193,41,190,44,184,45,173,46,156,46,0,88,0,88,174,100,185,111,194,120,199,130,202,140,203,153,201,163,195,170,185,174,172,176,154,176,-79,177,-89,179,-97,181,-103,184,-107,234,166,233,198,230,228,226,254,220,277,211,296,199,313,185,325,169,334,150,340,126,342,87,333,55,310,32,273,18,226,13,170,14,144,15,120,18,100,23,81,28,64,40,41,55,21,74,7,96,-1,122,-4,161,3,192,27,215,63,229,110,234,166,16383,16383,59,177,59,193,62,247,70,285,83,310,99,324,119,328,150,318,171,292,182,256,188,216,189,177,16383,16383,189,158,187,109,180,67,168,36,151,16,128,9,98,18,78,42,67,77,61,118,
+15,176,20,182,22,203,22,203,20,182,25,188,22,203,25,188,33,216,33,216,25,188,30,193,33,216,30,193,36,194,36,194,39,193,44,225,44,225,39,193,41,190,44,225,41,190,44,184,13,188,5,172,12,170,13,188,12,170,15,176,13,188,15,176,22,203,87,190,86,190,88,0,87,190,88,0,88,174,87,190,88,174,102,205,88,174,100,185,102,205,102,205,100,185,111,194,102,205,111,194,117,216,117,216,111,194,120,199,117,216,120,199,131,224,131,224,120,199,130,202,131,224,130,202,140,203,140,203,153,201,145,229,145,229,153,201,159,230,88,0,86,190,84,205,88,0,84,205,81,215,88,0,81,215,76,223,88,0,76,223,68,226,88,0,68,226,56,228,88,0,56,228,46,156,88,0,46,156,46,0,145,229,131,224,140,203,218,-65,218,160,216,182,218,-65,216,182,208,202,218,-65,208,202,218,-76,196,217,180,226,181,-103,196,217,181,-103,184,-107,196,217,184,-107,218,-76,196,217,218,-76,208,202,184,-107,226,-107,223,-101,184,-107,223,-101,221,-94,184,-107,221,-94,219,-86,184,-107,219,-86,218,-76,180,226,159,230,163,195,180,226,163,195,170,185,180,226,170,185,174,172,180,226,174,172,176,154,180,226,176,154,176,-79,180,226,176,-79,177,-89,180,226,177,-89,179,-97,180,226,179,-97,181,-103,176,154,176,-64,176,-79,45,173,46,156,56,228,45,173,56,228,44,225,45,173,44,225,44,184,44,225,33,216,36,194,159,230,153,201,163,195,
+234,166,233,198,230,228,226,254,220,277,211,296,199,313,185,325,169,334,150,340,126,342,87,333,55,310,32,273,18,226,13,170,14,144,15,120,18,100,23,81,28,64,40,41,55,21,74,7,96,-1,122,-4,161,3,192,27,215,63,229,110,234,166,16383,16383,59,177,59,193,62,247,70,285,83,310,99,324,119,328,150,318,171,292,182,256,188,216,189,177,16383,16383,189,158,187,109,180,67,168,36,151,16,128,9,98,18,78,42,67,77,61,118,59,161,189,161,126,54,120,43,115,36,110,31,105,29,99,28,95,29,91,33,90,36,89,40,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,37,196,42,193,45,188,47,181,47,39,48,26,51,14,57,4,65,-2,77,-4,92,-1,105,7,116,20,126,35,133,50,252,0,252,7,239,10,228,13,219,19,209,27,199,39,113,140,131,158,147,172,161,181,174,185,188,187,194,186,201,185,207,183,213,182,220,181,227,182,233,185,239,189,243,196,245,206,
+150,340,126,342,150,318,150,318,126,342,119,328,99,324,119,328,126,342,99,324,126,342,87,333,230,228,226,254,229,110,230,228,229,110,234,166,230,228,234,166,233,198,220,277,211,296,215,63,220,277,215,63,229,110,220,277,229,110,226,254,23,81,28,64,32,273,32,273,28,64,40,41,32,273,40,41,55,310,55,310,40,41,55,21,55,310,55,21,59,193,59,193,55,21,59,161,59,193,59,161,59,177,59,177,59,161,189,177,189,177,59,161,189,161,189,177,189,161,192,27,189,177,192,27,199,313,199,313,192,27,215,63,199,313,215,63,211,296,171,292,182,256,185,325,185,325,182,256,188,216,185,325,188,216,199,313,199,313,188,216,189,177,169,334,150,340,150,318,169,334,150,318,171,292,169,334,171,292,185,325,187,109,180,67,192,27,192,27,180,67,168,36,192,27,168,36,161,3,161,3,168,36,151,16,161,3,151,16,128,9,128,9,98,18,122,-4,122,-4,98,18,96,-1,78,42,67,77,74,7,78,42,74,7,96,-1,78,42,96,-1,98,18,59,161,55,21,61,118,61,118,55,21,74,7,61,118,74,7,67,77,189,158,187,109,192,27,189,158,192,27,189,161,128,9,122,-4,161,3,59,193,62,247,55,310,55,310,62,247,70,285,55,310,70,285,87,333,87,333,70,285,83,310,87,333,83,310,99,324,14,144,15,120,18,226,18,226,15,120,18,100,18,226,18,100,32,273,32,273,18,100,23,81,14,144,18,226,13,170,
+126,54,120,43,115,36,110,31,105,29,99,28,95,29,91,33,90,36,89,40,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,37,196,42,193,45,188,47,181,47,39,48,26,51,14,57,4,65,-2,77,-4,92,-1,105,7,116,20,126,35,133,50,252,0,252,7,239,10,228,13,219,19,209,27,199,39,113,140,131,158,147,172,161,181,174,185,188,187,194,186,201,185,207,183,213,182,220,181,227,182,233,185,239,189,243,196,245,206,244,214,240,220,234,225,226,229,215,230,202,228,184,222,160,205,127,176,83,129,83,229,
+45,188,57,219,42,193,42,193,57,219,41,214,42,193,41,214,37,196,37,196,41,214,31,196,28,196,31,196,41,214,28,196,41,214,26,208,57,4,65,-2,72,224,72,224,65,-2,77,-4,72,224,77,-4,88,230,88,230,77,-4,89,40,88,230,89,40,89,228,91,33,92,-1,93,31,93,31,92,-1,105,7,93,31,105,7,95,29,95,29,105,7,99,28,105,29,99,28,105,7,105,29,105,7,116,20,133,50,126,54,126,35,126,35,126,54,120,43,126,35,120,43,116,20,116,20,120,43,115,36,116,20,115,36,110,31,92,-1,91,33,90,36,92,-1,90,36,89,40,92,-1,89,40,77,-4,57,219,45,188,47,181,57,219,47,181,47,172,57,219,47,172,48,26,57,219,48,26,51,14,57,219,51,14,57,4,57,219,57,4,72,224,47,172,47,39,48,26,26,208,10,204,15,196,26,208,15,196,20,196,26,208,20,196,24,196,26,208,24,196,28,196,15,196,10,204,10,195,105,29,116,20,110,31,
+252,0,252,7,239,10,228,13,219,19,209,27,199,39,113,140,131,158,147,172,161,181,174,185,188,187,194,186,201,185,207,183,213,182,220,181,227,182,233,185,239,189,243,196,245,206,244,214,240,220,234,225,226,229,215,230,202,228,184,222,160,205,127,176,83,129,83,229,81,230,70,226,48,220,35,216,18,212,3,208,3,200,10,200,14,201,20,201,28,200,34,197,38,192,40,183,41,171,41,0,83,0,83,113,148,34,151,30,155,24,156,22,156,20,155,15,153,12,149,9,144,8,137,7,133,7,133,0,238,69,235,53,229,42,222,35,215,31,209,30,200,32,193,38,186,47,181,58,176,71,121,266,113,292,104,313,95,329,83,338,68,342,51,337,39,325,32,308,28,288,26,268,34,268,38,284,43,295,49,302,56,305,64,306,74,304,83,296,92,283,100,267,107,248,113,225,6,0,56,0,128,177,164,45,169,29,176,15,184,4,193,-2,204,-5,219,-1,230,8,239,24,244,45,246,69,251,53,244,42,239,35,234,31,230,29,224,28,221,29,218,31,216,36,215,45,214,56,214,225,172,225,172,59,171,53,169,48,
+10,200,14,201,18,212,18,212,14,201,17,201,18,212,17,201,20,201,20,201,28,200,35,216,35,216,28,200,34,197,35,216,34,197,38,192,7,200,10,200,18,212,7,200,18,212,3,208,7,200,3,208,3,200,35,216,38,192,48,220,48,220,38,192,40,183,48,220,40,183,41,171,83,0,41,171,41,0,35,216,18,212,20,201,83,129,83,229,81,230,83,129,81,230,83,0,83,129,83,0,83,113,83,129,83,113,127,176,131,158,147,172,160,205,160,205,147,172,161,181,160,205,161,181,184,222,184,222,161,181,174,185,184,222,174,185,188,187,188,187,194,186,202,228,202,228,194,186,201,185,202,228,201,185,207,183,127,176,83,113,113,140,127,176,113,140,131,158,127,176,131,158,160,205,83,0,81,230,70,226,83,0,70,226,59,223,83,0,59,223,48,220,83,0,48,220,41,171,227,182,233,185,234,225,234,225,233,185,239,189,234,225,239,189,240,220,240,220,239,189,243,196,240,220,243,196,244,214,244,214,243,196,245,206,207,183,213,182,215,230,215,230,213,182,220,181,215,230,220,181,226,229,226,229,220,181,227,182,226,229,227,182,234,225,202,228,184,222,188,187,153,12,149,9,252,0,252,0,149,9,144,8,252,0,144,8,137,7,156,20,252,0,228,13,156,20,228,13,219,19,156,20,219,19,209,27,156,20,209,27,199,39,156,20,199,39,156,22,199,39,113,140,148,34,199,39,148,34,151,30,199,39,151,30,153,27,199,39,153,27,155,24,199,39,155,24,156,22,239,10,228,13,252,0,239,10,252,0,252,7,155,15,153,12,252,0,155,15,252,0,156,20,133,7,133,0,252,0,133,7,252,0,137,7,148,34,113,140,83,113,202,228,207,183,215,230,
+238,69,235,53,229,42,222,35,215,31,209,30,200,32,193,38,186,47,181,58,176,71,121,266,113,292,104,313,95,329,83,338,68,342,51,337,39,325,32,308,28,288,26,268,34,268,38,284,43,295,49,302,56,305,64,306,74,304,83,296,92,283,100,267,107,248,113,225,6,0,56,0,128,177,164,45,169,29,176,15,184,4,193,-2,204,-5,219,-1,230,8,239,24,244,45,246,69,251,53,244,42,239,35,234,31,230,29,224,28,221,29,218,31,216,36,215,45,214,56,214,225,172,225,172,59,171,53,169,48,166,44,161,40,153,33,144,29,136,26,128,24,121,24,108,26,96,32,87,41,80,53,78,69,78,225,36,225,36,-65,35,-75,34,-84,32,-93,30,-101,27,-107,69,-107,71,-102,73,-94,75,-85,76,-75,76,9,78,9,81,4,87,0,93,-2,101,-4,109,-4,
+56,305,64,306,64,306,68,342,64,306,74,304,68,342,74,304,83,338,83,338,74,304,83,296,83,338,83,296,95,329,95,329,83,296,92,283,95,329,92,283,100,267,113,292,107,248,113,225,113,292,113,225,121,266,121,266,113,225,128,177,121,266,128,177,176,71,176,71,128,177,164,45,176,71,164,45,169,29,104,313,95,329,100,267,104,313,100,267,107,248,104,313,107,248,113,292,176,71,169,29,176,15,176,71,176,15,184,4,113,225,6,0,56,0,113,225,56,0,128,177,200,32,193,38,193,-2,193,-2,193,38,186,47,193,-2,186,47,184,4,184,4,186,47,181,58,184,4,181,58,176,71,235,53,229,42,230,8,230,8,229,42,222,35,230,8,222,35,219,-1,219,-1,222,35,215,31,219,-1,215,31,209,30,209,30,200,32,204,-5,204,-5,200,32,193,-2,239,24,244,45,246,69,239,24,246,69,238,69,239,24,238,69,235,53,239,24,235,53,230,8,209,30,204,-5,219,-1,43,295,49,302,51,337,51,337,49,302,56,305,51,337,56,305,68,342,68,342,56,305,64,306,39,325,32,308,34,268,39,325,34,268,38,284,39,325,38,284,43,295,39,325,43,295,51,337,28,288,26,268,34,268,28,288,34,268,32,308,
+251,53,244,42,239,35,234,31,230,29,224,28,221,29,218,31,216,36,215,45,214,56,214,225,172,225,172,59,171,53,169,48,166,44,161,40,153,33,144,29,136,26,128,24,121,24,108,26,96,32,87,41,80,53,78,69,78,225,36,225,36,-65,35,-75,34,-84,32,-93,30,-101,27,-107,69,-107,71,-102,73,-94,75,-85,76,-75,76,9,78,9,81,4,87,0,93,-2,101,-4,109,-4,119,-3,131,0,144,7,158,19,171,36,172,36,173,23,177,12,182,3,191,-2,203,-4,217,-1,230,7,241,20,250,35,258,50,212,230,206,188,189,141,163,97,129,63,90,45,89,45,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,31,196,37,195,42,192,45,188,47,181,47,-6,59,-6,100,7,134,28,163,55,186,84,203,116,212,141,217,166,220,189,221,211,222,230,89,342,71,335,57,328,48,319,43,309,41,297,42,286,47,278,53,272,61,268,69,266,63,259,58,251,54,242,52,233,51,224,52,215,55,206,59,198,65,190,73,184,54,168,39,150,27,129,20,106,17,81,20,53,29,29,44,11,67,0,98,-4,
+78,225,36,225,69,-107,78,225,69,-107,71,-102,78,225,71,-102,73,-94,78,225,73,-94,75,-85,78,225,75,-85,76,-75,78,225,76,-75,76,9,78,225,76,9,78,9,69,-107,36,225,36,-65,69,-107,36,-65,35,-75,69,-107,35,-75,34,-84,69,-107,34,-84,32,-93,69,-107,32,-93,30,-101,69,-107,30,-101,27,-107,87,0,93,-2,96,32,96,32,93,-2,101,-4,96,32,101,-4,108,26,108,26,101,-4,109,-4,108,26,109,-4,121,24,121,24,109,-4,119,-3,121,24,119,-3,131,0,171,53,169,48,171,36,171,36,169,48,166,44,171,36,166,44,161,40,161,40,153,33,158,19,158,19,153,33,144,29,158,19,144,29,144,7,144,7,144,29,136,26,144,7,136,26,131,0,131,0,136,26,128,24,131,0,128,24,121,24,87,41,80,53,81,4,87,41,81,4,87,0,87,41,87,0,96,32,81,4,80,53,78,69,81,4,78,69,78,9,214,225,172,225,173,23,173,23,172,225,172,68,173,23,172,68,172,36,172,36,172,68,172,59,172,36,172,59,171,36,171,36,172,59,171,53,161,40,158,19,171,36,214,225,173,23,177,12,214,225,177,12,182,3,214,225,182,3,191,-2,214,225,191,-2,203,-4,214,225,203,-4,214,56,244,42,239,35,241,20,241,20,239,35,234,31,241,20,234,31,230,7,230,7,234,31,230,29,230,7,230,29,224,28,224,28,221,29,230,7,230,7,221,29,218,31,230,7,218,31,217,-1,217,-1,218,31,216,36,217,-1,216,36,215,45,250,35,258,50,251,53,250,35,251,53,244,42,250,35,244,42,241,20,215,45,214,56,203,-4,215,45,203,-4,217,-1,76,9,76,-75,76,-64,
+212,230,206,188,189,141,163,97,129,63,90,45,89,45,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,31,196,37,195,42,192,45,188,47,181,47,-6,59,-6,100,7,134,28,163,55,186,84,203,116,212,141,217,166,220,189,221,211,222,230,89,342,71,335,57,328,48,319,43,309,41,297,42,286,47,278,53,272,61,268,69,266,63,259,58,251,54,242,52,233,51,224,52,215,55,206,59,198,65,190,73,184,54,168,39,150,27,129,20,106,17,81,20,53,29,29,44,11,67,0,98,-4,107,-4,117,-2,
+45,188,57,219,42,192,42,192,57,219,41,214,42,192,41,214,37,195,37,195,41,214,31,196,28,196,31,196,41,214,28,196,41,214,26,208,89,228,88,230,89,45,89,45,88,230,72,224,89,45,72,224,59,-6,59,-6,72,224,57,219,59,-6,57,219,47,172,47,172,57,219,47,181,26,208,10,204,15,196,26,208,15,196,20,196,26,208,20,196,25,196,26,208,25,196,28,196,186,84,189,141,163,55,163,55,189,141,163,97,163,55,163,97,134,28,134,28,163,97,129,63,134,28,129,63,100,7,100,7,129,63,90,45,189,141,203,116,206,188,206,188,203,116,212,141,206,188,212,141,212,230,212,230,212,141,217,166,212,230,217,166,222,230,222,230,217,166,220,189,222,230,220,189,221,211,89,45,59,-6,100,7,89,45,100,7,90,45,47,172,47,-6,59,-6,15,196,10,204,10,195,189,141,186,84,203,116,57,219,45,188,47,181,
+89,342,71,335,57,328,48,319,43,309,41,297,42,286,47,278,53,272,61,268,69,266,63,259,58,251,54,242,52,233,51,224,52,215,55,206,59,198,65,190,73,184,54,168,39,150,27,129,20,106,17,81,20,53,29,29,44,11,67,0,98,-4,107,-4,117,-2,128,-1,137,0,143,0,158,-1,170,-5,180,-12,186,-22,188,-34,186,-47,180,-59,170,-67,159,-72,147,-74,140,-72,134,-69,128,-64,123,-61,117,-59,110,-60,104,-63,99,-68,97,-73,96,-80,98,-90,103,-98,111,-103,121,-107,132,-108,151,-104,170,-93,187,-76,199,-53,204,-26,201,-3,192,15,177,29,156,38,128,41,118,41,111,40,98,40,79,42,63,48,51,59,43,75,40,98,43,118,50,136,62,152,77,164,94,174,102,172,110,171,117,170,142,170,157,173,171,178,181,186,185,197,184,204,179,210,172,214,164,216,153,217,140,216,127,213,113,208,101,202,89,194,83,199,78,204,74,211,72,218,71,225,73,235,77,243,83,251,93,256,106,258,126,260,144,264,160,271,171,280,175,291,174,297,171,301,166,305,160,307,151,307,139,306,125,303,111,297,96,290,83,281,76,283,70,286,66,291,64,297,63,305,64,310,66,316,72,322,80,328,93,334,237,114,232,151,218,183,197,208,167,224,129,230,91,223,60,203,37,174,22,139,17,101,23,67,38,38,62,15,92,0,126,-4,161,2,191,20,215,47,231,79,237,114,16383,16383,192,95,190,74,183,52,172,31,156,17,134,11,107,19,87,38,73,65,65,95,62,122,64,145,70,169,80,191,97,207,119,214,148,205,168,184,182,155,190,124,192,95,233,69,229,55,223,45,216,40,209,37,203,36,194,38,188,41,184,47,180,54,178,61,177,69,176,78,175,88,175,109,176,127,176,144,178,160,179,173,180,183,239,183,239,225,97,225,68,222,46,214,29,200,16,180,4,155,12,155,23,167,35,176,47,180,62,183,78,183,72,119,64,77,54,54,42,42,30,36,26,35,20,31,18,25,20,15,23,6,30,0,39,-5,52,-6,77,9,91,48,98,99,100,148,100,183,147,183,145,160,143,136,139,82,139,56,141,37,147,20,156,7,169,-1,185,-4,205,0,220,12,232,29,239,49,241,69,36,-65,35,-75,34,-84,32,-93,30,-101,27,-107,70,-107,72,-102,74,-95,76,-85,77,-75,78,-64,78,15,88,7,98,1,108,-2,118,-4,130,-4,164,1,192,19,214,47,228,82,233,123,228,158,214,188,191,210,163,225,
+51,59,43,75,44,11,44,11,43,75,40,98,39,150,40,98,43,118,39,150,43,118,54,168,54,168,43,118,50,136,54,168,50,136,62,152,61,268,63,305,57,328,61,268,57,328,53,272,53,272,57,328,48,319,53,272,48,319,47,278,47,278,48,319,43,309,47,278,43,309,42,286,42,286,43,309,41,297,64,310,66,316,71,335,71,335,66,316,72,322,71,335,72,322,89,342,89,342,72,322,80,328,89,342,80,328,93,334,64,310,71,335,57,328,64,310,57,328,63,305,73,235,76,283,71,225,71,225,70,286,69,266,69,266,70,286,66,291,69,266,66,291,64,297,83,281,76,283,77,243,83,281,77,243,83,251,83,281,83,251,96,290,72,218,73,184,74,211,74,211,73,184,77,164,74,211,77,164,78,204,78,204,77,164,94,174,78,204,94,174,83,199,83,199,94,174,89,194,101,202,94,174,102,172,101,202,102,172,113,208,113,208,102,172,110,171,113,208,110,171,117,170,73,184,54,168,62,152,73,184,62,152,77,164,73,184,72,218,71,225,73,184,71,225,69,266,73,184,69,266,65,190,52,233,52,215,54,242,54,242,52,215,55,206,54,242,55,206,58,251,58,251,55,206,59,198,58,251,59,198,63,259,63,259,59,198,65,190,63,259,65,190,69,266,64,297,63,305,61,268,64,297,61,268,69,266,128,41,124,41,128,-1,128,-1,124,41,118,41,128,-1,118,41,117,-2,117,-2,118,41,111,40,117,-2,111,40,107,-4,107,-4,111,40,104,40,107,-4,104,40,98,-4,98,-4,104,40,98,40,177,29,156,38,158,-1,158,-1,156,38,143,0,137,0,143,0,156,38,137,0,156,38,128,41,128,-64,132,-108,134,-69,134,-69,132,-108,151,-104,134,-69,151,-104,140,-72,140,-72,151,-104,147,-74,159,-72,147,-74,151,-104,159,-72,151,-104,170,-93,204,-26,201,-3,199,-53,199,-53,201,-3,192,15,199,-53,192,15,188,-34,188,-34,187,-76,199,-53,158,-1,170,-5,177,29,177,29,170,-5,180,-12,177,29,180,-12,192,15,192,15,180,-12,186,-22,192,15,186,-22,188,-34,188,-34,186,-47,187,-76,187,-76,186,-47,180,-59,187,-76,180,-59,170,-93,170,-93,180,-59,170,-67,170,-93,170,-67,159,-72,110,-60,111,-103,117,-59,117,-59,111,-103,121,-107,117,-59,121,-107,123,-61,123,-61,121,-107,132,-108,123,-61,132,-108,128,-64,97,-73,98,-90,99,-68,99,-68,98,-90,103,-98,99,-68,103,-98,104,-63,104,-63,103,-98,111,-103,104,-63,111,-103,110,-60,181,186,185,197,184,204,181,186,184,204,179,210,181,186,179,210,172,214,181,186,172,214,171,178,117,170,124,170,127,213,127,213,124,170,131,170,127,213,131,170,140,216,140,216,131,170,142,170,140,216,142,170,153,217,153,217,142,170,157,173,153,217,157,173,164,216,164,216,157,173,171,178,164,216,171,178,172,214,160,307,160,271,166,305,166,305,160,271,171,280,166,305,171,280,171,301,171,301,171,280,175,291,171,301,175,291,174,297,125,303,126,260,139,306,139,306,126,260,144,264,139,306,144,264,151,307,151,307,144,264,160,271,151,307,160,271,160,307,83,251,93,256,96,290,96,290,93,256,106,258,96,290,106,258,111,297,111,297,106,258,126,260,111,297,126,260,125,303,79,42,63,48,67,0,79,42,67,0,98,-4,79,42,98,-4,98,40,51,59,44,11,67,0,51,59,67,0,63,48,29,29,44,11,40,98,29,29,40,98,39,150,29,29,39,150,27,129,29,29,27,129,20,53,20,106,17,81,20,53,20,106,20,53,27,129,113,208,117,170,127,213,98,-90,97,-73,96,-80,128,41,128,-1,137,0,52,215,52,233,51,224,94,174,101,202,89,194,70,286,71,225,76,283,76,283,73,235,77,243,
+237,114,232,151,218,183,197,208,167,224,129,230,91,223,60,203,37,174,22,139,17,101,23,67,38,38,62,15,92,0,126,-4,161,2,191,20,215,47,231,79,237,114,16383,16383,192,95,190,74,183,52,172,31,156,17,134,11,107,19,87,38,73,65,65,95,62,122,64,145,70,169,80,191,97,207,119,214,148,205,168,184,182,155,190,124,192,95,233,69,229,55,223,45,216,40,209,37,203,36,194,38,188,41,184,47,180,54,178,61,177,69,176,78,175,88,175,109,176,127,176,144,178,160,179,173,180,183,239,183,239,225,97,225,68,222,46,214,29,200,16,180,4,155,12,155,23,167,35,176,47,180,62,183,78,183,72,119,64,77,54,54,42,42,30,36,26,35,20,31,18,25,20,15,
+97,207,119,214,119,214,129,230,119,214,148,205,129,230,148,205,167,224,167,224,148,205,168,184,167,224,168,184,197,208,197,208,168,184,182,155,197,208,182,155,190,124,190,74,183,52,191,20,191,20,183,52,172,31,191,20,172,31,161,2,161,2,172,31,156,17,161,2,156,17,134,11,134,11,107,19,126,-4,126,-4,107,19,92,0,107,19,87,38,92,0,92,0,87,38,73,65,92,0,73,65,62,15,62,15,73,65,65,95,62,15,65,95,62,122,80,191,91,223,70,169,70,169,91,223,60,203,70,169,60,203,64,145,64,145,60,203,62,122,62,15,62,122,60,203,62,15,60,203,38,38,38,38,60,203,37,174,38,38,37,174,23,67,23,67,37,174,22,139,23,67,22,139,17,101,237,114,232,151,231,79,231,79,232,151,218,183,231,79,218,183,215,47,215,47,218,183,197,208,215,47,197,208,192,95,192,95,191,20,215,47,134,11,126,-4,161,2,97,207,119,214,129,230,97,207,129,230,91,223,97,207,91,223,80,191,190,74,191,20,192,95,197,208,190,124,192,95,
+233,69,229,55,223,45,216,40,209,37,203,36,194,38,188,41,184,47,180,54,178,61,177,69,176,78,175,88,175,109,176,127,176,144,178,160,179,173,180,183,239,183,239,225,97,225,68,222,46,214,29,200,16,180,4,155,12,155,23,167,35,176,47,180,62,183,78,183,72,119,64,77,54,54,42,42,30,36,26,35,20,31,18,25,20,15,23,6,30,0,39,-5,52,-6,77,9,91,48,98,99,100,148,100,183,147,183,145,160,143,136,139,82,139,56,141,37,147,20,156,7,169,-1,185,-4,205,0,220,12,232,29,239,49,241,69,36,-65,35,-75,34,-84,32,-93,30,-101,27,-107,70,-107,72,-102,74,-95,76,-85,77,-75,78,-64,78,15,88,7,98,1,108,-2,118,-4,130,-4,164,1,192,19,214,47,228,82,233,123,228,158,214,188,191,210,163,225,129,230,101,225,75,210,54,182,41,138,36,76,16383,16383,78,137,79,163,85,185,94,202,107,212,123,216,145,211,163,197,177,175,186,144,190,106,187,75,179,49,166,29,150,16,129,11,115,13,101,18,89,26,81,35,78,44,216,176,213,191,205,206,190,218,169,227,142,230,107,223,73,202,45,171,25,130,17,83,21,45,
+72,119,64,77,77,9,77,9,64,77,54,54,77,9,54,54,52,-6,52,-6,54,54,42,42,52,-6,42,42,39,-5,39,-5,42,42,30,36,39,-5,30,36,30,0,30,0,30,36,26,35,30,0,26,35,23,6,23,6,26,35,23,33,23,6,23,33,20,31,20,15,23,6,20,31,20,15,20,31,19,28,20,15,19,28,18,25,97,225,68,222,78,183,78,183,91,48,97,225,97,225,91,48,98,99,97,225,98,99,100,183,100,183,98,99,100,148,180,183,239,183,239,225,180,183,239,225,147,183,147,183,239,225,100,183,176,78,175,88,169,-1,169,-1,175,88,175,99,169,-1,175,99,175,109,175,109,176,127,169,-1,169,-1,176,127,176,144,169,-1,176,144,156,7,156,7,176,144,178,160,156,7,178,160,179,173,147,20,180,183,147,183,147,20,147,183,145,160,179,173,180,183,147,20,179,173,147,20,156,7,97,225,100,183,239,225,4,155,12,155,16,180,16,180,12,155,23,167,16,180,23,167,29,200,29,200,23,167,35,176,29,200,35,176,46,214,46,214,35,176,47,180,46,214,47,180,68,222,68,222,47,180,62,183,68,222,62,183,78,183,188,41,184,47,185,-4,185,-4,184,47,180,54,185,-4,180,54,178,61,178,61,177,69,185,-4,185,-4,177,69,169,-1,188,41,205,0,194,38,194,38,205,0,203,36,209,37,203,36,205,0,209,37,205,0,220,12,233,69,229,55,232,29,233,69,232,29,239,49,233,69,239,49,241,69,223,45,216,40,220,12,223,45,220,12,232,29,223,45,232,29,229,55,143,136,141,109,141,37,143,136,141,37,147,20,143,136,147,20,145,160,139,82,139,56,141,37,139,82,141,37,141,109,78,183,72,119,77,9,78,183,77,9,91,48,176,78,169,-1,177,69,188,41,185,-4,205,0,209,37,220,12,216,40,
+36,-65,35,-75,34,-84,32,-93,30,-101,27,-107,70,-107,72,-102,74,-95,76,-85,77,-75,78,-64,78,15,88,7,98,1,108,-2,118,-4,130,-4,164,1,192,19,214,47,228,82,233,123,228,158,214,188,191,210,163,225,129,230,101,225,75,210,54,182,41,138,36,76,16383,16383,78,137,79,163,85,185,94,202,107,212,123,216,145,211,163,197,177,175,186,144,190,106,187,75,179,49,166,29,150,16,129,11,115,13,101,18,89,26,81,35,78,44,216,176,213,191,205,206,190,218,169,227,142,230,107,223,73,202,45,171,25,130,17,83,21,45,33,20,50,5,71,-2,95,-4,105,-4,117,-2,128,-1,137,0,143,0,158,-1,170,-5,180,-12,186,-22,188,-34,186,-47,180,-58,170,-67,159,-72,147,-74,140,-72,134,-69,128,-64,123,-61,117,-59,110,-60,104,-63,99,-68,97,-73,96,-80,98,-90,103,-98,111,-103,121,-107,132,-108,151,-104,170,-93,187,-76,199,-55,204,-29,201,-3,192,16,177,30,156,38,
+107,212,123,216,123,216,129,230,123,216,145,211,129,230,145,211,163,225,163,225,145,211,163,197,163,225,163,197,191,210,191,210,163,197,177,175,191,210,177,175,186,144,191,210,190,106,192,19,191,210,192,19,214,188,214,188,192,19,214,47,214,188,214,47,228,158,228,158,214,47,228,82,228,158,228,82,233,123,192,19,190,106,187,75,192,19,187,75,179,49,192,19,179,49,166,29,192,19,166,29,164,1,129,11,130,-4,150,16,150,16,130,-4,164,1,150,16,164,1,166,29,130,-4,129,11,118,-4,118,-4,129,11,115,13,118,-4,115,13,108,-2,108,-2,115,13,101,18,108,-2,101,18,98,1,98,1,101,18,89,26,98,1,89,26,88,7,88,7,89,26,81,35,88,7,81,35,78,44,85,185,94,202,101,225,101,225,94,202,107,212,101,225,107,212,129,230,129,230,107,212,123,216,78,137,79,163,75,210,78,137,75,210,76,-85,78,137,76,-85,77,-75,78,137,77,-75,78,-64,75,210,79,163,85,185,75,210,85,185,101,225,75,210,54,182,70,-107,75,210,70,-107,72,-102,75,210,72,-102,74,-95,75,210,74,-95,76,-85,70,-107,54,182,41,138,70,-107,41,138,36,76,70,-107,36,76,36,-65,70,-107,36,-65,35,-75,70,-107,35,-75,34,-84,70,-107,34,-84,32,-93,70,-107,32,-93,30,-101,70,-107,30,-101,27,-107,78,44,78,15,88,7,191,210,186,144,190,106,
+216,176,213,191,205,206,190,218,169,227,142,230,107,223,73,202,45,171,25,130,17,83,21,45,33,20,50,5,71,-2,95,-4,105,-4,117,-2,128,-1,137,0,143,0,158,-1,170,-5,180,-12,186,-22,188,-34,186,-47,180,-58,170,-67,159,-72,147,-74,140,-72,134,-69,128,-64,123,-61,117,-59,110,-60,104,-63,99,-68,97,-73,96,-80,98,-90,103,-98,111,-103,121,-107,132,-108,151,-104,170,-93,187,-76,199,-55,204,-29,201,-3,192,16,177,30,156,38,128,41,119,41,115,40,103,40,78,45,60,54,48,68,42,85,41,105,45,135,58,158,76,174,97,183,118,186,141,182,158,174,170,163,181,155,192,151,201,153,208,157,212,163,215,169,216,176,259,183,259,225,119,225,87,220,58,207,35,184,20,151,15,108,20,73,35,42,58,18,87,1,119,-4,156,1,187,16,212,38,228,65,233,94,229,121,218,138,203,152,186,165,171,183,16383,16383,189,85,186,63,180,42,168,25,152,13,131,9,110,15,90,30,75,54,64,84,60,117,65,145,78,164,97,176,118,182,137,183,153,172,167,155,178,134,186,110,189,85,221,183,221,225,81,225,55,219,34,204,18,183,7,160,2,138,9,138,16,153,25,166,37,175,50,181,66,183,107,183,102,164,96,142,92,119,88,95,87,71,89,49,94,28,103,11,118,0,138,-4,157,0,172,10,183,27,191,48,193,71,185,71,182,59,176,49,169,42,
+60,54,48,68,50,5,50,5,48,68,42,85,50,5,42,85,33,20,33,20,42,85,41,105,45,171,41,105,45,135,45,171,45,135,73,202,73,202,45,135,58,158,73,202,58,158,76,174,73,202,76,174,107,223,107,223,76,174,97,183,107,223,97,183,118,186,118,186,141,182,142,230,142,230,141,182,158,174,142,230,158,174,169,227,169,227,158,174,170,163,169,227,170,163,190,218,190,218,170,163,181,155,190,218,181,155,192,151,17,83,21,45,25,130,25,130,21,45,33,20,25,130,33,20,45,171,45,171,33,20,41,105,177,30,156,38,158,-1,158,-1,156,38,143,0,137,0,143,0,156,38,137,0,156,38,128,41,128,-1,137,0,128,41,128,-1,128,41,123,41,128,-1,123,41,119,41,128,-1,119,41,117,-2,105,-4,117,-2,107,40,111,40,107,40,117,-2,111,40,117,-2,115,40,115,40,117,-2,119,41,60,54,71,-2,78,45,78,45,71,-2,95,-4,78,45,95,-4,103,40,103,40,95,-4,105,-4,103,40,105,-4,107,40,128,-64,132,-108,134,-69,134,-69,132,-108,151,-104,134,-69,151,-104,140,-72,140,-72,151,-104,147,-74,159,-72,147,-74,151,-104,159,-72,151,-104,170,-93,204,-29,201,-3,199,-55,199,-55,201,-3,192,16,199,-55,192,16,188,-34,188,-34,187,-76,199,-55,158,-1,170,-5,177,30,177,30,170,-5,180,-12,177,30,180,-12,192,16,192,16,180,-12,186,-22,192,16,186,-22,188,-34,187,-76,188,-34,186,-47,187,-76,186,-47,180,-58,187,-76,180,-58,170,-67,187,-76,170,-67,170,-93,110,-60,111,-103,117,-59,117,-59,111,-103,121,-107,117,-59,121,-107,123,-61,123,-61,121,-107,132,-108,123,-61,132,-108,128,-64,97,-73,98,-90,99,-68,99,-68,98,-90,103,-98,99,-68,103,-98,104,-63,104,-63,103,-98,111,-103,104,-63,111,-103,110,-60,213,191,205,206,208,157,213,191,208,157,212,163,213,191,212,163,215,169,213,191,215,169,216,176,205,206,190,218,192,151,205,206,192,151,201,153,205,206,201,153,208,157,142,230,107,223,118,186,98,-90,97,-73,96,-80,159,-72,170,-93,170,-67,60,54,50,5,71,-2,
+259,183,259,225,119,225,87,220,58,207,35,184,20,151,15,108,20,73,35,42,58,18,87,1,119,-4,156,1,187,16,212,38,228,65,233,94,229,121,218,138,203,152,186,165,171,183,16383,16383,189,85,186,63,180,42,168,25,152,13,131,9,110,15,90,30,75,54,64,84,60,117,65,145,78,164,97,176,118,182,137,183,153,172,167,155,178,134,186,110,189,85,221,183,221,225,81,225,55,219,34,204,18,183,7,160,2,138,9,138,16,153,25,166,37,175,50,181,66,183,107,183,102,164,96,142,92,119,88,95,87,71,89,49,94,28,103,11,118,0,138,-4,157,0,172,10,183,27,191,48,193,71,185,71,182,59,176,49,169,42,161,38,151,36,141,39,133,47,128,59,125,74,124,91,125,113,128,135,131,155,134,172,
+186,63,180,42,187,16,187,16,180,42,168,25,187,16,168,25,156,1,156,1,168,25,152,13,156,1,152,13,131,9,131,9,110,15,119,-4,119,-4,110,15,90,30,119,-4,90,30,87,1,87,1,90,30,75,54,87,1,75,54,64,84,58,207,60,117,65,145,58,207,65,145,87,220,87,220,65,145,78,164,87,220,78,164,97,176,58,18,87,1,64,84,58,18,64,84,60,117,58,18,60,117,58,207,58,18,58,207,35,184,58,18,35,184,35,42,20,151,15,108,20,73,20,151,20,73,35,42,20,151,35,42,35,184,153,172,167,155,171,183,171,183,167,155,178,134,171,183,259,225,137,183,119,225,87,220,97,176,119,225,97,176,118,182,119,225,118,182,137,183,119,225,137,183,259,225,137,183,153,172,171,183,233,94,229,121,228,65,228,65,229,121,218,138,228,65,218,138,212,38,212,38,218,138,203,152,212,38,203,152,189,85,189,85,203,152,186,165,189,85,186,165,186,110,186,165,171,183,178,134,186,165,178,134,186,110,189,85,187,16,212,38,131,9,119,-4,156,1,186,63,187,16,189,85,259,225,171,183,259,183,
+221,183,221,225,81,225,55,219,34,204,18,183,7,160,2,138,9,138,16,153,25,166,37,175,50,181,66,183,107,183,102,164,96,142,92,119,88,95,87,71,89,49,94,28,103,11,118,0,138,-4,157,0,172,10,183,27,191,48,193,71,185,71,182,59,176,49,169,42,161,38,151,36,141,39,133,47,128,59,125,74,124,91,125,113,128,135,131,155,134,172,136,183,127,230,127,220,139,218,149,214,159,209,168,201,177,191,186,176,193,159,198,141,201,122,202,104,200,75,193,49,182,28,165,14,142,9,121,14,106,28,97,47,92,68,91,87,91,193,90,205,86,215,80,222,71,226,60,228,47,225,36,216,26,203,16,188,8,172,15,170,18,176,28,188,33,193,39,194,43,192,46,187,48,180,49,170,49,99,51,66,60,38,76,15,
+9,138,16,153,18,183,18,183,16,153,25,166,18,183,25,166,34,204,34,204,25,166,37,175,34,204,37,175,55,219,55,219,37,175,50,181,55,219,50,181,66,183,81,225,66,183,107,183,81,225,107,183,221,225,221,225,107,183,136,183,221,225,136,183,221,183,7,160,2,138,9,138,7,160,9,138,18,183,118,0,125,74,124,91,124,91,125,113,118,0,118,0,125,113,107,183,118,0,107,183,103,11,103,11,107,183,102,164,103,11,102,164,96,142,128,135,131,155,107,183,107,183,131,155,134,172,107,183,134,172,136,183,138,-4,157,0,141,39,141,39,157,0,151,36,161,38,151,36,157,0,161,38,157,0,172,10,185,71,182,59,183,27,185,71,183,27,191,48,185,71,191,48,193,71,176,49,169,42,172,10,176,49,172,10,183,27,176,49,183,27,182,59,138,-4,141,39,133,47,138,-4,133,47,128,59,138,-4,128,59,125,74,138,-4,125,74,118,0,103,11,96,142,94,28,94,28,96,142,92,119,94,28,92,119,89,49,89,49,92,119,88,95,89,49,88,95,87,71,161,38,172,10,169,42,66,183,81,225,55,219,128,135,107,183,125,113,
+127,230,127,220,139,218,149,214,159,209,168,201,177,191,186,176,193,159,198,141,201,122,202,104,200,75,193,49,182,28,165,14,142,9,121,14,106,28,97,47,92,68,91,87,91,193,90,205,86,215,80,222,71,226,60,228,47,225,36,216,26,203,16,188,8,172,15,170,18,176,28,188,33,193,39,194,43,192,46,187,48,180,49,170,49,99,51,66,60,38,76,15,102,0,139,-4,174,1,204,18,227,43,242,75,247,113,241,155,226,188,202,211,173,225,141,230,134,9,124,10,114,13,104,18,94,25,86,34,76,52,68,72,63,94,61,116,60,137,63,166,73,189,88,206,109,216,134,221,134,228,132,229,129,229,126,230,121,230,84,224,54,207,33,181,19,150,15,114,19,78,33,46,55,20,85,3,123,-3,134,-4,134,-107,176,-107,176,-4,220,1,254,18,277,43,292,75,296,111,291,151,278,184,258,209,233,224,207,230,195,229,184,226,175,221,167,215,160,208,148,187,141,162,137,134,135,105,134,76,16383,16383,176,9,176,129,
+18,176,23,182,26,203,26,203,23,182,28,188,26,203,28,188,36,216,36,216,28,188,33,193,36,216,33,193,39,194,39,194,43,192,47,225,47,225,43,192,46,187,47,225,46,187,48,180,16,188,8,172,15,170,16,188,15,170,18,176,16,188,18,176,26,203,49,99,51,66,49,159,49,170,49,159,60,228,49,170,60,228,48,180,48,180,60,228,47,225,91,87,91,193,90,205,91,87,90,205,86,215,91,87,86,215,80,222,91,87,80,222,92,68,141,230,127,230,139,218,141,230,139,218,149,214,141,230,149,214,173,225,200,75,193,49,204,18,204,18,193,49,182,28,204,18,182,28,174,1,174,1,182,28,165,14,174,1,165,14,142,9,142,9,121,14,139,-4,139,-4,121,14,106,28,139,-4,106,28,102,0,102,0,106,28,97,47,102,0,97,47,92,68,76,15,102,0,92,68,76,15,92,68,80,222,76,15,80,222,71,226,76,15,71,226,60,228,76,15,60,228,60,38,60,228,49,159,51,66,60,228,51,66,60,38,47,225,36,216,39,194,149,214,159,209,173,225,173,225,159,209,168,201,173,225,168,201,177,191,177,191,186,176,202,211,202,211,186,176,193,159,202,211,193,159,198,141,202,211,202,104,204,18,202,211,204,18,226,188,226,188,204,18,227,43,226,188,227,43,241,155,241,155,227,43,242,75,241,155,242,75,247,113,202,211,198,141,201,122,202,211,201,122,202,104,202,211,173,225,177,191,142,9,139,-4,174,1,200,75,204,18,202,104,139,218,127,230,127,220,
+134,9,124,10,114,13,104,18,94,25,86,34,76,52,68,72,63,94,61,116,60,137,63,166,73,189,88,206,109,216,134,221,134,228,132,229,129,229,126,230,121,230,84,224,54,207,33,181,19,150,15,114,19,78,33,46,55,20,85,3,123,-3,134,-4,134,-107,176,-107,176,-4,220,1,254,18,277,43,292,75,296,111,291,151,278,184,258,209,233,224,207,230,195,229,184,226,175,221,167,215,160,208,148,187,141,162,137,134,135,105,134,76,16383,16383,176,9,176,129,177,155,178,179,182,198,189,211,201,216,218,209,232,190,243,164,249,134,252,103,250,74,243,49,231,28,214,14,191,9,243,225,194,225,123,93,113,139,103,177,92,206,79,224,63,230,49,227,38,217,31,202,27,182,26,156,34,156,37,171,41,182,46,190,51,194,56,195,67,192,77,183,85,168,93,147,101,119,110,78,6,-104,55,-104,126,26,136,-34,141,-57,148,-78,157,-94,168,-105,182,-109,198,-104,209,-90,216,-71,219,-52,220,-34,213,-34,210,-49,206,-61,201,-68,195,-72,187,-74,188,-74,177,-71,168,-63,160,-48,153,-27,147,1,138,41,342,228,332,230,316,230,290,224,273,209,262,187,256,162,254,136,253,103,249,69,239,39,223,17,197,9,197,225,155,225,155,9,129,17,112,39,103,69,99,104,98,137,
+61,116,60,137,60,137,55,20,60,137,54,207,55,20,54,207,33,46,33,46,54,207,33,181,33,46,33,181,19,78,19,78,33,181,19,150,19,78,19,150,15,114,63,94,55,20,68,72,68,72,55,20,85,3,68,72,85,3,76,52,76,52,85,3,86,34,94,25,86,34,85,3,94,25,85,3,123,-3,61,116,60,137,55,20,61,116,55,20,63,94,135,105,134,76,176,-107,176,-107,134,76,134,9,176,-107,134,9,134,-4,134,-4,134,9,124,10,134,-4,124,10,123,-3,123,-3,124,10,114,13,123,-3,114,13,104,18,134,221,134,228,132,229,134,221,132,229,129,229,134,221,129,229,126,230,134,221,126,230,124,230,134,221,124,230,121,230,134,221,121,230,109,216,175,221,176,-107,176,129,176,9,176,-4,220,1,176,9,220,1,191,9,191,9,220,1,214,14,207,230,201,216,218,209,207,230,218,209,233,224,233,224,218,209,232,190,233,224,232,190,243,164,178,179,182,198,184,226,184,226,182,198,189,211,184,226,189,211,195,229,195,229,189,211,201,216,195,229,201,216,207,230,175,221,176,129,177,155,175,221,177,155,178,179,175,221,178,179,184,226,176,-107,175,221,167,215,176,-107,167,215,160,208,176,-107,160,208,148,187,176,-107,148,187,141,162,176,-107,141,162,137,134,176,-107,137,134,135,105,296,111,291,151,292,75,292,75,291,151,278,184,292,75,278,184,277,43,277,43,278,184,258,209,277,43,258,209,254,18,254,18,258,209,252,103,254,18,252,103,250,74,254,18,250,74,243,49,258,209,233,224,243,164,258,209,243,164,249,134,258,209,249,134,252,103,231,28,214,14,220,1,231,28,220,1,254,18,231,28,254,18,243,49,63,166,73,189,84,224,84,224,73,189,88,206,84,224,88,206,121,230,121,230,88,206,109,216,63,166,84,224,54,207,63,166,54,207,60,137,176,-107,134,-4,134,-107,94,25,123,-3,104,18,
+243,225,194,225,123,93,113,139,103,177,92,206,79,224,63,230,49,227,38,217,31,202,27,182,26,156,34,156,37,171,41,182,46,190,51,194,56,195,67,192,77,183,85,168,93,147,101,119,110,78,6,-104,55,-104,126,26,136,-34,141,-57,148,-78,157,-94,168,-105,182,-109,198,-104,209,-90,216,-71,219,-52,220,-34,213,-34,210,-49,206,-61,201,-68,195,-72,187,-74,188,-74,177,-71,168,-63,160,-48,153,-27,147,1,138,41,342,228,332,230,316,230,290,224,273,209,262,187,256,162,254,136,253,103,249,69,239,39,223,17,197,9,197,225,155,225,155,9,129,17,112,39,103,69,99,104,98,137,96,163,90,188,78,210,61,224,36,230,31,230,25,229,14,229,10,228,10,220,30,210,42,190,49,164,52,137,52,114,55,72,65,39,84,15,114,0,155,-4,155,-107,197,-107,197,-4,236,0,265,16,285,41,296,74,300,114,300,137,303,164,310,190,
+79,224,63,230,67,192,67,192,63,230,56,195,51,194,56,195,63,230,51,194,63,230,49,227,194,225,123,93,126,26,126,26,123,93,113,139,126,26,113,139,110,78,110,78,113,139,103,177,110,78,103,177,101,119,67,192,77,183,79,224,79,224,77,183,85,168,79,224,85,168,92,206,92,206,85,168,93,147,92,206,93,147,103,177,103,177,93,147,101,119,138,41,243,225,194,225,138,41,194,225,126,26,138,41,126,26,136,-34,138,41,136,-34,141,-57,138,41,141,-57,147,1,110,78,6,-104,55,-104,110,78,55,-104,126,26,210,-49,206,-61,209,-90,209,-90,206,-61,201,-68,209,-90,201,-68,198,-104,198,-104,201,-68,195,-72,198,-104,195,-72,188,-74,187,-74,188,-74,177,-71,187,-74,177,-71,182,-109,182,-109,177,-71,168,-105,177,-71,168,-63,168,-105,168,-105,168,-63,160,-48,168,-105,160,-48,157,-94,157,-94,160,-48,153,-27,157,-94,153,-27,148,-78,148,-78,153,-27,147,1,148,-78,147,1,141,-57,216,-71,219,-52,220,-34,216,-71,220,-34,213,-34,216,-71,213,-34,210,-49,216,-71,210,-49,209,-90,187,-74,182,-109,198,-104,187,-74,198,-104,188,-74,34,156,37,171,38,217,38,217,37,171,41,182,38,217,41,182,49,227,49,227,41,182,46,190,49,227,46,190,51,194,34,156,38,217,31,202,34,156,31,202,27,182,34,156,27,182,26,156,
+342,228,332,230,316,230,290,224,273,209,262,187,256,162,254,136,253,103,249,69,239,39,223,17,197,9,197,225,155,225,155,9,129,17,112,39,103,69,99,104,98,137,96,163,90,188,78,210,61,224,36,230,31,230,25,229,14,229,10,228,10,220,30,210,42,190,49,164,52,137,52,114,55,72,65,39,84,15,114,0,155,-4,155,-107,197,-107,197,-4,236,0,265,16,285,41,296,74,300,114,300,137,303,164,310,190,322,211,342,221,180,223,206,218,226,203,240,179,249,146,252,104,252,76,248,51,242,29,229,14,210,9,200,12,190,20,181,33,174,51,170,73,173,85,177,105,178,115,179,127,177,145,174,158,169,168,163,173,156,175,149,173,143,168,138,159,135,145,133,126,134,114,135,103,137,94,139,84,142,73,138,51,132,33,123,20,113,12,100,9,82,15,71,31,64,54,61,81,60,109,63,149,73,180,88,204,108,218,132,223,132,230,94,225,62,211,37,186,
+239,39,223,17,236,0,236,0,223,17,197,9,197,-107,197,9,155,-4,197,225,155,225,155,-4,197,225,155,-4,197,9,155,225,155,9,155,-4,155,-4,155,9,129,17,155,-4,129,17,114,0,114,0,129,17,112,39,114,0,112,39,103,69,99,104,98,137,96,163,99,104,96,163,90,188,99,104,90,188,84,15,99,104,84,15,103,69,52,114,55,72,61,224,61,224,55,72,65,39,61,224,65,39,78,210,78,210,65,39,84,15,78,210,84,15,90,188,42,190,49,164,61,224,61,224,49,164,52,137,61,224,52,137,52,114,61,224,36,230,42,190,42,190,36,230,31,230,42,190,31,230,30,210,30,210,31,230,25,229,30,210,25,229,19,229,14,229,10,228,30,210,14,229,30,210,19,229,262,187,256,162,265,16,265,16,256,162,254,136,265,16,254,136,253,103,342,221,342,228,337,229,342,221,337,229,332,230,342,221,332,230,327,230,342,221,327,230,322,211,303,164,310,190,316,230,316,230,310,190,322,211,316,230,322,211,321,230,321,230,322,211,327,230,262,187,265,16,273,209,273,209,265,16,285,41,273,209,285,41,290,224,290,224,285,41,296,74,290,224,296,74,300,137,300,137,296,74,300,114,290,224,300,137,303,164,290,224,303,164,316,230,265,16,253,103,249,69,265,16,249,69,239,39,265,16,239,39,236,0,197,9,197,-4,236,0,197,-107,155,-4,155,-107,30,210,10,228,10,220,103,69,84,15,114,0,
+180,223,206,218,226,203,240,179,249,146,252,104,252,76,248,51,242,29,229,14,210,9,200,12,190,20,181,33,174,51,170,73,173,85,177,105,178,115,179,127,177,145,174,158,169,168,163,173,156,175,149,173,143,168,138,159,135,145,133,126,134,114,135,103,137,94,139,84,142,73,138,51,132,33,123,20,113,12,100,9,82,15,71,31,64,54,61,81,60,109,63,149,73,180,88,204,108,218,132,223,132,230,94,225,62,211,37,186,20,151,15,104,15,84,18,66,23,50,30,35,39,23,49,13,59,5,70,0,81,-3,93,-4,109,-2,123,3,136,12,147,26,156,43,164,26,175,12,187,3,202,-2,218,-4,230,-3,242,0,253,5,263,13,273,23,282,35,289,49,294,66,296,85,297,105,292,152,275,187,250,211,218,225,180,230,158,286,157,294,153,301,148,306,141,310,133,311,125,310,118,306,113,301,110,294,108,286,109,278,113,272,118,266,125,263,132,262,140,263,148,266,153,272,157,278,158,286,16383,16383,59,286,57,294,54,301,48,306,41,310,33,311,26,310,19,306,14,301,10,294,9,286,10,278,14,272,19,266,25,263,33,262,41,263,48,266,54,272,57,278,59,286,16383,16383,138,54,132,43,127,36,122,31,118,29,112,28,108,29,105,31,103,33,102,36,102,228,99,230,84,224,68,219,53,214,37,208,22,204,22,195,27,196,49,196,54,193,57,188,59,181,60,172,60,39,61,26,63,14,69,4,77,-2,89,-4,104,-1,117,7,128,20,138,35,146,50,202,286,201,294,197,301,192,306,185,310,177,311,169,310,162,306,157,301,154,294,152,286,154,278,
+71,31,64,54,70,0,70,0,64,54,61,81,70,0,61,81,59,5,59,5,61,81,60,109,62,211,60,109,63,149,62,211,63,149,73,180,108,218,132,223,132,230,108,218,132,230,94,225,108,218,94,225,88,204,94,225,62,211,73,180,94,225,73,180,88,204,23,50,30,35,37,186,37,186,30,35,39,23,37,186,39,23,62,211,62,211,39,23,49,13,62,211,49,13,60,109,60,109,49,13,59,5,20,151,15,104,15,84,20,151,15,84,18,66,20,151,18,66,23,50,20,151,23,50,37,186,81,-3,93,-4,82,15,82,15,93,-4,100,9,113,12,100,9,109,-2,113,12,109,-2,123,3,71,31,70,0,81,-3,71,31,81,-3,82,15,174,51,170,73,175,12,174,158,170,73,173,85,174,158,173,85,175,95,177,145,174,158,175,95,177,145,175,95,177,105,177,145,177,105,178,115,177,145,178,115,179,127,156,175,156,43,163,173,163,173,156,43,164,26,163,173,164,26,169,168,169,168,164,26,170,73,169,168,170,73,174,158,174,51,175,12,181,33,181,33,175,12,187,3,181,33,187,3,190,20,190,20,187,3,202,-2,190,20,202,-2,200,12,200,12,202,-2,210,9,229,14,210,9,218,-4,229,14,218,-4,230,-3,282,35,289,49,292,152,292,152,289,49,294,66,292,152,294,66,297,105,297,105,294,66,296,85,275,187,250,211,252,104,275,187,252,104,253,5,275,187,253,5,263,13,275,187,263,13,273,23,275,187,273,23,282,35,275,187,282,35,292,152,240,179,249,146,250,211,250,211,249,146,252,104,253,5,252,104,252,76,240,179,250,211,226,203,226,203,250,211,218,225,226,203,218,225,206,218,206,218,218,225,180,230,206,218,180,230,180,223,229,14,230,-3,242,29,242,29,230,-3,242,0,242,29,242,0,248,51,248,51,242,0,253,5,248,51,253,5,252,76,210,9,202,-2,218,-4,139,84,142,73,143,168,143,168,142,73,147,26,143,168,147,26,149,173,149,173,147,26,156,43,149,173,156,43,156,175,147,26,142,73,138,51,147,26,138,51,136,12,136,12,138,51,132,33,136,12,132,33,123,3,123,3,132,33,123,20,123,3,123,20,113,12,138,159,135,145,135,103,138,159,135,103,137,94,138,159,137,94,139,84,138,159,139,84,143,168,135,145,133,126,134,114,135,145,134,114,135,103,100,9,93,-4,109,-2,170,73,164,26,175,12,
+272,145,263,146,255,146,246,147,238,148,230,150,229,176,225,203,220,230,212,257,201,281,191,300,179,316,163,329,144,338,121,342,100,339,80,331,63,316,50,294,46,264,53,226,74,194,104,168,142,149,185,137,186,133,186,116,185,85,180,56,171,32,157,15,137,9,115,14,101,28,91,46,87,66,85,84,85,110,84,131,81,145,76,154,67,159,55,160,43,158,31,151,20,140,9,125,0,105,7,100,15,114,20,123,25,128,29,131,33,132,37,131,39,128,42,123,43,115,44,104,44,93,46,61,55,34,72,13,97,0,133,-4,172,3,200,26,217,58,227,95,230,134,247,134,256,135,272,137,16383,16383,185,161,141,182,112,208,95,235,86,260,84,280,86,295,91,307,99,316,109,321,119,323,135,320,149,310,162,289,173,253,181,200,181,198,182,193,183,184,184,174,185,161,198,208,186,255,169,291,146,317,117,332,81,337,67,336,53,332,39,327,26,319,15,311,18,303,25,305,33,308,41,310,49,311,55,312,84,306,109,289,130,257,146,211,157,147,157,61,156,39,153,25,144,16,130,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,126,211,167,220,219,236,270,261,309,296,325,299,325,305,323,308,321,309,319,307,315,296,304,291,295,289,285,290,276,294,268,301,262,308,259,318,257,329,259,338,265,344,273,348,284,349,295,346,309,339,320,329,330,317,336,303,338,268,330,241,308,221,277,207,242,199,208,176,342,134,342,134,230,126,230,86,224,55,206,32,180,19,149,15,114,19,79,33,47,55,20,85,2,123,-4,134,-4,134,-107,176,-107,176,-4,223,2,257,21,280,48,292,81,296,116,294,143,286,168,272,190,
+20,123,25,128,31,151,31,151,25,128,29,131,31,151,29,131,33,132,33,132,37,131,43,158,43,158,37,131,39,128,43,158,39,128,42,123,0,105,7,100,9,125,9,125,7,100,15,114,9,125,15,114,20,140,20,140,15,114,20,123,20,140,20,123,31,151,44,104,46,61,55,160,55,160,46,61,55,34,55,160,55,34,67,159,67,159,55,34,72,13,67,159,72,13,76,154,76,154,72,13,87,66,76,154,87,66,85,84,85,84,85,110,84,131,85,84,84,131,81,145,85,84,81,145,76,154,121,342,119,323,135,320,121,342,135,320,144,338,144,338,135,320,149,310,144,338,149,310,163,329,163,329,149,310,162,289,163,329,162,289,173,253,180,56,171,32,172,3,172,3,171,32,157,15,172,3,157,15,137,9,137,9,115,14,133,-4,133,-4,115,14,101,28,133,-4,101,28,97,0,97,0,101,28,91,46,97,0,91,46,87,66,43,115,44,104,55,160,43,115,55,160,43,158,43,115,43,158,42,123,43,158,31,151,33,132,272,137,272,145,264,136,264,136,272,145,263,146,264,136,263,146,256,135,256,135,263,146,255,146,256,135,255,146,247,134,247,134,255,146,246,147,247,134,246,147,238,134,238,134,246,147,238,148,238,134,238,148,230,150,230,150,229,176,230,134,230,134,229,176,227,95,229,176,225,203,227,95,227,95,225,203,220,230,227,95,220,230,217,58,217,58,220,230,212,257,217,58,212,257,201,281,217,58,201,281,200,26,200,26,201,281,191,300,200,26,191,300,186,116,186,116,185,85,200,26,200,26,185,85,180,56,200,26,180,56,172,3,137,9,133,-4,172,3,238,134,230,150,230,134,91,307,99,316,100,339,100,339,99,316,109,321,100,339,109,321,121,342,121,342,109,321,119,323,80,331,84,280,86,295,80,331,86,295,100,339,100,339,86,295,91,307,191,300,179,316,181,200,191,300,181,200,181,198,191,300,181,198,182,193,191,300,182,193,183,184,191,300,183,184,184,174,191,300,184,174,185,161,191,300,185,161,185,137,191,300,185,137,186,133,191,300,186,133,186,129,191,300,186,129,186,124,191,300,186,124,186,120,191,300,186,120,186,116,185,161,141,182,142,149,185,161,142,149,185,137,112,208,95,235,104,168,112,208,104,168,142,149,112,208,142,149,141,182,86,260,84,280,74,194,86,260,74,194,104,168,86,260,104,168,95,235,84,280,80,331,74,194,74,194,80,331,63,316,74,194,63,316,53,226,53,226,63,316,50,294,53,226,50,294,46,264,173,253,181,200,179,316,173,253,179,316,163,329,46,61,44,104,44,93,87,66,72,13,97,0,
+176,342,134,342,134,230,126,230,86,224,55,206,32,180,19,149,15,114,19,79,33,47,55,20,85,2,123,-4,134,-4,134,-107,176,-107,176,-4,223,2,257,21,280,48,292,81,296,116,294,143,286,168,272,190,254,208,230,222,221,225,211,228,189,230,176,230,16383,16383,176,9,176,216,203,210,225,193,240,168,249,137,252,102,249,73,243,48,231,27,214,14,191,9,16383,16383,135,9,125,10,114,13,104,18,95,25,86,34,77,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,99,212,120,216,135,216,363,183,363,225,77,225,53,219,33,204,18,183,8,160,3,137,11,137,18,152,27,164,36,174,48,181,61,183,84,183,76,169,69,153,64,137,61,120,60,103,64,64,76,34,92,12,112,0,134,-4,153,-2,169,3,182,12,193,26,201,43,210,25,221,12,233,2,247,-2,261,-4,286,0,309,12,327,33,339,63,343,102,342,119,340,136,336,153,329,169,320,183,16383,16383,279,183,285,171,291,155,295,138,297,120,298,103,297,76,293,51,286,29,275,15,258,9,246,12,236,20,226,33,219,51,215,74,218,82,
+296,116,294,143,292,81,292,81,294,143,286,168,292,81,286,168,280,48,280,48,286,168,272,190,280,48,272,190,257,21,257,21,272,190,254,208,257,21,254,208,252,102,221,225,225,193,230,222,230,222,225,193,240,168,230,222,240,168,254,208,254,208,240,168,249,137,254,208,249,137,252,102,211,228,200,229,203,210,211,228,203,210,225,193,211,228,225,193,221,225,200,229,189,230,203,210,203,210,189,230,176,230,203,210,176,230,176,216,176,216,176,230,176,342,176,216,176,342,135,216,135,216,176,342,134,342,135,216,134,342,134,230,257,21,252,102,249,73,257,21,249,73,243,48,257,21,243,48,231,27,257,21,231,27,223,2,231,27,214,14,223,2,223,2,214,14,191,9,223,2,191,9,176,-4,176,-4,191,9,176,9,176,-4,176,9,176,-107,176,-107,176,9,135,216,176,-107,135,216,135,9,134,-4,134,-107,176,-107,134,-4,176,-107,135,9,134,-4,135,9,125,10,134,-4,125,10,123,-4,69,70,85,2,77,51,77,51,85,2,86,34,95,25,86,34,85,2,95,25,85,2,123,-4,82,202,86,224,70,186,70,186,86,224,55,206,70,186,55,206,62,164,62,164,55,206,60,137,61,113,60,137,55,20,61,113,55,20,64,91,64,91,55,20,85,2,64,91,85,2,69,70,123,-4,125,10,114,13,123,-4,114,13,104,18,123,-4,104,18,95,25,126,230,86,224,99,212,126,230,99,212,120,216,126,230,120,216,135,216,126,230,135,216,134,230,55,20,60,137,55,206,55,20,55,206,33,47,33,47,55,206,32,180,33,47,32,180,19,79,19,79,32,180,19,149,19,79,19,149,15,114,86,224,82,202,99,212,176,216,135,216,176,9,
+363,183,363,225,77,225,53,219,33,204,18,183,8,160,3,137,11,137,18,152,27,164,36,174,48,181,61,183,84,183,76,169,69,153,64,137,61,120,60,103,64,64,76,34,92,12,112,0,134,-4,153,-2,169,3,182,12,193,26,201,43,210,25,221,12,233,2,247,-2,261,-4,286,0,309,12,327,33,339,63,343,102,342,119,340,136,336,153,329,169,320,183,16383,16383,279,183,285,171,291,155,295,138,297,120,298,103,297,76,293,51,286,29,275,15,258,9,246,12,236,20,226,33,219,51,215,74,218,82,220,90,222,99,224,115,223,126,221,138,217,149,211,156,202,159,193,156,186,149,182,139,180,127,179,116,180,107,181,99,185,81,188,74,183,51,176,33,167,19,156,12,143,9,126,15,115,30,108,52,106,76,105,99,106,118,108,137,112,153,118,169,125,183,155,-46,154,-68,151,-83,143,-91,129,-96,108,-98,108,-107,254,-107,254,-98,233,-96,219,-92,211,-84,207,-71,206,-52,206,-4,252,8,290,33,319,68,337,113,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,23,114,42,69,71,33,109,8,155,-4,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,103,-107,146,-107,146,-2,176,7,200,26,219,50,231,81,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,
+11,137,18,152,18,183,18,183,18,152,27,164,18,183,27,164,33,204,33,204,27,164,36,174,33,204,36,174,53,219,53,219,36,174,48,181,53,219,48,181,61,183,77,225,61,183,84,183,77,225,84,183,363,225,363,225,84,183,125,183,363,225,125,183,279,183,8,160,3,137,11,137,8,160,11,137,18,183,108,137,112,153,84,183,84,183,112,153,118,169,84,183,118,169,125,183,108,52,112,0,115,30,115,30,112,0,134,-4,115,30,134,-4,126,15,126,15,134,-4,143,9,156,12,143,9,153,-2,156,12,153,-2,169,3,105,99,92,12,106,76,106,76,92,12,112,0,106,76,112,0,108,52,219,51,215,74,221,12,217,149,215,74,218,82,217,149,218,82,221,138,221,138,218,82,220,90,221,138,220,90,222,99,223,126,221,138,222,99,223,126,222,99,223,107,223,126,223,107,224,115,188,74,193,26,193,156,193,156,193,26,201,43,193,156,201,43,202,159,202,159,201,43,210,25,202,159,210,25,211,156,211,156,210,25,215,74,211,156,215,74,217,149,219,51,221,12,226,33,226,33,221,12,233,2,226,33,233,2,236,20,236,20,233,2,247,-2,236,20,247,-2,246,12,246,12,247,-2,258,9,275,15,258,9,261,-4,275,15,261,-4,286,0,363,225,279,183,285,171,363,225,285,171,291,155,363,225,291,155,320,183,363,225,320,183,363,183,340,136,336,153,339,63,339,63,336,153,329,169,339,63,329,169,327,33,327,33,329,169,320,183,327,33,320,183,309,12,309,12,320,183,298,103,291,155,295,138,320,183,320,183,295,138,297,120,320,183,297,120,298,103,106,118,108,137,84,183,106,118,84,183,92,12,106,118,92,12,105,99,340,136,339,63,343,102,340,136,343,102,342,119,309,12,298,103,297,76,309,12,297,76,293,51,309,12,293,51,286,29,309,12,286,29,286,0,258,9,247,-2,261,-4,186,149,182,139,183,90,186,149,183,90,185,81,186,149,185,81,188,74,186,149,188,74,193,156,179,116,180,107,180,127,180,127,180,107,181,99,180,127,181,99,182,139,182,139,181,99,183,90,193,26,188,74,183,51,193,26,183,51,182,12,182,12,183,51,176,33,182,12,176,33,169,3,169,3,176,33,167,19,169,3,167,19,156,12,143,9,134,-4,153,-2,76,169,69,153,76,34,76,169,76,34,92,12,76,169,92,12,84,183,64,137,61,120,64,64,64,137,64,64,76,34,64,137,76,34,69,153,64,64,61,120,60,103,275,15,286,0,286,29,61,183,77,225,53,219,215,74,210,25,221,12,
+257,225,206,225,111,104,110,104,112,114,114,125,115,138,117,150,117,160,115,183,108,202,97,217,82,226,64,230,53,229,43,225,35,219,29,210,27,198,28,193,31,188,35,184,40,181,46,180,54,181,60,184,63,188,67,191,71,192,81,190,89,184,95,174,99,162,100,148,99,136,98,121,96,107,94,94,91,85,21,0,73,0,170,121,171,121,168,111,166,100,164,88,163,76,162,65,164,46,170,27,180,11,194,0,214,-4,225,-3,236,0,244,5,250,14,252,26,251,32,248,37,244,41,239,43,233,44,225,43,219,40,213,34,209,33,199,35,191,40,185,50,181,64,180,85,180,98,181,111,183,122,186,132,189,141,213,-107,214,-103,216,-93,217,-89,217,-86,202,-54,166,-40,119,-30,75,-8,44,40,45,40,55,24,69,11,86,2,106,-2,131,-4,166,1,195,18,217,44,230,75,235,110,230,150,217,183,195,208,166,224,129,230,83,221,50,197,29,163,18,126,15,89,15,69,16,49,18,29,22,10,28,-6,65,-50,110,-71,154,-79,189,-88,205,-107,16383,16383,190,108,188,82,183,55,173,32,157,15,133,9,105,17,85,37,70,66,62,101,60,137,63,166,71,188,83,203,100,213,120,216,141,210,160,195,175,171,186,142,190,108,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,
+95,174,97,217,89,184,89,184,97,217,82,226,89,184,82,226,81,190,81,190,82,226,71,192,67,191,71,192,82,226,67,191,82,226,64,230,206,225,111,104,170,121,170,121,111,104,94,94,170,121,94,94,91,85,91,85,21,0,73,0,112,114,114,125,115,183,115,183,114,125,115,138,115,183,115,138,117,160,117,160,115,138,117,150,110,104,112,114,115,183,110,104,115,183,108,202,110,104,108,202,100,148,110,104,100,148,99,136,110,104,99,136,98,121,110,104,98,121,96,107,110,104,96,107,94,94,110,104,94,94,111,104,191,40,185,50,194,0,194,0,185,50,181,64,194,0,181,64,180,11,180,11,181,64,180,85,171,121,180,85,180,98,171,121,180,98,181,111,186,132,189,141,206,225,186,132,206,225,183,122,183,122,206,225,171,121,183,122,171,121,181,111,206,225,189,141,257,225,99,162,100,148,108,202,99,162,108,202,97,217,91,85,73,0,170,121,225,43,219,40,225,-3,225,-3,219,40,216,37,225,-3,216,37,214,-4,214,-4,216,37,213,34,214,-4,213,34,209,33,209,33,199,35,214,-4,214,-4,199,35,194,0,252,26,251,32,250,14,250,14,251,32,248,37,250,14,248,37,244,5,244,5,248,37,244,41,244,5,244,41,239,43,225,43,225,-3,233,44,233,44,225,-3,236,0,233,44,236,0,239,43,239,43,236,0,244,5,171,121,168,111,170,27,171,121,170,27,180,11,171,121,180,11,180,85,166,100,164,88,164,46,166,100,164,46,170,27,166,100,170,27,168,111,163,76,162,65,164,46,163,76,164,46,164,88,64,230,53,229,54,181,64,230,54,181,60,184,64,230,60,184,63,188,64,230,63,188,67,191,35,184,40,181,43,225,43,225,40,181,46,180,43,225,46,180,53,229,53,229,46,180,54,181,27,198,28,193,29,210,29,210,28,193,31,188,29,210,31,188,35,219,35,219,31,188,35,184,35,219,35,184,43,225,97,217,95,174,99,162,191,40,194,0,199,35,206,225,170,121,171,121,
+213,-107,214,-103,216,-93,217,-89,217,-86,202,-54,166,-40,119,-30,75,-8,44,40,45,40,55,24,69,11,86,2,106,-2,131,-4,166,1,195,18,217,44,230,75,235,110,230,150,217,183,195,208,166,224,129,230,83,221,50,197,29,163,18,126,15,89,15,69,16,49,18,29,22,10,28,-6,65,-50,110,-71,154,-79,189,-88,205,-107,16383,16383,190,108,188,82,183,55,173,32,157,15,133,9,105,17,85,37,70,66,62,101,60,137,63,166,71,188,83,203,100,213,120,216,141,210,160,195,175,171,186,142,190,108,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,74,180,77,205,82,229,88,251,97,271,108,286,121,299,134,308,149,315,164,318,180,320,194,319,207,316,219,311,231,305,242,296,256,281,268,261,277,237,284,210,286,180,16383,16383,287,157,285,126,279,98,271,73,260,52,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,51,91,73,82,98,
+28,-6,65,-50,44,40,44,40,65,-50,75,-8,75,-8,65,-50,110,-71,75,-8,110,-71,119,-30,119,-30,110,-71,154,-79,119,-30,154,-79,166,-40,166,-40,154,-79,189,-88,166,-40,189,-88,202,-54,202,-54,189,-88,205,-107,202,-54,205,-107,217,-86,217,-86,205,-107,213,-107,217,-86,213,-107,214,-103,55,24,69,11,60,137,60,137,63,166,50,197,50,197,63,166,71,188,50,197,71,188,83,221,83,221,71,188,83,203,83,221,83,203,129,230,129,230,83,203,100,213,129,230,100,213,120,216,120,216,141,210,129,230,129,230,141,210,166,224,133,9,106,-2,131,-4,133,9,131,-4,166,1,133,9,105,17,106,-2,86,2,106,-2,105,17,86,2,105,17,85,37,86,2,85,37,70,66,86,2,70,66,69,11,62,101,60,137,69,11,62,101,69,11,70,66,188,82,183,55,195,18,195,18,183,55,173,32,195,18,173,32,166,1,166,1,173,32,157,15,166,1,157,15,133,9,175,171,186,142,195,208,195,208,186,142,190,108,195,18,190,108,188,82,166,224,141,210,160,195,166,224,160,195,175,171,166,224,175,171,195,208,195,18,217,44,217,183,217,183,217,44,230,75,217,183,230,75,230,150,230,150,230,75,235,110,195,208,190,108,195,18,195,208,195,18,217,183,217,-86,214,-103,215,-98,217,-86,215,-98,216,-93,217,-86,216,-93,217,-89,16,49,18,29,18,126,18,126,18,29,22,10,18,126,22,10,29,163,29,163,22,10,28,-6,29,163,28,-6,44,40,18,126,15,89,15,69,18,126,15,69,16,49,44,40,45,40,50,197,50,197,45,40,55,24,50,197,55,24,60,137,50,197,29,163,44,40,
+196,56,183,41,169,29,155,22,139,17,123,16,100,21,82,35,68,56,60,82,57,112,155,112,155,127,57,127,61,151,69,175,82,196,99,210,119,215,142,212,158,203,169,191,177,177,183,162,191,162,184,230,176,230,174,224,173,222,171,220,167,220,160,221,152,223,144,226,133,229,118,230,82,223,53,205,31,178,17,145,12,108,17,74,30,44,50,18,78,1,112,-4,136,-1,157,5,176,17,191,33,204,52,23,169,37,184,50,195,65,203,80,208,97,209,119,204,138,190,151,169,159,143,162,113,65,113,65,98,162,98,159,73,150,50,137,29,120,15,100,9,77,13,61,21,50,34,42,48,36,63,28,63,36,-4,44,-4,44,-1,46,3,52,5,60,4,67,1,76,0,87,-3,101,-4,137,2,167,20,189,47,202,80,207,117,203,150,190,181,169,207,142,224,108,230,84,227,62,220,44,208,28,192,16,172,243,411,
+155,112,155,127,57,112,57,112,57,127,53,205,53,205,57,127,61,151,53,205,61,151,82,223,82,223,61,151,69,175,82,223,69,175,82,196,68,56,78,1,82,35,82,35,78,1,112,-4,82,35,112,-4,100,21,100,21,112,-4,123,16,139,17,123,16,136,-1,139,17,136,-1,157,5,60,82,57,112,50,18,60,82,50,18,78,1,60,82,78,1,68,56,12,108,17,74,17,145,17,145,17,74,30,44,17,145,30,44,31,178,31,178,30,44,50,18,31,178,50,18,53,205,53,205,50,18,57,112,158,203,169,191,160,221,160,221,169,191,167,220,171,220,167,220,169,191,171,220,169,191,177,177,184,230,176,230,177,177,184,230,177,177,183,162,184,230,183,162,191,162,177,177,176,230,175,227,177,177,175,227,174,224,177,177,174,224,173,222,177,177,173,222,171,220,133,229,119,215,142,212,133,229,142,212,144,226,144,226,142,212,158,203,144,226,158,203,152,223,152,223,158,203,160,221,204,52,196,56,191,33,191,33,196,56,183,41,191,33,183,41,176,17,176,17,183,41,169,29,176,17,169,29,157,5,157,5,169,29,155,22,157,5,155,22,139,17,123,16,112,-4,136,-1,118,230,82,223,82,196,118,230,82,196,99,210,118,230,99,210,119,215,118,230,119,215,133,229,57,127,57,112,155,127,
+350,0,350,9,337,12,327,17,319,26,311,38,304,55,180,337,171,337,68,93,52,58,41,34,31,20,19,13,4,9,4,0,104,0,104,9,91,10,81,12,74,16,70,22,69,30,69,34,70,38,71,43,72,47,74,51,97,108,228,108,248,61,254,45,256,38,257,31,257,23,256,21,255,18,251,14,247,12,239,10,232,10,223,9,223,0,16383,16383,220,128,105,128,162,266,108,183,108,294,109,301,111,306,114,310,119,311,126,312,188,312,202,311,217,307,230,300,242,287,251,267,252,263,253,258,255,254,256,250,256,247,268,247,266,331,9,331,9,321,30,320,44,315,52,308,56,295,57,275,57,56,56,37,52,24,43,16,29,11,9,9,9,0,169,0,209,4,242,16,267,35,283,60,289,91,280,132,256,159,223,174,185,181,146,183,16383,16383,108,163,
+52,58,70,22,69,30,69,30,69,34,68,93,68,93,69,34,70,38,68,93,70,38,71,43,243,11,239,10,350,0,350,0,239,10,232,10,350,0,232,10,223,9,72,47,74,51,171,337,171,337,74,51,97,108,171,337,97,108,105,128,105,128,97,108,228,108,105,128,228,108,220,128,220,128,228,108,304,55,220,128,304,55,180,337,256,21,255,18,350,0,350,0,255,18,253,16,350,0,253,16,251,14,251,14,247,12,350,0,350,0,247,12,243,11,257,26,350,0,327,17,257,26,327,17,319,26,257,26,319,26,311,38,257,26,311,38,304,55,257,26,304,55,257,31,304,55,228,108,248,61,304,55,248,61,251,53,304,55,251,53,254,45,304,55,254,45,256,38,304,55,256,38,257,31,171,337,105,128,162,266,171,337,162,266,220,128,171,337,220,128,180,337,68,93,52,58,69,30,72,47,171,337,68,93,72,47,68,93,71,43,337,12,327,17,350,0,337,12,350,0,350,9,257,23,256,21,350,0,257,23,350,0,257,26,104,0,104,9,91,10,104,0,91,10,81,12,104,0,81,12,41,34,104,0,41,34,31,20,104,0,31,20,19,13,104,0,19,13,4,9,104,0,4,9,4,0,41,34,81,12,74,16,41,34,74,16,70,22,41,34,70,22,52,58,350,0,223,9,223,0,
+108,183,108,294,109,301,111,306,114,310,119,311,126,312,188,312,202,311,217,307,230,300,242,287,251,267,252,263,253,258,255,254,256,250,256,247,268,247,266,331,9,331,9,321,30,320,44,315,52,308,56,295,57,275,57,56,56,37,52,24,43,16,29,11,9,9,9,0,169,0,209,4,242,16,267,35,283,60,289,91,280,132,256,159,223,174,185,181,146,183,16383,16383,108,163,138,163,166,161,191,154,212,141,226,120,231,89,226,59,212,39,190,27,162,21,131,19,120,20,113,22,110,26,108,33,108,41,212,180,226,183,237,187,245,190,253,195,260,200,267,208,273,218,277,229,280,240,281,252,275,281,259,303,233,318,196,328,150,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,178,0,218,4,251,17,276,37,292,63,297,94,296,107,293,120,289,131,282,142,273,151,264,159,255,165,244,171,230,175,212,179,16383,16383,108,188,108,296,109,302,110,307,113,310,116,311,121,312,141,312,173,310,198,302,215,290,226,273,229,250,226,228,217,210,203,198,
+52,24,43,16,169,0,169,0,43,16,29,11,169,0,29,11,9,9,44,315,52,308,266,331,266,331,52,308,119,311,266,331,119,311,126,312,266,331,126,312,188,312,266,331,188,312,202,311,217,307,230,300,266,331,266,331,230,300,242,287,266,331,242,287,251,267,251,267,252,263,266,331,266,331,252,263,253,258,266,331,253,258,255,254,266,331,255,254,256,250,266,331,256,250,256,247,266,331,256,247,268,247,57,275,108,33,108,41,108,183,108,163,138,163,108,183,138,163,146,183,146,183,138,163,166,161,146,183,166,161,185,181,185,181,166,161,191,154,185,181,191,154,223,174,223,174,191,154,212,141,223,174,212,141,226,120,57,275,108,41,108,294,57,275,108,294,109,301,57,275,109,301,111,306,57,275,111,306,114,310,57,275,114,310,56,295,119,311,52,308,56,295,119,311,56,295,114,310,30,320,44,315,266,331,30,320,266,331,9,331,30,320,9,331,9,321,231,89,226,59,242,16,242,16,226,59,212,39,242,16,212,39,209,4,209,4,212,39,190,27,209,4,190,27,169,0,169,0,190,27,162,21,169,0,162,21,131,19,131,19,120,20,169,0,169,0,120,20,113,22,169,0,113,22,56,37,56,37,113,22,57,56,231,89,242,16,256,159,256,159,242,16,267,35,256,159,267,35,280,132,280,132,267,35,283,60,280,132,283,60,289,91,226,120,231,89,256,159,226,120,256,159,223,174,57,56,113,22,110,26,57,56,110,26,108,33,57,56,108,33,57,275,169,0,9,9,9,0,52,24,169,0,56,37,266,331,202,311,217,307,
+212,180,226,183,237,187,245,190,253,195,260,200,267,208,273,218,277,229,280,240,281,252,275,281,259,303,233,318,196,328,150,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,178,0,218,4,251,17,276,37,292,63,297,94,296,107,293,120,289,131,282,142,273,151,264,159,255,165,244,171,230,175,212,179,16383,16383,108,188,108,296,109,302,110,307,113,310,116,311,121,312,141,312,173,310,198,302,215,290,226,273,229,250,226,228,217,210,203,198,182,191,155,188,16383,16383,108,168,139,168,163,167,182,164,199,158,217,148,225,141,232,131,237,120,239,108,240,94,239,82,237,69,233,58,228,48,221,41,208,31,195,25,180,21,162,19,140,19,127,20,119,22,113,26,109,33,108,41,272,242,270,331,9,331,9,321,28,320,41,315,48,307,52,294,53,275,53,57,52,37,48,24,41,16,28,12,9,9,9,0,150,0,150,9,130,12,117,16,109,24,105,37,104,56,104,302,106,307,109,310,114,312,192,312,206,311,221,307,234,300,246,286,255,267,256,262,258,256,259,250,260,245,260,242,323,-75,323,9,303,11,291,17,283,27,279,40,278,57,278,274,280,293,283,307,291,315,304,319,323,321,323,331,47,331,47,321,62,320,75,316,83,308,88,295,90,275,87,172,79,97,65,46,45,18,17,9,7,9,7,-75,19,-75,19,-72,20,-67,21,-60,23,-54,24,-49,32,-29,43,-15,56,-5,71,0,259,0,274,-5,287,-15,298,-29,306,-49,307,-54,308,-60,309,-67,310,-72,311,-75,16383,16383,228,41,227,33,225,27,222,22,217,20,
+52,24,43,16,178,0,178,0,43,16,30,11,178,0,30,11,9,9,56,295,57,275,113,310,56,295,113,310,150,331,150,331,113,310,116,311,150,331,116,311,121,312,150,331,121,312,141,312,150,331,141,312,173,310,208,31,195,25,218,4,218,4,195,25,180,21,218,4,180,21,178,0,178,0,180,21,162,19,178,0,162,19,140,19,140,19,127,20,178,0,178,0,127,20,119,22,178,0,119,22,56,37,56,37,119,22,57,56,259,303,233,318,237,187,237,187,233,318,229,250,237,187,229,250,226,228,237,187,226,228,226,183,226,183,226,228,217,210,226,183,217,210,212,180,212,180,217,210,203,198,212,180,203,198,212,179,212,179,203,198,217,148,212,179,217,148,230,175,230,175,217,148,225,141,155,188,163,167,182,191,182,191,163,167,182,164,182,191,182,164,203,198,203,198,182,164,199,158,203,198,199,158,217,148,237,69,233,58,251,17,251,17,233,58,228,48,251,17,228,48,221,41,221,41,208,31,218,4,163,167,155,188,139,168,139,168,155,188,108,188,139,168,108,188,108,168,109,33,108,41,57,275,109,33,57,275,57,56,57,56,119,22,113,26,57,56,113,26,109,33,273,151,264,159,276,37,276,37,264,159,255,165,276,37,255,165,251,17,251,17,255,165,244,171,251,17,244,171,240,94,240,94,239,82,251,17,251,17,239,82,237,69,244,171,230,175,232,131,244,171,232,131,237,120,244,171,237,120,239,108,244,171,239,108,240,94,233,318,196,328,198,302,233,318,198,302,215,290,233,318,215,290,226,273,233,318,226,273,229,250,196,328,150,331,173,310,196,328,173,310,198,302,57,275,108,41,108,296,57,275,108,296,109,302,57,275,109,302,110,307,57,275,110,307,113,310,150,331,9,331,30,320,150,331,30,320,44,316,150,331,44,316,52,308,150,331,52,308,56,295,267,208,273,218,275,281,275,281,273,218,277,229,275,281,277,229,281,252,281,252,277,229,280,240,245,190,253,195,259,303,259,303,253,195,260,200,259,303,260,200,275,281,275,281,260,200,267,208,293,120,289,131,292,63,293,120,292,63,297,94,293,120,297,94,296,107,282,142,273,151,276,37,282,142,276,37,292,63,282,142,292,63,289,131,221,41,218,4,251,17,259,303,237,187,245,190,30,320,9,331,9,321,230,175,225,141,232,131,178,0,9,9,9,0,52,24,178,0,56,37,
+272,242,270,331,9,331,9,321,28,320,41,315,48,307,52,294,53,275,53,57,52,37,48,24,41,16,28,12,9,9,9,0,150,0,150,9,130,12,117,16,109,24,105,37,104,56,104,302,106,307,109,310,114,312,192,312,206,311,221,307,234,300,246,286,255,267,256,262,258,256,259,250,260,245,260,242,323,-75,323,9,303,11,291,17,283,27,279,40,278,57,278,274,280,293,283,307,291,315,304,319,323,321,323,331,47,331,47,321,62,320,75,316,83,308,88,295,90,275,87,172,79,97,65,46,45,18,17,9,7,9,7,-75,19,-75,19,-72,20,-67,21,-60,23,-54,24,-49,32,-29,43,-15,56,-5,71,0,
+48,24,41,16,150,0,150,0,41,16,28,12,150,0,28,12,9,9,52,294,53,275,109,310,52,294,109,310,48,307,48,307,109,310,114,312,48,307,114,312,270,331,270,331,114,312,122,312,221,307,234,300,270,331,270,331,234,300,246,286,270,331,246,286,255,267,255,267,256,262,270,331,270,331,256,262,258,256,270,331,258,256,259,250,270,331,259,250,260,245,270,331,260,245,260,242,270,331,260,242,272,242,270,331,122,312,192,312,270,331,192,312,206,311,270,331,206,311,221,307,117,16,109,24,53,57,53,57,109,24,105,37,53,57,105,37,53,275,53,275,105,37,104,56,53,275,104,56,104,294,53,275,104,294,104,302,53,275,104,302,106,307,53,275,106,307,109,310,270,331,9,331,28,320,270,331,28,320,41,315,270,331,41,315,48,307,150,0,150,9,130,12,150,0,130,12,117,16,150,0,117,16,52,37,150,0,52,37,48,24,150,0,9,9,9,0,52,37,117,16,53,57,28,320,9,331,9,321,
+323,-75,323,9,303,11,291,17,283,27,279,40,278,57,278,274,280,293,283,307,291,315,304,319,323,321,323,331,47,331,47,321,62,320,75,316,83,308,88,295,90,275,87,172,79,97,65,46,45,18,17,9,7,9,7,-75,19,-75,19,-72,20,-67,21,-60,23,-54,24,-49,32,-29,43,-15,56,-5,71,0,259,0,274,-5,287,-15,298,-29,306,-49,307,-54,308,-60,309,-67,310,-72,311,-75,16383,16383,228,41,227,33,225,27,222,22,217,20,209,19,76,19,91,48,101,88,108,141,112,209,113,294,113,303,115,308,119,311,124,312,210,312,217,311,222,310,225,306,227,301,228,294,304,84,290,84,276,57,260,38,239,27,211,21,174,19,137,19,122,21,113,25,107,32,105,42,105,164,181,164,203,162,218,158,227,150,234,136,238,115,249,115,249,232,238,232,234,211,227,198,218,189,203,185,181,184,105,184,105,294,106,302,108,307,111,310,116,312,189,312,218,311,239,306,252,297,261,282,266,259,278,259,276,331,11,331,11,321,30,320,43,315,50,307,54,294,55,275,55,57,54,37,50,24,43,16,30,12,11,9,11,0,281,0,507,0,507,9,476,18,453,32,435,52,417,79,394,113,382,130,370,144,359,155,345,164,330,172,329,173,342,181,354,193,
+20,-67,21,-60,17,9,17,9,21,-60,23,-54,17,9,23,-54,24,-49,24,-49,32,-29,45,18,45,18,32,-29,43,-15,45,18,43,-15,56,-5,62,320,75,316,323,331,323,331,75,316,124,312,323,331,124,312,131,312,323,331,131,312,210,312,323,331,210,312,217,311,87,172,91,48,90,275,90,275,91,48,113,303,113,303,91,48,113,294,71,0,87,0,76,19,71,0,76,19,79,97,79,97,76,19,91,48,79,97,91,48,87,172,65,46,45,18,56,-5,65,46,56,-5,71,0,65,46,71,0,79,97,45,18,17,9,24,-49,17,9,7,9,19,-75,17,9,19,-75,19,-72,17,9,19,-72,20,-67,323,331,217,311,222,310,323,331,222,310,225,306,323,331,225,306,227,301,323,331,227,301,228,294,323,331,228,294,291,315,323,331,291,315,304,319,323,331,304,319,323,321,291,17,283,27,287,-15,287,-15,283,27,279,40,287,-15,279,40,274,-5,274,-5,279,40,278,57,274,-5,278,57,278,274,228,294,243,0,280,293,280,293,243,0,259,0,280,293,259,0,278,274,278,274,259,0,274,-5,283,307,291,315,228,294,283,307,228,294,280,293,113,294,91,48,101,88,113,294,101,88,108,141,113,294,108,141,112,209,124,312,83,308,119,311,119,311,83,308,88,295,119,311,88,295,115,308,115,308,88,295,90,275,115,308,90,275,113,303,47,331,47,321,62,320,47,331,62,320,323,331,308,-60,323,9,307,-54,307,-54,323,9,306,-49,298,-29,306,-49,303,11,298,-29,303,11,291,17,323,9,308,-60,309,-67,323,9,309,-67,310,-72,323,9,310,-72,311,-75,323,9,311,-75,323,-75,323,9,303,11,306,-49,209,19,76,19,87,0,209,19,87,0,243,0,209,19,243,0,217,20,243,0,228,294,228,41,243,0,228,41,227,33,243,0,227,33,225,27,243,0,225,27,222,22,243,0,222,22,217,20,19,-75,7,9,7,-75,291,17,287,-15,298,-29,124,312,75,316,83,308,
+304,84,290,84,276,57,260,38,239,27,211,21,174,19,137,19,122,21,113,25,107,32,105,42,105,164,181,164,203,162,218,158,227,150,234,136,238,115,249,115,249,232,238,232,234,211,227,198,218,189,203,185,181,184,105,184,105,294,106,302,108,307,111,310,116,312,189,312,218,311,239,306,252,297,261,282,266,259,278,259,276,331,11,331,11,321,30,320,43,315,50,307,54,294,55,275,55,57,54,37,50,24,43,16,30,12,11,9,11,0,281,0,507,0,507,9,476,18,453,32,435,52,417,79,394,113,382,130,370,144,359,155,345,164,330,172,329,173,342,181,354,193,364,209,373,228,382,251,388,266,394,280,401,293,410,301,419,305,425,302,430,295,435,286,443,279,457,276,466,278,473,283,478,289,481,297,482,305,480,315,475,324,467,331,456,336,442,338,419,335,401,325,388,309,376,290,367,267,356,239,345,216,331,197,310,185,280,181,280,293,283,307,291,315,304,319,325,321,325,331,186,331,186,321,
+50,24,43,16,281,0,281,0,43,16,30,12,281,0,30,12,11,9,54,294,55,275,111,310,54,294,111,310,50,307,50,307,111,310,116,312,50,307,116,312,276,331,276,331,116,312,123,312,50,24,122,21,54,37,54,37,122,21,113,25,54,37,113,25,55,57,55,57,113,25,107,32,55,57,107,32,55,275,55,275,107,32,105,42,55,275,105,42,105,294,105,184,105,164,181,164,105,184,181,164,181,184,203,185,181,184,203,162,203,185,203,162,218,189,218,189,203,162,218,158,218,189,218,158,227,198,227,198,218,158,227,150,227,198,227,150,234,211,234,211,227,150,234,136,234,211,234,136,238,232,238,232,234,136,238,115,238,232,238,115,249,115,276,331,123,312,189,312,276,331,189,312,218,311,276,331,218,311,239,306,276,331,239,306,252,297,276,331,252,297,261,282,276,331,261,282,266,259,276,331,266,259,278,259,55,275,105,294,106,302,55,275,106,302,108,307,55,275,108,307,111,310,276,331,11,331,30,320,276,331,30,320,43,315,276,331,43,315,50,307,260,38,239,27,281,0,281,0,239,27,211,21,281,0,211,21,174,19,281,0,304,84,290,84,281,0,290,84,276,57,281,0,276,57,260,38,281,0,174,19,156,19,281,0,156,19,137,19,281,0,137,19,122,21,281,0,122,21,50,24,281,0,11,9,11,0,30,320,11,331,11,321,181,184,181,164,203,162,238,232,249,115,249,232,
+507,0,507,9,476,18,453,32,435,52,417,79,394,113,382,130,370,144,359,155,345,164,330,172,329,173,342,181,354,193,364,209,373,228,382,251,388,266,394,280,401,293,410,301,419,305,425,302,430,295,435,286,443,279,457,276,466,278,473,283,478,289,481,297,482,305,480,315,475,324,467,331,456,336,442,338,419,335,401,325,388,309,376,290,367,267,356,239,345,216,331,197,310,185,280,181,280,293,283,307,291,315,304,319,325,321,325,331,186,331,186,321,206,320,220,315,227,307,230,294,231,275,231,181,203,185,182,197,167,216,154,239,143,267,134,290,123,309,109,325,91,335,68,338,54,336,43,331,35,324,30,315,28,305,29,297,32,289,37,283,44,278,53,276,67,279,75,286,80,295,85,302,91,305,100,301,109,293,115,280,122,266,128,251,137,228,146,209,156,193,168,181,181,173,180,172,165,164,152,155,140,144,129,130,117,113,94,79,75,52,57,32,35,18,4,9,4,0,99,0,109,10,120,23,131,40,144,60,158,84,177,116,190,138,201,152,213,159,231,161,231,55,230,36,228,23,222,16,210,11,193,9,193,0,323,0,323,9,305,12,292,16,284,23,281,36,280,55,280,161,297,159,309,152,320,138,333,116,352,84,367,60,380,40,391,23,401,10,411,0,177,175,201,180,222,192,240,208,251,229,256,253,252,281,239,304,217,322,185,334,142,338,131,338,121,337,111,335,100,333,89,330,83,328,67,324,60,322,54,321,49,322,44,324,40,328,37,332,35,338,25,338,23,220,35,220,43,253,56,280,76,301,101,314,131,319,156,316,176,308,191,294,201,277,204,257,204,245,201,232,196,219,188,207,175,196,165,191,155,187,143,185,127,183,104,183,104,163,128,163,146,161,160,158,172,153,184,146,194,138,202,129,209,118,213,105,215,91,211,64,201,43,183,28,159,18,128,15,105,17,85,23,65,33,44,47,23,65,14,57,32,35,54,17,80,4,109,-3,141,-6,160,-6,177,-3,193,0,208,5,223,13,239,25,253,39,264,55,270,74,272,95,267,121,252,142,230,158,204,169,177,174,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,212,331,212,321,230,319,242,315,251,309,255,299,257,285,105,82,105,274,106,294,110,307,118,315,131,319,150,321,150,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,148,9,131,11,118,16,110,23,106,33,105,48,257,252,257,62,256,41,252,26,245,17,
+75,52,57,32,99,0,99,0,57,32,35,18,99,0,35,18,4,9,75,286,80,295,91,335,91,335,80,295,85,302,91,335,85,302,91,305,91,305,100,301,109,325,109,325,100,301,109,293,109,325,109,293,115,280,44,278,53,276,54,336,54,336,53,276,67,279,54,336,67,279,68,338,68,338,67,279,75,286,68,338,75,286,91,335,28,305,29,297,30,315,30,315,29,297,32,289,30,315,32,289,35,324,35,324,32,289,37,283,35,324,37,283,43,331,43,331,37,283,44,278,43,331,44,278,54,336,115,280,122,266,123,309,123,309,122,266,128,251,123,309,128,251,134,290,134,290,128,251,137,228,134,290,137,228,143,267,143,267,137,228,146,209,143,267,146,209,154,239,154,239,146,209,156,193,154,239,156,193,167,216,167,216,156,193,168,181,167,216,168,181,182,197,182,197,168,181,181,173,182,197,181,173,190,138,190,138,181,173,180,172,228,23,222,16,323,0,323,0,222,16,210,11,323,0,210,11,193,9,304,319,325,321,325,331,304,319,325,331,291,315,291,315,325,331,230,294,291,315,230,294,231,275,231,161,231,275,231,181,231,161,284,23,281,36,323,0,323,9,305,12,323,0,305,12,292,16,323,0,292,16,230,36,323,0,230,36,228,23,280,55,280,181,231,161,280,55,231,161,281,36,231,55,230,36,292,16,231,55,292,16,284,23,231,55,284,23,231,161,280,161,297,159,280,181,280,181,280,274,231,161,231,161,280,274,280,293,231,161,280,293,283,307,283,307,291,315,231,275,283,307,231,275,231,161,325,331,186,331,206,320,325,331,206,320,220,315,325,331,220,315,227,307,325,331,227,307,230,294,453,32,435,52,411,0,411,0,435,52,417,79,411,0,417,79,401,10,401,10,417,79,394,113,401,10,394,113,391,23,391,23,394,113,382,130,391,23,382,130,380,40,380,40,382,130,370,144,380,40,370,144,367,60,367,60,370,144,359,155,367,60,359,155,352,84,352,84,359,155,345,164,352,84,345,164,333,116,333,116,345,164,330,172,333,116,330,172,329,173,476,18,453,32,411,0,476,18,411,0,507,0,476,18,507,0,507,9,320,138,329,173,331,197,331,197,329,173,342,181,331,197,342,181,345,216,345,216,342,181,354,193,345,216,354,193,356,239,356,239,354,193,364,209,356,239,364,209,367,267,367,267,364,209,373,228,367,267,373,228,376,290,376,290,373,228,382,251,376,290,382,251,388,309,388,309,382,251,388,266,388,309,388,266,401,325,401,325,388,266,394,280,401,325,394,280,401,293,310,185,280,181,297,159,310,185,297,159,309,152,310,185,309,152,320,138,310,185,320,138,331,197,442,338,419,335,425,302,425,302,419,335,419,305,410,301,419,305,419,335,410,301,419,335,401,325,457,276,466,278,467,331,467,331,466,278,473,283,467,331,473,283,475,324,475,324,473,283,478,289,475,324,478,289,480,315,480,315,478,289,481,297,480,315,481,297,482,305,430,295,435,286,442,338,442,338,435,286,443,279,442,338,443,279,456,336,456,336,443,279,457,276,456,336,457,276,467,331,190,138,201,152,203,185,203,185,201,152,213,159,203,185,213,159,231,181,231,181,213,159,231,161,99,0,109,10,117,113,117,113,109,10,120,23,117,113,120,23,129,130,129,130,120,23,131,40,129,130,131,40,140,144,140,144,131,40,144,60,140,144,144,60,152,155,152,155,144,60,158,84,152,155,158,84,165,164,165,164,158,84,177,116,165,164,177,116,180,172,180,172,177,116,190,138,94,79,75,52,99,0,94,79,99,0,117,113,109,325,91,335,91,305,109,325,115,280,123,309,99,0,4,9,4,0,182,197,190,138,203,185,333,116,329,173,320,138,442,338,425,302,430,295,401,325,401,293,410,301,206,320,186,331,186,321,323,0,193,9,193,0,
+177,175,201,180,222,192,240,208,251,229,256,253,252,281,239,304,217,322,185,334,142,338,131,338,121,337,111,335,100,333,89,330,83,328,67,324,60,322,54,321,49,322,44,324,40,328,37,332,35,338,25,338,23,220,35,220,43,253,56,280,76,301,101,314,131,319,156,316,176,308,191,294,201,277,204,257,204,245,201,232,196,219,188,207,175,196,165,191,155,187,143,185,127,183,104,183,104,163,128,163,146,161,160,158,172,153,184,146,194,138,202,129,209,118,213,105,215,91,211,64,201,43,183,28,159,18,128,15,105,17,85,23,65,33,44,47,23,65,14,57,32,35,54,17,80,4,109,-3,141,-6,160,-6,177,-3,193,0,208,5,223,13,239,25,253,39,264,55,270,74,272,95,267,121,252,142,230,158,204,169,177,174,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,212,331,212,321,230,319,242,315,251,309,255,299,257,285,105,82,105,274,106,294,110,307,118,315,131,319,150,321,150,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,148,9,131,11,118,16,110,23,106,33,105,48,257,252,257,62,256,41,252,26,245,17,232,12,213,9,213,0,248,424,246,436,242,445,235,452,227,456,219,458,211,456,208,453,206,450,205,445,207,438,213,434,225,430,227,425,226,418,221,413,212,408,199,406,180,405,162,406,149,408,140,413,135,418,134,425,136,430,148,434,154,438,156,445,156,450,154,453,151,456,148,457,
+40,328,43,253,44,324,44,324,43,253,56,280,44,324,56,280,49,322,49,322,56,280,54,321,60,322,54,321,56,280,60,322,56,280,76,301,201,232,196,219,201,180,201,180,196,219,188,207,201,180,188,207,177,175,177,175,188,207,175,196,177,175,175,196,177,174,177,174,175,196,172,153,172,153,175,196,165,191,172,153,165,191,160,158,160,158,165,191,155,187,160,158,155,187,146,161,146,161,155,187,143,185,146,161,143,185,128,163,128,163,143,185,127,183,128,163,127,183,104,183,23,65,32,35,44,47,44,47,32,35,54,17,44,47,54,17,65,33,65,33,54,17,80,4,65,33,80,4,85,23,85,23,80,4,109,-3,85,23,109,-3,105,17,105,17,109,-3,128,15,159,18,128,15,141,-6,159,18,141,-6,160,-6,131,319,121,337,111,335,131,319,111,335,101,314,131,319,131,338,121,337,101,314,111,335,100,333,101,314,100,333,89,330,101,314,89,330,83,328,101,314,83,328,76,301,76,301,83,328,75,326,76,301,75,326,67,324,76,301,67,324,60,322,156,316,176,308,185,334,185,334,176,308,191,294,185,334,191,294,217,322,217,322,191,294,201,277,217,322,201,277,204,257,204,257,204,245,222,192,222,192,204,245,201,232,222,192,201,232,201,180,156,316,185,334,142,338,156,316,142,338,131,338,156,316,131,338,131,319,217,322,222,192,239,304,239,304,222,192,240,208,239,304,240,208,252,281,252,281,240,208,251,229,252,281,251,229,256,253,204,257,222,192,217,322,177,174,172,153,184,146,184,146,194,138,204,169,204,169,194,138,202,129,204,169,202,129,209,118,267,121,252,142,253,39,267,121,253,39,264,55,267,121,264,55,270,74,267,121,270,74,272,95,160,-6,177,-3,183,28,183,28,177,-3,193,0,183,28,193,0,201,43,201,43,193,0,208,5,201,43,208,5,211,64,211,64,208,5,223,13,211,64,223,13,215,91,215,91,223,13,230,158,230,158,223,13,239,25,230,158,239,25,252,142,252,142,239,25,253,39,204,169,209,118,230,158,230,158,209,118,213,105,230,158,213,105,215,91,204,169,177,174,184,146,128,15,109,-3,141,-6,40,328,37,332,43,253,43,253,37,332,35,338,43,253,35,338,35,220,35,220,35,338,25,338,35,220,25,338,23,220,32,35,23,65,14,57,159,18,160,-6,183,28,128,163,104,183,104,163,
+352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,212,331,212,321,230,319,242,315,251,309,255,299,257,285,105,82,105,274,106,294,110,307,118,315,131,319,150,321,150,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,148,9,131,11,118,16,110,23,106,33,105,48,257,252,257,62,256,41,252,26,245,17,232,12,213,9,213,0,248,424,246,436,242,445,235,452,227,456,219,458,211,456,208,453,206,450,205,445,207,438,213,434,225,430,227,425,226,418,221,413,212,408,199,406,180,405,162,406,149,408,140,413,135,418,134,425,136,430,148,434,154,438,156,445,156,450,154,453,151,456,148,457,144,458,135,456,127,452,120,445,115,436,113,424,117,408,129,395,145,386,163,380,180,378,198,380,216,385,232,395,243,407,248,424,16383,16383,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,
+50,25,42,16,149,0,149,0,42,16,29,12,149,0,29,12,9,9,257,285,105,82,105,48,105,48,105,274,54,274,54,274,105,274,106,294,54,274,106,294,110,307,150,331,9,331,29,319,150,331,29,319,42,315,150,331,42,315,50,307,150,331,50,307,53,294,150,331,53,294,118,315,150,331,118,315,131,319,150,331,131,319,150,321,54,274,110,307,118,315,54,274,118,315,53,294,252,26,245,17,352,0,352,0,245,17,232,12,352,0,232,12,213,9,242,315,251,309,352,331,352,331,251,309,255,299,352,331,255,299,257,285,257,285,257,252,309,37,309,37,257,252,257,62,309,37,257,62,312,25,312,25,257,62,320,17,333,319,352,321,352,331,333,319,352,331,320,315,320,315,352,331,257,285,320,315,257,285,312,307,312,307,257,285,309,293,307,55,307,274,257,285,307,55,257,285,309,37,230,319,242,315,352,331,230,319,352,331,212,331,230,319,212,331,212,321,352,0,352,9,333,12,352,0,333,12,320,17,352,0,320,17,256,41,352,0,256,41,252,26,149,0,148,9,131,11,149,0,131,11,118,16,149,0,118,16,53,39,149,0,53,39,50,25,106,33,105,48,54,274,106,33,54,274,54,61,106,33,54,61,110,23,54,61,53,39,118,16,54,61,118,16,110,23,149,0,9,9,9,0,352,0,213,9,213,0,256,41,320,17,257,62,309,293,257,285,307,274,257,285,105,48,257,252,29,319,9,331,9,321,
+248,424,246,436,242,445,235,452,227,456,219,458,211,456,208,453,206,450,205,445,207,438,213,434,225,430,227,425,226,418,221,413,212,408,199,406,180,405,162,406,149,408,140,413,135,418,134,425,136,430,148,434,154,438,156,445,156,450,154,453,151,456,148,457,144,458,135,456,127,452,120,445,115,436,113,424,117,408,129,395,145,386,163,380,180,378,198,380,216,385,232,395,243,407,248,424,16383,16383,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,212,331,212,321,230,319,242,316,250,310,254,300,256,285,105,82,105,274,106,294,110,307,118,315,131,319,150,321,150,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,148,9,131,11,119,15,111,22,107,33,105,48,257,252,257,62,256,41,252,26,245,17,232,12,213,9,213,0,343,0,343,9,321,13,312,17,302,23,292,30,282,40,271,54,259,71,246,92,230,114,218,131,206,145,193,155,180,164,164,171,164,172,178,181,190,193,201,208,211,227,220,251,225,266,232,281,239,294,247,303,257,306,263,303,267,296,272,287,281,280,294,277,303,279,310,284,315,291,318,299,319,306,317,317,313,325,305,332,295,337,281,338,257,335,239,325,224,309,213,290,204,267,196,245,187,226,176,209,162,195,142,185,137,183,131,182,124,181,106,181,106,274,107,293,110,307,117,315,130,319,151,321,151,331,10,331,10,321,30,319,43,315,51,306,54,293,55,275,55,65,54,42,51,27,43,17,29,12,9,9,9,0,151,0,151,9,132,12,119,16,111,23,107,36,106,55,106,161,113,161,119,160,125,158,130,156,134,154,140,149,149,140,160,126,174,108,189,85,203,61,216,40,227,24,238,10,248,0,332,0,332,9,313,12,300,17,292,25,288,37,287,55,
+149,408,140,413,145,386,145,386,140,413,135,418,145,386,135,418,129,395,129,395,135,418,134,425,135,456,134,425,136,430,135,456,136,430,144,458,144,458,136,430,142,432,144,458,142,432,148,434,148,457,148,434,151,456,151,456,148,434,154,438,151,456,154,438,154,453,154,453,154,438,156,445,154,453,156,445,156,450,129,395,134,425,135,456,129,395,135,456,127,452,129,395,127,452,120,445,129,395,120,445,117,408,115,436,113,424,117,408,115,436,117,408,120,445,149,408,163,380,162,406,162,406,163,380,180,405,199,406,180,405,180,378,199,406,180,378,198,380,246,436,242,445,243,407,243,407,242,445,235,452,243,407,235,452,232,395,232,395,235,452,227,456,232,395,227,456,227,425,227,456,219,458,219,432,227,456,219,432,225,430,227,456,225,430,227,425,215,457,211,456,213,434,215,457,213,434,219,432,215,457,219,432,219,458,208,453,206,450,207,438,208,453,207,438,213,434,208,453,213,434,211,456,227,425,226,418,232,395,232,395,226,418,221,413,232,395,221,413,216,385,216,385,221,413,212,408,216,385,212,408,199,406,180,405,163,380,180,378,50,25,42,16,149,0,149,0,42,16,29,12,149,0,29,12,9,9,119,15,111,22,54,61,54,61,111,22,107,33,54,61,107,33,54,274,54,274,107,33,105,48,105,82,105,48,256,285,150,331,9,331,29,319,150,331,29,319,42,315,150,331,42,315,50,307,150,331,50,307,53,294,150,331,53,294,118,315,150,331,118,315,131,319,150,331,131,319,150,321,105,274,106,294,54,274,105,274,54,274,105,48,105,274,105,48,105,82,54,274,106,294,110,307,54,274,110,307,118,315,54,274,118,315,53,294,252,26,245,17,352,0,352,0,245,17,232,12,352,0,232,12,213,9,352,331,212,331,230,319,352,331,230,319,242,316,352,331,242,316,250,310,352,331,250,310,254,300,352,331,254,300,256,285,352,331,256,285,320,315,352,331,320,315,333,319,352,331,333,319,352,321,320,17,312,25,257,62,257,62,312,25,309,37,257,62,309,37,257,252,257,252,309,37,307,55,257,252,307,55,307,274,257,252,307,274,309,293,257,252,309,293,312,307,257,252,312,307,320,315,257,252,320,315,256,285,257,252,256,285,105,48,352,0,352,9,333,12,352,0,333,12,320,17,352,0,320,17,256,41,352,0,256,41,252,26,149,0,148,9,131,11,149,0,131,11,119,15,149,0,119,15,53,39,149,0,53,39,50,25,149,0,9,9,9,0,53,39,119,15,54,61,352,0,213,9,213,0,256,41,320,17,257,62,230,319,212,331,212,321,29,319,9,331,9,321,199,406,198,380,216,385,246,436,243,407,248,424,207,438,206,450,205,445,149,408,145,386,163,380,144,458,148,434,148,457,
+343,0,343,9,321,13,312,17,302,23,292,30,282,40,271,54,259,71,246,92,230,114,218,131,206,145,193,155,180,164,164,171,164,172,178,181,190,193,201,208,211,227,220,251,225,266,232,281,239,294,247,303,257,306,263,303,267,296,272,287,281,280,294,277,303,279,310,284,315,291,318,299,319,306,317,317,313,325,305,332,295,337,281,338,257,335,239,325,224,309,213,290,204,267,196,245,187,226,176,209,162,195,142,185,137,183,131,182,124,181,106,181,106,274,107,293,110,307,117,315,130,319,151,321,151,331,10,331,10,321,30,319,43,315,51,306,54,293,55,275,55,65,54,42,51,27,43,17,29,12,9,9,9,0,151,0,151,9,132,12,119,16,111,23,107,36,106,55,106,161,113,161,119,160,125,158,130,156,134,154,140,149,149,140,160,126,174,108,189,85,203,61,216,40,227,24,238,10,248,0,332,0,332,9,313,12,300,17,292,25,288,37,287,55,287,274,288,293,292,307,300,315,313,319,332,321,332,331,65,331,65,321,80,320,93,316,101,308,107,295,108,275,108,112,105,78,100,47,89,26,73,17,65,21,54,43,46,53,32,57,25,56,18,53,11,48,6,40,4,30,7,14,14,4,25,-2,39,-5,55,-6,92,2,114,27,126,60,130,97,131,131,131,292,132,300,133,305,136,309,141,311,148,312,219,312,226,311,231,309,234,305,236,300,237,292,237,63,236,41,232,26,225,17,212,12,193,9,193,0,435,0,435,9,417,12,404,17,397,25,393,38,392,56,392,275,393,294,397,307,404,316,417,320,435,321,435,331,335,331,225,80,109,331,11,331,11,321,31,319,45,315,53,307,57,294,58,275,58,75,57,47,53,29,44,18,30,12,9,9,9,0,127,0,127,9,107,12,94,18,85,29,
+151,0,151,9,132,12,151,0,132,12,119,16,151,0,119,16,54,42,151,0,54,42,51,27,151,0,51,27,43,17,151,0,43,17,29,12,151,0,29,12,9,9,151,0,9,9,9,0,55,275,107,36,106,55,106,181,106,161,113,161,55,275,106,55,106,181,106,181,113,161,116,181,116,181,113,161,119,160,116,181,119,160,124,181,124,181,119,160,125,158,124,181,125,158,131,182,131,182,125,158,130,156,131,182,130,156,134,154,134,154,140,149,137,183,137,183,140,149,142,185,162,195,142,185,149,140,162,195,149,140,160,126,55,65,54,42,119,16,55,65,119,16,111,23,55,65,111,23,107,36,55,65,107,36,55,275,151,331,10,331,30,319,151,331,30,319,43,315,151,331,43,315,51,306,151,331,51,306,54,293,151,331,54,293,117,315,151,331,117,315,130,319,151,331,130,319,151,321,106,274,107,293,55,275,106,274,55,275,106,181,55,275,107,293,110,307,55,275,110,307,117,315,55,275,117,315,54,293,137,183,131,182,134,154,196,245,187,226,190,193,196,245,190,193,201,208,196,245,201,208,204,267,190,193,187,226,178,181,178,181,187,226,176,209,178,181,176,209,164,172,164,172,176,209,162,195,164,172,162,195,164,171,164,171,162,195,160,126,164,171,160,126,174,108,225,266,232,281,239,325,239,325,232,281,239,294,239,325,239,294,257,335,257,335,239,294,247,303,257,335,247,303,257,306,257,306,263,303,257,335,257,335,263,303,281,338,204,267,211,227,213,290,213,290,211,227,220,251,213,290,220,251,224,309,224,309,220,251,225,266,224,309,225,266,239,325,332,11,321,13,343,0,343,0,321,13,312,17,343,0,312,17,248,0,248,0,312,17,302,23,248,0,302,23,292,30,292,30,282,40,248,0,248,0,282,40,271,54,248,0,271,54,259,71,193,155,189,85,203,61,193,155,203,61,206,145,206,145,203,61,216,40,206,145,216,40,218,131,218,131,216,40,227,24,218,131,227,24,230,114,230,114,227,24,238,10,230,114,238,10,246,92,246,92,238,10,248,0,246,92,248,0,259,71,272,287,281,280,281,338,281,338,281,280,294,277,281,338,294,277,295,337,295,337,294,277,303,279,295,337,303,279,305,332,305,332,303,279,310,284,305,332,310,284,313,325,313,325,310,284,315,291,313,325,315,291,317,317,317,317,315,291,318,299,317,317,318,299,319,306,281,338,263,303,267,296,281,338,267,296,272,287,180,164,164,171,174,108,180,164,174,108,189,85,180,164,189,85,193,155,142,185,140,149,149,140,332,11,343,0,343,9,211,227,204,267,201,208,30,319,10,331,10,321,
+332,0,332,9,313,12,300,17,292,25,288,37,287,55,287,274,288,293,292,307,300,315,313,319,332,321,332,331,65,331,65,321,80,320,93,316,101,308,107,295,108,275,108,112,105,78,100,47,89,26,73,17,65,21,54,43,46,53,32,57,25,56,18,53,11,48,6,40,4,30,7,14,14,4,25,-2,39,-5,55,-6,92,2,114,27,126,60,130,97,131,131,131,292,132,300,133,305,136,309,141,311,148,312,219,312,226,311,231,309,234,305,236,300,237,292,237,63,236,41,232,26,225,17,212,12,193,9,193,0,435,0,435,9,417,12,404,17,397,25,393,38,392,56,392,275,393,294,397,307,404,316,417,320,435,321,435,331,335,331,225,80,109,331,11,331,11,321,31,319,45,315,53,307,57,294,58,275,58,75,57,47,53,29,44,18,30,12,9,9,9,0,127,0,127,9,107,12,94,18,85,29,81,48,80,75,80,275,206,0,213,0,340,286,340,40,336,26,328,17,315,12,296,9,296,0,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,213,331,213,321,
+108,112,105,78,114,27,114,27,105,78,100,47,114,27,100,47,92,2,92,2,100,47,89,26,92,2,89,26,73,17,73,17,65,21,92,2,92,2,65,21,55,-6,107,295,108,275,136,309,107,295,136,309,101,308,101,308,136,309,141,311,101,308,141,311,332,331,332,331,141,311,148,312,232,26,225,17,332,0,332,0,225,17,212,12,332,0,212,12,193,9,332,331,148,312,219,312,332,331,219,312,226,311,332,331,226,311,231,309,332,331,231,309,234,305,332,331,234,305,236,300,332,331,236,300,237,292,332,331,237,292,300,315,332,331,300,315,313,319,332,331,313,319,332,321,287,55,287,274,237,292,237,292,287,274,288,293,237,292,288,293,292,307,300,17,292,25,237,63,237,63,292,25,288,37,237,63,288,37,237,292,131,292,132,300,114,27,131,292,114,27,126,60,131,292,126,60,130,97,131,292,130,97,131,131,108,275,108,145,114,27,108,275,114,27,132,300,108,275,132,300,133,305,108,275,133,305,136,309,332,331,65,331,80,320,332,331,80,320,93,316,332,331,93,316,101,308,332,0,332,9,313,12,332,0,313,12,300,17,332,0,300,17,236,41,332,0,236,41,232,26,55,-6,65,21,60,31,55,-6,60,31,54,43,55,-6,54,43,46,53,55,-6,46,53,39,-5,46,53,32,57,39,-5,39,-5,32,57,25,56,39,-5,25,56,25,-2,25,-2,25,56,18,53,25,-2,18,53,14,4,14,4,18,53,11,48,14,4,11,48,7,14,7,14,11,48,6,40,7,14,6,40,4,30,108,112,114,27,108,145,332,0,193,9,193,0,236,41,300,17,237,63,237,292,288,37,287,55,80,320,65,331,65,321,300,315,237,292,292,307,
+435,0,435,9,417,12,404,17,397,25,393,38,392,56,392,275,393,294,397,307,404,316,417,320,435,321,435,331,335,331,225,80,109,331,11,331,11,321,31,319,45,315,53,307,57,294,58,275,58,75,57,47,53,29,44,18,30,12,9,9,9,0,127,0,127,9,107,12,94,18,85,29,81,48,80,75,80,275,206,0,213,0,340,286,340,40,336,26,328,17,315,12,296,9,296,0,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,213,331,213,321,232,319,245,315,252,307,256,294,257,274,257,180,105,180,105,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,
+53,29,44,18,127,0,127,0,44,18,30,12,127,0,30,12,9,9,336,26,328,17,435,0,435,0,328,17,315,12,435,0,315,12,296,9,417,320,435,321,435,331,417,320,435,331,404,316,404,316,435,331,340,286,404,316,340,286,397,307,397,307,340,286,393,294,404,17,397,25,340,61,340,61,397,25,393,38,340,61,393,38,340,286,340,286,393,38,392,56,340,286,392,56,392,275,206,0,213,0,225,80,225,80,213,0,340,286,225,80,340,286,335,331,335,331,340,286,435,331,109,331,11,331,31,319,109,331,31,319,45,315,109,331,45,315,53,307,109,331,53,307,57,294,109,331,57,294,58,275,109,331,58,275,80,275,109,331,80,275,206,0,109,331,206,0,225,80,80,75,80,275,58,275,80,75,58,275,81,48,81,48,58,275,58,75,81,48,58,75,85,29,85,29,58,75,57,47,85,29,57,47,94,18,94,18,57,47,53,29,94,18,53,29,127,0,435,0,435,9,417,12,435,0,417,12,404,17,435,0,404,17,340,40,435,0,340,40,336,26,107,12,94,18,127,0,107,12,127,0,127,9,127,0,9,9,9,0,435,0,296,9,296,0,340,40,404,17,340,61,31,319,11,331,11,321,393,294,340,286,392,275,
+352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,213,331,213,321,232,319,245,315,252,307,256,294,257,274,257,180,105,180,105,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,110,25,106,38,105,56,105,157,257,157,257,62,256,41,252,26,245,17,232,12,213,9,213,0,345,166,337,222,316,269,281,306,236,330,181,338,127,330,82,307,47,271,26,224,18,167,26,109,47,61,82,24,127,1,181,-6,235,1,280,24,315,60,337,108,345,166,16383,16383,288,169,286,134,281,103,273,76,261,53,247,35,235,26,223,19,210,15,197,12,182,11,168,12,155,15,143,19,131,25,120,33,103,52,91,75,82,102,77,132,75,166,76,194,81,222,88,247,98,269,109,286,122,298,135,308,150,314,165,318,181,320,194,319,207,316,220,311,231,305,243,296,258,279,271,257,
+50,25,42,16,149,0,149,0,42,16,29,12,149,0,29,12,9,9,149,331,9,331,29,319,149,331,29,319,42,315,149,331,42,315,50,307,149,331,50,307,53,294,149,331,53,294,118,315,149,331,118,315,130,319,149,331,130,319,149,321,54,274,106,38,105,56,105,180,105,157,257,157,105,180,257,157,257,180,257,180,257,157,312,25,257,180,312,25,309,37,54,274,105,56,105,274,54,274,105,274,106,294,54,274,106,294,110,307,54,274,110,307,118,315,54,274,118,315,53,294,252,26,245,17,352,0,352,0,245,17,232,12,352,0,232,12,213,9,333,319,352,321,352,331,333,319,352,331,320,315,320,315,352,331,256,294,320,315,256,294,257,274,309,37,257,274,257,180,307,55,307,274,257,274,257,274,307,274,309,293,257,274,309,293,312,307,352,331,213,331,232,319,352,331,232,319,245,315,352,331,245,315,252,307,352,331,252,307,256,294,352,0,352,9,333,12,352,0,333,12,320,17,352,0,320,17,256,41,352,0,256,41,252,26,257,62,256,41,320,17,257,62,320,17,312,25,257,62,312,25,257,157,149,0,149,9,130,12,149,0,130,12,118,17,149,0,118,17,53,39,149,0,53,39,50,25,54,61,53,39,118,17,54,61,118,17,110,25,54,61,110,25,106,38,54,61,106,38,54,274,149,0,9,9,9,0,352,0,213,9,213,0,257,274,309,37,307,55,232,319,213,331,213,321,320,315,257,274,312,307,29,319,9,331,9,321,
+345,166,337,222,316,269,281,306,236,330,181,338,127,330,82,307,47,271,26,224,18,167,26,109,47,61,82,24,127,1,181,-6,235,1,280,24,315,60,337,108,345,166,16383,16383,288,169,286,134,281,103,273,76,261,53,247,35,235,26,223,19,210,15,197,12,182,11,168,12,155,15,143,19,131,25,120,33,103,52,91,75,82,102,77,132,75,166,76,194,81,222,88,247,98,269,109,286,122,298,135,308,150,314,165,318,181,320,194,319,207,316,220,311,231,305,243,296,258,279,271,257,280,231,286,201,288,169,353,0,353,9,333,12,321,17,313,25,309,37,308,55,308,274,309,293,313,307,321,315,334,319,353,321,353,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,110,25,106,38,105,56,105,300,107,306,111,309,116,311,124,312,238,312,246,311,251,309,255,306,257,300,257,62,256,41,253,26,246,17,233,12,213,9,213,0,9,331,9,321,28,319,40,315,47,307,51,294,51,39,48,25,41,16,29,12,9,9,
+150,314,181,338,135,308,135,308,181,338,127,330,135,308,127,330,122,298,122,298,127,330,109,286,98,269,109,286,127,330,98,269,127,330,82,307,82,102,82,24,91,75,91,75,82,24,127,1,91,75,127,1,103,52,103,52,127,1,120,33,131,25,120,33,127,1,131,25,127,1,181,-6,236,330,181,338,194,319,194,319,181,338,181,320,165,318,181,320,181,338,165,318,181,338,150,314,223,19,210,15,235,1,235,1,210,15,197,12,235,1,197,12,182,11,182,11,168,12,181,-6,181,-6,168,12,155,15,181,-6,155,15,143,19,207,316,220,311,236,330,236,330,220,311,231,305,236,330,231,305,243,296,243,296,258,279,281,306,281,306,258,279,271,257,281,306,271,257,280,231,281,103,273,76,280,24,280,24,273,76,261,53,280,24,261,53,247,35,247,35,235,26,280,24,280,24,235,26,235,1,345,166,337,222,337,108,337,108,337,222,316,269,337,108,316,269,315,60,315,60,316,269,288,169,286,201,288,169,316,269,286,201,316,269,281,306,286,201,281,306,280,231,281,306,236,330,243,296,315,60,288,169,286,134,315,60,286,134,281,103,315,60,281,103,280,24,182,11,181,-6,235,1,82,307,47,271,47,61,82,307,47,61,75,166,82,307,75,166,76,194,82,307,76,194,81,222,82,307,81,222,88,247,82,307,88,247,98,269,82,102,77,132,82,24,82,24,77,132,75,166,26,109,47,61,47,271,26,109,47,271,26,224,26,109,26,224,18,167,82,24,75,166,47,61,223,19,235,1,235,26,236,330,194,319,207,316,131,25,181,-6,143,19,
+353,0,353,9,333,12,321,17,313,25,309,37,308,55,308,274,309,293,313,307,321,315,334,319,353,321,353,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,110,25,106,38,105,56,105,300,107,306,111,309,116,311,124,312,238,312,246,311,251,309,255,306,257,300,257,62,256,41,253,26,246,17,233,12,213,9,213,0,9,331,9,321,28,319,40,315,47,307,51,294,51,39,48,25,41,16,29,12,9,9,9,0,150,0,150,9,129,12,115,16,107,24,104,37,103,56,103,146,110,145,115,145,120,144,132,144,161,145,184,147,204,153,221,161,239,175,249,185,257,197,263,210,266,225,267,240,266,254,263,268,258,280,252,291,243,300,227,310,209,319,187,325,162,329,134,331,16383,16383,103,294,103,301,105,306,108,310,113,311,120,312,156,309,
+50,25,42,16,149,0,149,0,42,16,29,12,149,0,29,12,9,9,42,315,50,307,353,331,353,331,50,307,116,311,353,331,116,311,124,312,353,331,124,312,238,312,353,331,238,312,246,311,253,26,246,17,353,0,353,0,246,17,233,12,353,0,233,12,213,9,353,331,246,311,251,309,353,331,251,309,255,306,353,331,255,306,257,300,353,331,257,300,257,292,353,331,257,292,321,315,353,331,321,315,334,319,353,331,334,319,353,321,308,55,308,274,257,292,257,292,308,274,309,293,257,292,309,293,313,307,321,17,313,25,257,62,257,62,313,25,309,37,257,62,309,37,257,292,118,17,110,25,54,61,54,61,110,25,106,38,54,61,106,38,54,274,54,274,106,38,105,56,54,274,105,56,105,291,54,274,105,291,105,300,54,274,105,300,107,306,54,274,107,306,111,309,54,274,111,309,53,294,116,311,50,307,53,294,116,311,53,294,111,309,29,319,42,315,353,331,29,319,353,331,9,331,29,319,9,331,9,321,353,0,353,9,333,12,353,0,333,12,321,17,353,0,321,17,256,41,353,0,256,41,253,26,149,0,149,9,130,12,149,0,130,12,118,17,149,0,118,17,53,39,149,0,53,39,50,25,149,0,9,9,9,0,53,39,118,17,54,61,353,0,213,9,213,0,256,41,321,17,257,62,257,292,309,37,308,55,321,315,257,292,313,307,
+9,331,9,321,28,319,40,315,47,307,51,294,51,39,48,25,41,16,29,12,9,9,9,0,150,0,150,9,129,12,115,16,107,24,104,37,103,56,103,146,110,145,115,145,120,144,132,144,161,145,184,147,204,153,221,161,239,175,249,185,257,197,263,210,266,225,267,240,266,254,263,268,258,280,252,291,243,300,227,310,209,319,187,325,162,329,134,331,16383,16383,103,294,103,301,105,306,108,310,113,311,120,312,156,309,182,302,200,287,210,266,213,238,210,213,199,192,182,177,158,167,128,164,118,164,113,165,109,165,103,166,311,65,289,47,269,32,248,23,226,17,201,15,180,17,161,21,143,28,126,38,112,51,99,68,89,88,82,112,77,140,76,171,81,219,96,260,121,291,154,311,196,318,215,316,232,311,248,304,263,293,276,280,283,272,289,263,294,252,299,240,302,224,314,224,310,338,300,338,297,332,289,324,284,322,278,321,273,322,266,324,258,326,244,330,232,333,208,337,196,338,185,338,157,336,131,330,106,320,83,305,63,286,47,266,35,243,26,218,20,191,18,162,20,133,26,106,36,80,49,57,66,37,85,22,107,9,131,0,157,-4,
+113,311,120,312,120,312,134,331,120,312,156,309,134,331,156,309,162,329,162,329,156,309,182,302,162,329,182,302,187,325,187,325,182,302,200,287,187,325,200,287,209,319,209,319,200,287,210,266,209,319,210,266,227,310,227,310,210,266,213,238,227,310,213,238,221,161,221,161,210,213,204,153,204,153,210,213,199,192,204,153,199,192,184,147,184,147,199,192,182,177,184,147,182,177,161,145,161,145,182,177,158,167,161,145,158,167,132,144,132,144,158,167,128,164,132,144,128,164,125,144,125,144,128,164,122,164,125,144,122,164,120,144,120,144,122,164,118,164,120,144,118,164,115,145,115,145,118,164,113,165,115,145,113,165,110,145,110,145,113,165,109,165,110,145,109,165,103,146,103,146,109,165,103,166,103,146,103,166,103,56,103,56,103,166,51,276,103,56,51,276,104,37,104,37,51,276,51,61,267,240,266,254,266,225,266,225,266,254,263,268,266,225,263,268,263,210,263,210,263,268,258,280,263,210,258,280,257,197,257,197,258,280,252,291,257,197,252,291,249,185,249,185,252,291,243,300,249,185,243,300,239,175,239,175,243,300,227,310,239,175,227,310,221,161,134,331,9,331,28,319,134,331,28,319,40,315,134,331,40,315,47,307,134,331,47,307,51,294,134,331,51,294,51,276,134,331,51,276,108,310,134,331,108,310,113,311,134,331,113,311,120,312,103,294,103,301,51,276,103,294,51,276,103,166,105,306,108,310,51,276,105,306,51,276,103,301,150,0,150,9,129,12,150,0,129,12,115,16,150,0,115,16,51,39,150,0,51,39,48,25,150,0,48,25,41,16,150,0,41,16,29,12,150,0,29,12,9,9,150,0,9,9,9,0,51,61,51,39,115,16,51,61,115,16,107,24,51,61,107,24,104,37,28,319,9,331,9,321,210,213,221,161,213,238,
+311,65,289,47,269,32,248,23,226,17,201,15,180,17,161,21,143,28,126,38,112,51,99,68,89,88,82,112,77,140,76,171,81,219,96,260,121,291,154,311,196,318,215,316,232,311,248,304,263,293,276,280,283,272,289,263,294,252,299,240,302,224,314,224,310,338,300,338,297,332,289,324,284,322,278,321,273,322,266,324,258,326,244,330,232,333,208,337,196,338,185,338,157,336,131,330,106,320,83,305,63,286,47,266,35,243,26,218,20,191,18,162,20,133,26,106,36,80,49,57,66,37,85,22,107,9,131,0,157,-4,184,-6,218,-4,249,3,277,16,301,34,320,56,296,246,292,331,18,331,15,246,27,246,33,274,42,292,54,303,73,309,100,310,130,310,130,61,129,39,125,25,117,16,104,12,83,9,83,0,229,0,229,9,208,11,194,16,186,23,182,36,181,55,181,310,210,310,237,309,256,303,269,292,277,274,284,246,347,331,243,331,243,322,254,320,263,316,269,312,273,306,274,299,273,292,271,284,268,273,263,260,257,245,204,118,132,245,123,262,110,288,107,297,106,303,107,309,112,314,119,318,129,321,142,322,142,331,7,331,7,322,15,320,27,316,37,310,42,305,46,300,51,294,61,278,181,67,172,53,163,41,154,33,146,28,
+66,37,77,140,76,171,76,171,83,305,66,37,66,37,83,305,63,286,66,37,63,286,49,57,49,57,63,286,47,266,49,57,47,266,36,80,36,80,47,266,35,243,36,80,35,243,26,106,26,106,35,243,26,218,26,106,26,218,20,133,20,133,26,218,20,191,20,133,20,191,18,162,82,112,85,22,89,88,89,88,85,22,107,9,89,88,107,9,99,68,99,68,107,9,112,51,126,38,112,51,131,0,126,38,131,0,143,28,143,28,131,0,157,-4,143,28,157,-4,161,21,161,21,157,-4,184,-6,161,21,184,-6,180,17,180,17,184,-6,201,15,226,17,201,15,218,-4,226,17,218,-4,249,3,77,140,66,37,85,22,77,140,85,22,82,112,112,51,107,9,131,0,258,326,263,293,266,324,266,324,263,293,276,280,266,324,276,280,273,322,273,322,276,280,278,321,284,322,278,321,283,272,284,322,283,272,289,263,278,321,276,280,283,272,232,333,232,311,244,330,244,330,232,311,248,304,244,330,248,304,251,328,251,328,248,304,263,293,251,328,263,293,258,326,220,335,208,337,215,316,220,335,215,316,232,311,220,335,232,311,232,333,208,337,196,338,215,316,215,316,196,338,196,318,154,311,196,318,157,336,154,311,157,336,131,330,314,224,310,338,302,224,302,224,310,338,300,338,302,224,300,338,299,240,299,240,300,338,297,332,299,240,297,332,294,252,294,252,297,332,293,328,294,252,293,328,289,263,289,263,293,328,289,324,289,263,289,324,284,322,320,56,311,65,301,34,301,34,311,65,289,47,301,34,289,47,277,16,277,16,289,47,269,32,277,16,269,32,249,3,249,3,269,32,248,23,249,3,248,23,226,17,201,15,184,-6,218,-4,196,318,196,338,185,338,196,318,185,338,157,336,76,171,81,219,83,305,83,305,81,219,96,260,83,305,96,260,106,320,106,320,96,260,121,291,106,320,121,291,131,330,131,330,121,291,154,311,
+296,246,292,331,18,331,15,246,27,246,33,274,42,292,54,303,73,309,100,310,130,310,130,61,129,39,125,25,117,16,104,12,83,9,83,0,229,0,229,9,208,11,194,16,186,23,182,36,181,55,181,310,210,310,237,309,256,303,269,292,277,274,284,246,347,331,243,331,243,322,254,320,263,316,269,312,273,306,274,299,273,292,271,284,268,273,263,260,257,245,204,118,132,245,123,262,110,288,107,297,106,303,107,309,112,314,119,318,129,321,142,322,142,331,7,331,7,322,15,320,27,316,37,310,42,305,46,300,
+292,331,18,331,73,309,292,331,73,309,100,310,292,331,100,310,130,310,292,331,130,310,181,310,292,331,181,310,210,310,292,331,210,310,237,309,292,331,237,309,256,303,292,331,256,303,269,292,292,331,269,292,277,274,292,331,277,274,284,246,292,331,284,246,296,246,194,16,186,23,130,61,130,61,186,23,182,36,130,61,182,36,130,310,130,310,182,36,181,55,130,310,181,55,181,310,18,331,15,246,27,246,18,331,27,246,33,274,18,331,33,274,42,292,18,331,42,292,54,303,18,331,54,303,73,309,229,0,229,9,208,11,229,0,208,11,194,16,229,0,194,16,129,39,229,0,129,39,125,25,229,0,125,25,117,16,229,0,117,16,104,12,229,0,104,12,83,9,229,0,83,9,83,0,129,39,194,16,130,61,
+347,331,243,331,243,322,254,320,263,316,269,312,273,306,274,299,273,292,271,284,268,273,263,260,257,245,204,118,132,245,123,262,110,288,107,297,106,303,107,309,112,314,119,318,129,321,142,322,142,331,7,331,7,322,15,320,27,316,37,310,42,305,46,300,51,294,61,278,181,67,172,53,163,41,154,33,146,28,138,27,136,27,133,28,131,29,127,30,124,32,118,35,108,39,104,40,99,41,92,40,85,37,80,32,77,26,76,20,78,10,84,3,93,-2,104,-5,117,-6,132,-4,147,0,161,9,175,22,188,40,194,51,202,65,210,81,219,100,228,122,291,272,300,289,310,302,321,312,333,319,347,322,218,290,219,301,223,310,232,316,247,320,269,321,269,331,116,331,116,321,138,320,152,317,161,311,165,302,166,290,166,280,124,276,84,263,50,241,27,209,19,165,24,128,41,97,69,72,107,57,158,51,166,51,166,37,164,27,158,19,148,14,134,10,116,9,116,0,269,0,269,9,248,11,233,14,224,19,219,27,218,38,218,51,230,51,265,56,302,69,334,91,357,123,366,165,357,209,333,241,300,263,260,276,218,280,16383,16383,217,262,251,256,278,240,296,216,307,188,311,159,305,128,291,103,270,85,244,74,217,70,16383,16383,167,70,135,75,108,88,89,107,78,132,74,159,78,189,91,216,111,240,136,256,
+21,318,27,316,142,331,142,331,27,316,32,313,142,331,32,313,37,310,37,310,42,305,142,331,142,331,42,305,46,300,142,331,46,300,51,294,61,278,181,67,107,297,61,278,107,297,106,303,106,303,107,309,61,278,61,278,107,309,112,314,61,278,112,314,56,286,142,331,51,294,56,286,142,331,56,286,112,314,142,331,112,314,119,318,142,331,119,318,129,321,142,331,129,321,142,322,15,320,21,318,142,331,15,320,142,331,7,331,15,320,7,331,7,322,133,28,131,29,132,-4,132,-4,131,29,127,30,132,-4,127,30,124,32,124,32,118,35,132,-4,132,-4,118,35,117,-6,181,67,172,53,175,22,175,22,172,53,163,41,175,22,163,41,161,9,161,9,163,41,154,33,161,9,154,33,147,0,147,0,154,33,146,28,147,0,146,28,138,27,138,27,136,27,147,0,147,0,136,27,133,28,147,0,133,28,132,-4,257,245,204,118,210,81,257,245,210,81,219,100,257,245,219,100,228,122,257,245,228,122,291,272,347,331,243,331,254,320,347,331,254,320,263,316,347,331,263,316,269,312,347,331,269,312,273,306,347,331,273,306,274,299,347,331,274,299,321,312,347,331,321,312,333,319,347,331,333,319,347,322,291,272,300,289,274,299,291,272,274,299,273,292,291,272,273,292,271,284,291,272,271,284,268,273,291,272,268,273,263,260,291,272,263,260,257,245,310,302,321,312,274,299,310,302,274,299,300,289,204,118,132,245,181,67,204,118,181,67,188,40,204,118,188,40,194,51,204,118,194,51,202,65,204,118,202,65,210,81,181,67,132,245,123,262,181,67,123,262,116,276,181,67,116,276,110,288,181,67,110,288,107,297,118,35,113,37,117,-6,117,-6,113,37,108,39,117,-6,108,39,104,-5,104,-5,108,39,104,40,104,-5,104,40,99,41,93,-2,104,-5,99,41,93,-2,99,41,92,40,93,-2,92,40,85,37,93,-2,85,37,84,3,80,32,77,26,78,10,80,32,78,10,84,3,80,32,84,3,85,37,78,10,77,26,76,20,181,67,175,22,188,40,254,320,243,331,243,322,
+218,290,219,301,223,310,232,316,247,320,269,321,269,331,116,331,116,321,138,320,152,317,161,311,165,302,166,290,166,280,124,276,84,263,50,241,27,209,19,165,24,128,41,97,69,72,107,57,158,51,166,51,166,37,164,27,158,19,148,14,134,10,116,9,116,0,269,0,269,9,248,11,233,14,224,19,219,27,218,38,218,51,230,51,265,56,302,69,334,91,357,123,366,165,357,209,333,241,300,263,260,276,218,280,16383,16383,217,262,251,256,278,240,296,216,307,188,311,159,305,128,291,103,270,85,244,74,217,70,16383,16383,167,70,135,75,108,88,89,107,78,132,74,159,78,189,91,216,111,240,136,256,167,262,352,0,352,9,337,12,326,16,316,22,306,32,296,46,200,184,272,272,289,292,303,305,316,314,330,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,262,301,260,296,256,290,250,282,243,272,187,202,165,234,151,255,139,272,130,286,125,297,123,306,124,312,127,316,132,319,139,320,147,320,161,321,161,331,11,331,11,321,28,319,43,312,58,299,77,276,102,242,155,164,77,66,57,42,42,26,30,17,18,12,4,9,4,0,121,0,121,9,105,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,99,57,109,70,169,145,216,74,225,60,232,48,238,38,241,31,242,25,241,20,
+269,321,269,321,247,320,247,320,269,321,269,331,247,320,269,331,232,316,232,316,269,331,166,290,232,316,166,290,223,310,223,310,166,290,167,262,219,27,167,262,167,70,219,27,167,70,224,19,224,19,167,70,166,51,224,19,166,51,166,37,218,38,217,70,167,262,167,262,217,70,217,262,167,262,217,262,218,290,218,290,217,262,218,280,219,301,223,310,167,262,219,301,167,262,218,290,166,290,269,331,165,302,269,331,116,331,138,320,269,331,138,320,152,317,269,331,152,317,161,311,269,331,161,311,165,302,91,216,111,240,124,276,124,276,111,240,136,256,124,276,136,256,166,280,166,280,136,256,167,262,166,280,167,262,166,290,84,263,50,241,74,159,84,263,74,159,78,189,84,263,78,189,91,216,84,263,91,216,124,276,19,165,24,128,27,209,27,209,24,128,41,97,27,209,41,97,50,241,50,241,41,97,69,72,50,241,69,72,74,159,334,91,311,159,305,128,334,91,305,128,302,69,302,69,305,128,291,103,302,69,291,103,270,85,307,188,311,159,333,241,333,241,311,159,334,91,333,241,334,91,357,209,357,209,334,91,357,123,357,209,357,123,366,165,300,263,260,276,278,240,300,263,278,240,296,216,300,263,296,216,307,188,300,263,307,188,333,241,251,256,278,240,260,276,251,256,260,276,218,280,251,256,218,280,217,262,218,51,230,51,244,74,244,74,230,51,265,56,244,74,265,56,270,85,270,85,265,56,302,69,218,38,167,262,219,27,218,38,218,51,217,70,269,0,269,9,248,11,269,0,248,11,233,14,269,0,233,14,166,37,269,0,166,37,164,27,269,0,164,27,158,19,269,0,158,19,148,14,269,0,148,14,134,10,269,0,134,10,116,9,269,0,116,9,116,0,158,51,166,51,167,70,158,51,167,70,135,75,158,51,135,75,108,88,158,51,108,88,107,57,74,159,69,72,78,132,78,132,69,72,107,57,78,132,107,57,89,107,89,107,107,57,108,88,166,37,233,14,224,19,217,70,218,51,244,74,138,320,116,331,116,321,
+352,0,352,9,337,12,326,16,316,22,306,32,296,46,200,184,272,272,289,292,303,305,316,314,330,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,262,301,260,296,256,290,250,282,243,272,187,202,165,234,151,255,139,272,130,286,125,297,123,306,124,312,127,316,132,319,139,320,147,320,161,321,161,331,11,331,11,321,28,319,43,312,58,299,77,276,102,242,155,164,77,66,57,42,42,26,30,17,18,12,4,9,4,0,121,0,121,9,105,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,99,57,109,70,169,145,216,74,225,60,232,48,238,38,241,31,242,25,241,20,237,16,232,14,225,12,217,11,204,9,204,0,348,-75,348,9,329,12,316,16,308,24,305,37,304,57,304,292,308,306,316,315,329,319,348,321,348,331,209,331,209,321,228,319,240,315,248,306,251,293,252,275,252,28,250,23,247,21,242,19,115,19,110,21,107,23,105,28,105,269,106,290,109,305,117,314,129,319,149,321,149,331,9,331,9,321,28,319,41,314,49,306,53,294,54,276,54,57,53,37,49,24,41,16,28,12,9,9,9,0,284,0,299,-5,312,-15,323,-29,331,-49,332,-54,333,-60,335,-67,335,-72,336,-75,320,0,320,9,301,12,288,16,280,24,276,37,275,57,275,269,276,291,280,306,288,315,301,319,320,321,320,331,186,331,186,321,204,319,214,316,221,309,223,299,224,283,224,174,216,170,
+30,17,121,0,42,26,42,26,121,0,88,17,42,26,88,17,57,42,57,42,88,17,84,21,57,42,84,21,83,26,83,26,84,31,77,66,77,66,84,31,87,38,77,66,87,38,155,164,155,164,87,38,92,46,155,164,92,46,99,57,102,242,155,164,125,297,102,242,125,297,123,306,123,306,124,312,102,242,155,164,99,57,109,70,109,70,169,145,155,164,155,164,169,145,165,234,155,164,165,234,151,255,77,66,57,42,83,26,161,331,11,331,28,319,161,331,28,319,43,312,161,331,43,312,58,299,161,331,58,299,132,319,161,331,132,319,139,320,161,331,139,320,147,320,161,331,147,320,161,321,132,319,58,299,127,316,127,316,58,299,77,276,127,316,77,276,124,312,124,312,77,276,102,242,260,296,256,290,272,272,272,272,256,290,250,282,272,272,250,282,243,272,243,272,187,202,200,184,200,184,187,202,216,74,200,184,216,74,296,46,296,46,216,74,225,60,296,46,225,60,232,48,348,331,229,331,243,320,348,331,243,320,253,319,348,331,253,319,259,316,348,331,259,316,262,311,348,331,262,311,263,305,348,331,263,305,316,314,348,331,316,314,330,319,348,331,330,319,348,321,263,305,272,272,289,292,263,305,289,292,303,305,263,305,303,305,316,314,262,301,260,296,272,272,262,301,272,272,263,305,243,272,200,184,272,272,237,16,232,14,352,0,352,0,232,14,225,12,352,0,225,12,217,11,242,25,352,0,326,16,242,25,326,16,316,22,242,25,316,22,306,32,242,25,306,32,296,46,242,25,296,46,241,31,296,46,232,48,238,38,296,46,238,38,241,31,187,202,165,234,169,145,187,202,169,145,216,74,337,12,326,16,352,0,337,12,352,0,352,9,241,20,237,16,352,0,241,20,352,0,242,25,204,9,204,0,352,0,204,9,352,0,217,11,155,164,151,255,139,272,155,164,139,272,130,286,155,164,130,286,125,297,121,0,121,9,105,11,121,0,105,11,95,13,121,0,95,13,88,17,18,12,4,9,121,0,18,12,121,0,30,17,121,0,4,9,4,0,243,320,229,331,229,321,28,319,11,331,11,321,
+348,-75,348,9,329,12,316,16,308,24,305,37,304,57,304,292,308,306,316,315,329,319,348,321,348,331,209,331,209,321,228,319,240,315,248,306,251,293,252,275,252,28,250,23,247,21,242,19,115,19,110,21,107,23,105,28,105,269,106,290,109,305,117,314,129,319,149,321,149,331,9,331,9,321,28,319,41,314,49,306,53,294,54,276,54,57,53,37,49,24,41,16,28,12,9,9,9,0,284,0,299,-5,312,-15,323,-29,331,-49,332,-54,333,-60,335,-67,335,-72,336,-75,320,0,320,9,301,12,288,16,280,24,276,37,275,57,275,269,276,291,280,306,288,315,301,319,320,321,320,331,186,331,186,321,204,319,214,316,221,309,223,299,224,283,224,174,216,170,204,166,190,161,173,158,155,156,132,158,116,165,105,176,99,193,97,216,97,273,98,294,101,307,109,315,121,319,139,321,139,331,2,331,2,321,21,319,34,315,41,307,45,293,46,273,46,211,50,178,62,155,80,142,104,136,133,134,157,136,178,140,197,145,212,152,224,157,224,57,223,37,
+49,24,41,16,268,0,268,0,41,16,28,12,268,0,28,12,9,9,149,331,9,331,28,319,149,331,28,319,41,314,149,331,41,314,49,306,149,331,49,306,53,294,149,331,53,294,117,314,149,331,117,314,129,319,149,331,129,319,149,321,110,21,107,23,54,57,54,57,107,23,105,28,54,57,105,28,54,276,54,276,105,28,105,34,54,276,105,34,105,269,54,276,105,269,106,290,54,276,106,290,109,305,54,276,109,305,117,314,54,276,117,314,53,294,329,319,348,321,348,331,329,319,348,331,316,315,316,315,348,331,251,293,316,315,251,293,252,275,268,0,252,275,252,35,268,0,252,35,252,28,316,16,308,24,312,-15,312,-15,308,24,305,37,312,-15,305,37,299,-5,299,-5,305,37,304,57,299,-5,304,57,304,270,252,275,268,0,304,292,304,292,268,0,284,0,304,292,284,0,304,270,304,270,284,0,299,-5,308,306,316,315,252,275,308,306,252,275,304,292,348,331,209,331,228,319,348,331,228,319,240,315,348,331,240,315,248,306,348,331,248,306,251,293,333,-60,348,9,332,-54,332,-54,348,9,331,-49,323,-29,331,-49,329,12,323,-29,329,12,316,16,348,9,333,-60,335,-67,348,9,335,-67,335,-72,348,9,335,-72,336,-75,348,9,336,-75,348,-75,348,9,329,12,331,-49,268,0,252,28,250,23,268,0,250,23,247,21,268,0,247,21,242,19,268,0,242,19,235,19,268,0,235,19,123,19,268,0,123,19,115,19,268,0,115,19,49,24,110,21,54,57,53,37,110,21,53,37,49,24,110,21,49,24,115,19,268,0,9,9,9,0,316,16,312,-15,323,-29,228,319,209,331,209,321,28,319,9,331,9,321,
+320,0,320,9,301,12,288,16,280,24,276,37,275,57,275,269,276,291,280,306,288,315,301,319,320,321,320,331,186,331,186,321,204,319,214,316,221,309,223,299,224,283,224,174,216,170,204,166,190,161,173,158,155,156,132,158,116,165,105,176,99,193,97,216,97,273,98,294,101,307,109,315,121,319,139,321,139,331,2,331,2,321,21,319,34,315,41,307,45,293,46,273,46,211,50,178,62,155,80,142,104,136,133,134,157,136,178,140,197,145,212,152,224,157,224,57,223,37,219,24,211,16,199,12,180,9,180,0,483,0,483,9,463,12,450,16,443,24,439,37,438,57,438,270,439,292,443,306,450,315,463,319,483,321,483,331,343,331,344,321,362,319,375,315,383,306,386,293,387,275,387,28,385,23,382,21,377,19,282,19,277,21,274,23,272,27,272,269,273,290,276,305,283,314,296,319,315,321,315,331,183,331,183,321,200,319,210,314,217,306,220,294,220,28,218,23,215,21,210,19,120,19,115,21,112,23,110,28,110,269,111,291,114,306,120,315,131,320,147,321,147,331,15,331,15,321,34,319,46,314,54,306,58,294,59,276,
+139,321,139,321,121,319,121,319,139,321,139,331,121,319,139,331,109,315,109,315,139,331,45,293,109,315,45,293,46,273,50,178,46,273,46,211,132,158,116,165,133,134,133,134,116,165,105,176,133,134,105,176,104,136,104,136,105,176,99,193,104,136,99,193,80,142,80,142,99,193,97,216,80,142,97,216,97,273,46,273,50,178,101,307,101,307,50,178,62,155,101,307,62,155,98,294,98,294,62,155,80,142,98,294,80,142,97,273,139,331,2,331,21,319,139,331,21,319,34,315,139,331,34,315,41,307,139,331,41,307,45,293,224,283,224,174,224,157,224,157,224,174,216,170,224,157,216,170,212,152,212,152,216,170,204,166,212,152,204,166,197,145,197,145,204,166,190,161,197,145,190,161,178,140,178,140,190,161,173,158,178,140,173,158,157,136,157,136,173,158,155,156,133,134,157,136,155,156,133,134,155,156,132,158,320,331,186,331,204,319,320,331,204,319,214,316,320,331,214,316,221,309,320,331,221,309,223,299,320,331,223,299,224,283,320,331,224,283,288,315,320,331,288,315,301,319,320,331,301,319,320,321,275,57,275,269,224,157,224,157,275,269,276,291,224,157,276,291,280,306,224,283,224,157,280,306,224,283,280,306,288,315,320,0,320,9,301,12,320,0,301,12,288,16,320,0,288,16,223,37,320,0,223,37,219,24,320,0,219,24,211,16,320,0,211,16,199,12,320,0,199,12,180,9,320,0,180,9,180,0,224,157,280,24,276,37,224,157,276,37,275,57,224,57,223,37,288,16,224,57,288,16,280,24,224,57,280,24,224,157,204,319,186,331,186,321,21,319,2,331,2,321,109,315,46,273,101,307,
+483,0,483,9,463,12,450,16,443,24,439,37,438,57,438,270,439,292,443,306,450,315,463,319,483,321,483,331,343,331,344,321,362,319,375,315,383,306,386,293,387,275,387,28,385,23,382,21,377,19,282,19,277,21,274,23,272,27,272,269,273,290,276,305,283,314,296,319,315,321,315,331,183,331,183,321,200,319,210,314,217,306,220,294,220,28,218,23,215,21,210,19,120,19,115,21,112,23,110,28,110,269,111,291,114,306,120,315,131,320,147,321,147,331,15,331,15,321,34,319,46,314,54,306,58,294,59,276,59,57,58,37,54,24,46,16,33,12,15,9,15,0,483,-75,483,9,463,12,450,16,443,24,439,37,438,57,438,270,439,292,443,306,450,315,463,319,483,321,483,331,343,331,344,321,362,319,375,315,383,306,386,293,387,275,387,28,385,23,382,21,377,19,282,19,277,21,274,23,272,27,272,269,273,290,276,305,283,314,296,319,315,321,315,331,183,331,183,321,200,319,210,314,217,306,220,294,220,28,218,23,215,21,210,19,120,19,115,21,112,23,110,28,110,269,111,291,114,306,120,315,131,320,147,321,147,331,15,331,15,321,34,319,46,314,54,306,58,294,59,276,59,57,58,37,54,24,46,16,33,12,15,9,15,0,
+59,57,58,37,115,21,115,21,58,37,54,24,115,21,54,24,120,19,120,19,54,24,46,16,120,19,46,16,483,0,483,0,46,16,33,12,483,0,33,12,15,9,147,331,15,331,34,319,147,331,34,319,46,314,147,331,46,314,54,306,147,331,54,306,58,294,147,331,58,294,120,315,147,331,120,315,131,320,147,331,131,320,147,321,115,21,112,23,59,57,59,57,112,23,110,28,59,57,110,28,59,276,59,276,110,28,110,34,59,276,110,34,110,269,59,276,110,269,111,291,59,276,111,291,114,306,59,276,114,306,120,315,59,276,120,315,58,294,296,319,315,321,315,331,296,319,315,331,283,314,283,314,315,331,220,294,283,314,220,294,220,276,272,27,220,276,220,35,272,27,220,35,274,23,274,23,220,35,277,21,272,33,272,269,220,276,220,276,272,269,273,290,220,276,273,290,276,305,315,331,183,331,200,319,315,331,200,319,210,314,315,331,210,314,217,306,315,331,217,306,220,294,463,319,483,321,483,331,463,319,483,331,450,315,450,315,483,331,386,293,450,315,386,293,387,275,439,37,387,275,387,35,439,37,387,35,443,24,443,24,387,35,450,16,438,57,438,270,387,275,387,275,438,270,439,292,387,275,439,292,443,306,483,331,343,331,344,321,483,331,344,321,362,319,483,331,362,319,375,315,483,331,375,315,383,306,483,331,383,306,386,293,483,0,483,9,463,12,483,0,463,12,450,16,483,0,450,16,387,35,483,0,387,35,387,28,483,0,387,28,385,23,483,0,385,23,382,21,483,0,382,21,377,19,483,0,377,19,371,19,483,0,371,19,289,19,483,0,289,19,282,19,483,0,282,19,218,23,483,0,218,23,215,21,483,0,215,21,210,19,483,0,210,19,203,19,483,0,203,19,127,19,483,0,127,19,120,19,282,19,277,21,220,35,282,19,220,35,220,28,282,19,220,28,218,23,483,0,15,9,15,0,220,276,272,27,272,33,387,275,439,37,438,57,450,315,387,275,443,306,200,319,183,331,183,321,283,314,220,276,276,305,34,319,15,331,15,321,
+483,-75,483,9,463,12,450,16,443,24,439,37,438,57,438,270,439,292,443,306,450,315,463,319,483,321,483,331,343,331,344,321,362,319,375,315,383,306,386,293,387,275,387,28,385,23,382,21,377,19,282,19,277,21,274,23,272,27,272,269,273,290,276,305,283,314,296,319,315,321,315,331,183,331,183,321,200,319,210,314,217,306,220,294,220,28,218,23,215,21,210,19,120,19,115,21,112,23,110,28,110,269,111,291,114,306,120,315,131,320,147,321,147,331,15,331,15,321,34,319,46,314,54,306,58,294,59,276,59,57,58,37,54,24,46,16,33,12,15,9,15,0,419,0,433,-5,446,-15,457,-29,465,-49,467,-55,468,-61,469,-68,470,-73,470,-75,171,183,171,274,172,293,177,307,186,315,200,319,219,321,219,331,10,331,7,246,18,246,25,274,33,293,45,304,63,309,90,310,120,310,120,56,119,37,114,24,106,16,92,11,72,9,72,0,231,0,271,4,305,15,330,34,346,59,352,91,345,126,327,153,299,170,262,180,219,183,16383,16383,171,163,204,163,231,161,256,154,276,141,289,120,294,89,289,59,275,39,253,27,226,21,195,19,185,20,178,22,174,26,171,33,171,41,432,0,432,9,414,12,401,17,393,25,389,38,388,57,388,274,389,294,393,307,401,315,414,319,432,321,432,331,292,331,292,321,312,319,325,315,332,307,336,294,337,274,337,61,336,39,333,25,325,16,312,12,292,9,292,0,
+59,57,58,37,115,21,115,21,58,37,54,24,115,21,54,24,120,19,120,19,54,24,46,16,120,19,46,16,402,0,402,0,46,16,33,12,402,0,33,12,15,9,147,331,15,331,34,319,147,331,34,319,46,314,147,331,46,314,54,306,147,331,54,306,58,294,147,331,58,294,120,315,147,331,120,315,131,320,147,331,131,320,147,321,115,21,112,23,59,57,59,57,112,23,110,28,59,57,110,28,59,276,59,276,110,28,110,34,59,276,110,34,110,269,59,276,110,269,111,291,59,276,111,291,114,306,59,276,114,306,120,315,59,276,120,315,58,294,296,319,315,321,315,331,296,319,315,331,283,314,283,314,315,331,220,294,283,314,220,294,220,276,272,27,220,276,220,35,272,27,220,35,274,23,274,23,220,35,277,21,272,33,272,269,220,276,220,276,272,269,273,290,220,276,273,290,276,305,315,331,183,331,200,319,315,331,200,319,210,314,315,331,210,314,217,306,315,331,217,306,220,294,463,319,483,321,483,331,463,319,483,331,450,315,450,315,483,331,386,293,450,315,386,293,387,275,402,0,387,275,387,35,402,0,387,35,387,28,450,16,443,24,446,-15,446,-15,443,24,439,37,446,-15,439,37,433,-5,433,-5,439,37,438,57,433,-5,438,57,438,270,387,275,402,0,439,292,439,292,402,0,419,0,439,292,419,0,438,270,438,270,419,0,433,-5,443,306,450,315,387,275,443,306,387,275,439,292,483,331,343,331,344,321,483,331,344,321,362,319,483,331,362,319,375,315,483,331,375,315,383,306,483,331,383,306,386,293,468,-61,483,9,467,-55,467,-55,483,9,465,-49,457,-29,465,-49,463,12,457,-29,463,12,450,16,483,9,468,-61,469,-68,483,9,469,-68,470,-73,483,9,470,-73,470,-75,483,9,470,-75,483,-75,483,9,463,12,465,-49,402,0,387,28,385,23,402,0,385,23,382,21,402,0,382,21,377,19,402,0,377,19,371,19,402,0,371,19,289,19,402,0,289,19,282,19,402,0,282,19,220,28,402,0,220,28,218,23,402,0,218,23,215,21,402,0,215,21,210,19,402,0,210,19,203,19,402,0,203,19,127,19,402,0,127,19,120,19,220,35,220,28,282,19,220,35,282,19,277,21,402,0,15,9,15,0,220,276,272,27,272,33,450,16,446,-15,457,-29,200,319,183,331,183,321,283,314,220,276,276,305,34,319,15,331,15,321,
+171,183,171,274,172,293,177,307,186,315,200,319,219,321,219,331,10,331,7,246,18,246,25,274,33,293,45,304,63,309,90,310,120,310,120,56,119,37,114,24,106,16,92,11,72,9,72,0,231,0,271,4,305,15,330,34,346,59,352,91,345,126,327,153,299,170,262,180,219,183,16383,16383,171,163,204,163,231,161,256,154,276,141,289,120,294,89,289,59,275,39,253,27,226,21,195,19,185,20,178,22,174,26,171,33,171,41,432,0,432,9,414,12,401,17,393,25,389,38,388,57,388,274,389,294,393,307,401,315,414,319,432,321,432,331,292,331,292,321,312,319,325,315,332,307,336,294,337,274,337,61,336,39,333,25,325,16,312,12,292,9,292,0,16383,16383,108,183,108,274,110,293,115,307,123,315,137,319,156,321,156,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,170,0,210,4,
+114,24,106,16,231,0,231,0,106,16,92,11,231,0,92,11,72,9,177,307,186,315,120,310,120,310,186,315,219,331,120,310,219,331,90,310,63,309,90,310,219,331,63,309,219,331,10,331,200,319,219,321,219,331,200,319,219,331,186,315,120,310,171,33,171,41,171,183,171,163,204,163,171,183,204,163,219,183,219,183,204,163,231,161,219,183,231,161,262,180,262,180,231,161,256,154,262,180,256,154,276,141,120,310,171,41,171,274,120,310,171,274,172,293,120,310,172,293,177,307,10,331,7,246,18,246,10,331,18,246,25,274,10,331,25,274,33,293,10,331,33,293,45,304,10,331,45,304,63,309,294,89,289,59,305,15,305,15,289,59,275,39,305,15,275,39,271,4,271,4,275,39,253,27,271,4,253,27,231,0,231,0,253,27,226,21,231,0,226,21,195,19,195,19,185,20,231,0,231,0,185,20,178,22,231,0,178,22,119,37,119,37,178,22,120,56,299,170,294,89,305,15,299,170,305,15,327,153,327,153,305,15,330,34,327,153,330,34,345,126,345,126,330,34,346,59,345,126,346,59,352,91,299,170,262,180,276,141,299,170,276,141,289,120,299,170,289,120,294,89,120,56,178,22,174,26,120,56,174,26,171,33,120,56,171,33,120,310,231,0,72,9,72,0,114,24,231,0,119,37,
+432,0,432,9,414,12,401,17,393,25,389,38,388,57,388,274,389,294,393,307,401,315,414,319,432,321,432,331,292,331,292,321,312,319,325,315,332,307,336,294,337,274,337,61,336,39,333,25,325,16,312,12,292,9,292,0,16383,16383,108,183,108,274,110,293,115,307,123,315,137,319,156,321,156,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,170,0,210,4,244,15,268,34,284,59,290,91,283,126,265,153,238,170,201,180,158,183,16383,16383,108,163,142,163,170,161,194,154,214,141,227,120,232,89,227,59,214,39,193,27,166,21,134,19,123,20,115,22,111,26,109,33,108,41,108,183,108,274,110,293,115,307,123,315,137,319,156,321,156,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,170,0,210,4,243,15,268,34,284,59,289,91,283,126,265,153,237,170,201,180,158,183,16383,16383,108,163,142,163,170,161,194,154,214,141,227,120,232,89,227,59,213,39,193,27,166,21,134,19,123,20,115,22,111,26,109,33,108,41,26,338,23,224,36,224,39,239,42,252,46,263,51,272,57,280,71,293,85,304,101,311,118,316,136,318,173,312,203,293,226,265,241,228,248,184,103,184,103,161,248,161,248,142,246,124,242,108,237,92,231,78,218,57,201,39,181,26,
+432,321,432,321,414,319,414,319,432,321,432,331,414,319,432,331,401,315,401,315,432,331,336,294,401,315,336,294,337,274,389,38,337,274,337,61,389,38,337,61,393,25,393,25,337,61,401,17,388,57,388,274,337,274,337,274,388,274,389,294,337,274,389,294,393,307,432,331,292,331,312,319,432,331,312,319,325,315,432,331,325,315,332,307,432,331,332,307,336,294,432,0,432,9,414,12,432,0,414,12,401,17,432,0,401,17,336,39,432,0,336,39,333,25,432,0,333,25,325,16,432,0,325,16,312,12,432,0,312,12,292,9,432,0,292,9,292,0,52,24,43,16,170,0,170,0,43,16,30,11,170,0,30,11,9,9,156,331,9,331,30,320,156,331,30,320,44,316,156,331,44,316,52,308,156,331,52,308,56,295,156,331,56,295,123,315,156,331,123,315,137,319,156,331,137,319,156,321,57,275,109,33,108,41,108,183,108,163,142,163,108,183,142,163,158,183,158,183,142,163,170,161,158,183,170,161,201,180,201,180,170,161,194,154,201,180,194,154,214,141,57,275,108,41,108,274,57,275,108,274,110,293,57,275,110,293,115,307,57,275,115,307,123,315,57,275,123,315,56,295,232,89,227,59,244,15,244,15,227,59,214,39,244,15,214,39,210,4,210,4,214,39,193,27,210,4,193,27,170,0,170,0,193,27,166,21,170,0,166,21,134,19,134,19,123,20,170,0,170,0,123,20,115,22,170,0,115,22,56,37,56,37,115,22,57,56,238,170,232,89,244,15,238,170,244,15,265,153,265,153,244,15,268,34,265,153,268,34,283,126,283,126,268,34,284,59,283,126,284,59,290,91,238,170,201,180,214,141,238,170,214,141,227,120,238,170,227,120,232,89,57,56,115,22,111,26,57,56,111,26,109,33,57,56,109,33,57,275,170,0,9,9,9,0,52,24,170,0,56,37,30,320,9,331,9,321,336,39,401,17,337,61,337,274,389,38,388,57,312,319,292,331,292,321,401,315,337,274,393,307,
+108,183,108,274,110,293,115,307,123,315,137,319,156,321,156,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,170,0,210,4,243,15,268,34,284,59,289,91,283,126,265,153,237,170,201,180,158,183,16383,16383,108,163,142,163,170,161,194,154,214,141,227,120,232,89,227,59,213,39,193,27,166,21,134,19,123,20,115,22,111,26,109,33,108,41,26,338,23,224,36,224,39,239,42,252,46,263,51,272,57,280,71,293,85,304,101,311,118,316,136,318,173,312,203,293,226,265,241,228,248,184,103,184,103,161,248,161,248,142,246,124,242,108,237,92,231,78,218,57,201,39,181,26,158,18,131,15,107,17,86,23,65,32,45,46,25,65,15,55,33,33,55,16,80,3,109,-4,141,-6,168,-4,194,0,218,9,240,22,258,37,275,57,288,79,298,104,304,131,
+52,24,43,16,170,0,170,0,43,16,30,11,170,0,30,11,9,9,156,331,9,331,30,320,156,331,30,320,44,316,156,331,44,316,52,308,156,331,52,308,56,295,156,331,56,295,123,315,156,331,123,315,137,319,156,331,137,319,156,321,57,275,109,33,108,41,108,183,108,163,142,163,108,183,142,163,158,183,158,183,142,163,170,161,158,183,170,161,201,180,201,180,170,161,194,154,201,180,194,154,214,141,57,275,108,41,108,274,57,275,108,274,110,293,57,275,110,293,115,307,57,275,115,307,123,315,57,275,123,315,56,295,57,56,56,37,115,22,115,22,56,37,170,0,115,22,170,0,123,20,123,20,170,0,134,19,166,21,134,19,170,0,166,21,170,0,193,27,193,27,170,0,210,4,193,27,210,4,213,39,213,39,210,4,243,15,213,39,243,15,227,59,227,59,243,15,232,89,237,170,232,89,243,15,237,170,243,15,265,153,265,153,243,15,268,34,265,153,268,34,283,126,283,126,268,34,284,59,283,126,284,59,289,91,237,170,201,180,214,141,237,170,214,141,227,120,237,170,227,120,232,89,57,56,115,22,111,26,57,56,111,26,109,33,57,56,109,33,57,275,170,0,9,9,9,0,52,24,170,0,56,37,30,320,9,331,9,321,
+26,338,23,224,36,224,39,239,42,252,46,263,51,272,57,280,71,293,85,304,101,311,118,316,136,318,173,312,203,293,226,265,241,228,248,184,103,184,103,161,248,161,248,142,246,124,242,108,237,92,231,78,218,57,201,39,181,26,158,18,131,15,107,17,86,23,65,32,45,46,25,65,15,55,33,33,55,16,80,3,109,-4,141,-6,168,-4,194,0,218,9,240,22,258,37,275,57,288,79,298,104,304,131,306,160,305,188,299,215,290,240,278,263,263,284,244,304,222,319,198,330,173,336,147,338,136,338,124,337,113,336,101,333,90,330,83,328,75,326,61,322,55,321,50,322,45,324,41,328,38,332,36,338,105,180,105,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,110,25,106,38,105,56,105,157,149,157,157,102,177,57,207,22,245,0,291,-6,337,1,376,24,405,60,425,108,431,166,425,222,406,269,377,306,338,330,291,338,245,331,207,310,178,276,158,232,149,180,16383,16383,377,169,376,134,373,103,367,76,359,53,347,35,337,26,327,19,315,15,303,12,291,11,279,12,268,15,257,19,247,25,237,33,224,52,214,75,208,102,204,132,203,166,204,194,207,222,211,247,
+36,338,36,338,38,332,38,332,36,338,39,239,38,332,39,239,41,328,41,328,39,239,42,252,41,328,42,252,45,324,45,324,42,252,46,263,45,324,46,263,50,322,50,322,46,263,51,272,50,322,51,272,55,321,55,321,51,272,57,280,55,321,57,280,61,322,36,224,39,239,36,338,36,224,36,338,26,338,36,224,26,338,23,224,75,326,68,324,71,293,71,293,68,324,61,322,71,293,61,322,57,280,90,330,83,328,85,304,90,330,85,304,101,311,90,330,101,311,101,333,75,326,71,293,85,304,75,326,85,304,83,328,248,142,246,124,258,37,258,37,246,124,242,108,258,37,242,108,240,22,240,22,242,108,237,92,240,22,237,92,231,78,231,78,218,57,218,9,218,9,218,57,201,39,218,9,201,39,194,0,194,0,201,39,181,26,194,0,181,26,168,-4,168,-4,181,26,158,18,168,-4,158,18,141,-6,141,-6,158,18,131,15,131,15,107,17,109,-4,109,-4,107,17,86,23,109,-4,86,23,80,3,80,3,86,23,65,32,80,3,65,32,55,16,55,16,65,32,45,46,55,16,45,46,33,33,33,33,45,46,25,65,33,33,25,65,15,55,136,318,136,338,124,337,136,318,124,337,118,316,136,318,147,338,136,338,118,316,124,337,113,336,118,316,113,336,101,333,118,316,101,333,101,311,306,160,305,188,304,131,304,131,305,188,299,215,304,131,299,215,298,104,298,104,299,215,290,240,298,104,290,240,288,79,288,79,290,240,278,263,288,79,278,263,275,57,275,57,278,263,263,284,275,57,263,284,258,37,258,37,263,284,248,161,258,37,248,161,248,142,263,284,248,184,248,161,248,161,248,184,103,184,244,304,222,319,226,265,244,304,226,265,241,228,244,304,241,228,248,184,244,304,248,184,263,284,203,293,226,265,222,319,203,293,222,319,198,330,203,293,198,330,173,336,203,293,173,336,173,312,173,312,173,336,147,338,173,312,147,338,136,318,231,78,218,9,240,22,141,-6,131,15,109,-4,248,161,103,184,103,161,
+105,180,105,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,110,25,106,38,105,56,105,157,149,157,157,102,177,57,207,22,245,0,291,-6,337,1,376,24,405,60,425,108,431,166,425,222,406,269,377,306,338,330,291,338,245,331,207,310,178,276,158,232,149,180,16383,16383,377,169,376,134,373,103,367,76,359,53,347,35,337,26,327,19,315,15,303,12,291,11,279,12,268,15,257,19,247,25,237,33,224,52,214,75,208,102,204,132,203,166,204,194,207,222,211,247,219,269,228,286,239,299,251,308,263,315,276,318,290,320,302,319,313,316,324,311,334,305,343,296,356,279,366,257,372,231,376,201,377,169,309,0,309,9,290,12,277,16,270,25,267,39,267,276,268,294,271,307,278,315,290,319,309,321,309,331,180,331,136,329,98,321,69,306,49,282,42,246,47,216,60,193,81,176,108,164,141,157,49,35,41,26,31,19,22,14,12,11,2,9,2,0,83,0,198,155,216,155,216,56,215,37,211,24,203,16,189,12,169,9,169,0,16383,16383,216,174,186,174,156,177,131,186,113,200,101,219,97,244,99,261,103,276,111,288,121,298,133,305,143,308,153,310,164,311,177,312,190,312,200,311,207,309,212,304,215,296,216,286,223,33,218,29,210,25,206,24,201,23,196,25,192,28,189,35,187,44,186,56,186,152,185,168,184,181,181,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,
+50,25,42,16,149,0,149,0,42,16,29,12,149,0,29,12,9,9,149,331,9,331,29,319,149,331,29,319,42,315,149,331,42,315,50,307,149,331,50,307,53,294,149,331,53,294,118,315,149,331,118,315,130,319,149,331,130,319,149,321,158,232,149,180,149,157,149,157,149,180,105,180,149,157,105,180,105,157,106,38,105,56,54,274,106,38,54,274,54,61,54,274,105,56,105,274,54,274,105,274,106,294,54,274,106,294,110,307,54,274,110,307,118,315,54,274,118,315,53,294,149,0,149,9,130,12,149,0,130,12,118,17,149,0,118,17,53,39,149,0,53,39,50,25,54,61,53,39,118,17,54,61,118,17,110,25,54,61,110,25,106,38,263,315,291,338,251,308,251,308,291,338,245,331,251,308,245,331,239,299,239,299,245,331,228,286,219,269,228,286,245,331,219,269,245,331,207,310,208,102,207,22,214,75,214,75,207,22,245,0,214,75,245,0,224,52,224,52,245,0,237,33,247,25,237,33,245,0,247,25,245,0,291,-6,338,330,291,338,302,319,302,319,291,338,290,320,276,318,290,320,291,338,276,318,291,338,263,315,207,310,178,276,203,166,207,310,203,166,204,194,207,310,204,194,207,222,207,310,207,222,211,247,207,310,211,247,219,269,208,102,204,132,207,22,207,22,204,132,203,166,268,15,291,-6,279,12,279,12,291,-6,291,11,303,12,291,11,291,-6,303,12,291,-6,337,1,313,316,324,311,338,330,338,330,324,311,334,305,338,330,334,305,343,296,343,296,356,279,377,306,377,306,356,279,366,257,377,306,366,257,372,231,373,103,367,76,376,24,376,24,367,76,359,53,376,24,359,53,347,35,347,35,337,26,376,24,376,24,337,26,337,1,431,166,425,222,425,108,425,108,425,222,406,269,425,108,406,269,405,60,405,60,406,269,377,169,377,306,372,231,376,201,377,306,376,201,377,169,377,306,377,169,406,269,377,306,338,330,343,296,376,134,373,103,376,24,376,134,376,24,405,60,376,134,405,60,377,169,337,1,337,26,327,19,337,1,327,19,315,15,337,1,315,15,303,12,257,19,247,25,291,-6,257,19,291,-6,268,15,149,157,157,102,158,232,158,232,157,102,177,57,158,232,177,57,178,276,178,276,177,57,207,22,178,276,207,22,203,166,338,330,302,319,313,316,149,0,9,9,9,0,29,319,9,331,9,321,
+309,0,309,9,290,12,277,16,270,25,267,39,267,276,268,294,271,307,278,315,290,319,309,321,309,331,180,331,136,329,98,321,69,306,49,282,42,246,47,216,60,193,81,176,108,164,141,157,49,35,41,26,31,19,22,14,12,11,2,9,2,0,83,0,198,155,216,155,216,56,215,37,211,24,203,16,189,12,169,9,169,0,16383,16383,216,174,186,174,156,177,131,186,113,200,101,219,97,244,99,261,103,276,111,288,121,298,133,305,143,308,153,310,164,311,177,312,190,312,200,311,207,309,212,304,215,296,216,286,223,33,218,29,210,25,206,24,201,23,196,25,192,28,189,35,187,44,186,56,186,152,185,168,184,181,181,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,207,83,212,93,215,104,217,117,215,129,210,138,202,144,190,146,173,146,146,116,135,93,126,76,118,63,112,54,105,42,97,33,87,
+31,19,22,14,83,0,83,0,22,14,12,11,83,0,12,11,2,9,99,261,103,276,98,321,98,321,103,276,111,288,98,321,111,288,136,329,136,329,111,288,121,298,136,329,121,298,133,305,133,305,143,308,136,329,136,329,143,308,180,331,101,219,97,244,108,164,108,164,97,244,81,176,81,176,97,244,98,321,98,321,97,244,99,261,42,246,47,216,49,282,49,282,47,216,60,193,49,282,60,193,69,306,69,306,60,193,81,176,69,306,81,176,98,321,141,157,83,0,198,155,141,157,198,155,156,177,141,157,156,177,131,186,141,157,131,186,113,200,141,157,113,200,108,164,211,24,203,16,309,0,309,0,203,16,189,12,309,0,189,12,169,9,153,310,164,311,180,331,180,331,164,311,177,312,180,331,177,312,190,312,190,312,200,311,309,331,309,331,200,311,207,309,309,331,207,309,212,304,211,24,309,0,215,37,215,37,309,0,277,16,215,37,277,16,216,56,216,56,277,16,270,25,216,56,270,25,216,155,216,155,270,25,216,174,216,155,216,174,198,155,198,155,216,174,186,174,198,155,186,174,156,177,83,0,141,157,49,35,83,0,49,35,41,26,83,0,41,26,31,19,290,319,309,321,309,331,290,319,309,331,278,315,278,315,309,331,216,286,278,315,216,286,271,307,271,307,216,286,268,294,216,286,267,39,267,61,267,276,268,294,216,286,267,276,216,286,267,61,309,331,212,304,215,296,309,331,215,296,216,286,309,331,180,331,190,312,290,12,277,16,309,0,290,12,309,0,309,9,216,174,270,25,267,39,216,174,267,39,216,286,309,0,169,9,169,0,83,0,2,9,2,0,180,331,143,308,153,310,101,219,108,164,113,200,
+223,33,218,29,210,25,206,24,201,23,196,25,192,28,189,35,187,44,186,56,186,152,185,168,184,181,181,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,207,83,212,93,215,104,217,117,215,129,210,138,202,144,190,146,173,146,146,116,135,93,126,76,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,99,0,114,6,130,16,146,31,149,17,153,7,160,0,168,-3,178,-4,188,-3,197,-1,206,2,214,9,223,19,16383,16383,146,65,145,57,144,50,140,44,135,38,128,32,122,29,110,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,78,68,84,73,91,79,97,88,104,99,111,112,118,128,125,146,132,42,174,47,203,59,230,77,253,100,270,129,278,142,279,169,279,182,280,194,283,210,293,220,306,226,320,229,333,230,343,220,343,217,332,212,325,205,320,195,318,183,317,150,317,94,304,57,269,34,223,23,172,20,127,24,87,36,52,57,22,87,2,127,-4,164,1,195,17,219,43,234,76,239,116,233,154,218,186,195,210,166,225,131,230,111,228,92,223,74,213,57,196,43,173,16383,16383,194,102,192,70,184,44,172,25,155,13,135,9,125,10,115,13,106,18,98,25,91,34,81,51,74,70,69,91,66,113,65,137,67,164,75,186,87,202,102,212,122,216,134,215,144,211,153,206,161,199,169,191,178,177,185,161,190,142,193,122,194,102,153,118,169,121,183,128,194,137,202,151,205,168,201,188,191,204,174,215,149,222,118,225,12,225,12,218,26,216,35,214,40,209,42,200,43,187,43,39,42,25,40,16,35,11,26,8,12,7,12,0,149,0,161,2,171,4,181,8,190,12,200,19,208,28,214,39,218,51,
+37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,111,230,104,217,117,215,111,230,117,215,127,229,127,229,117,215,129,210,127,229,129,210,140,226,140,226,129,210,138,202,140,226,138,202,144,190,76,207,83,212,85,227,85,227,83,212,93,215,85,227,93,215,98,229,98,229,93,215,104,217,98,229,104,217,111,230,73,224,70,194,71,201,73,224,71,201,76,207,73,224,76,207,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,186,56,186,152,185,168,186,56,185,168,184,181,186,56,184,181,181,191,186,56,181,191,188,-3,192,28,197,-1,196,25,196,25,197,-1,201,23,206,24,201,23,206,2,206,24,206,2,214,9,189,35,187,44,188,-3,189,35,188,-3,197,-1,189,35,197,-1,192,28,178,-4,188,-3,181,191,178,-4,181,191,176,199,178,-4,176,199,170,208,178,-4,170,208,168,-3,162,215,152,222,153,7,162,215,153,7,160,0,162,215,160,0,168,-3,162,215,168,-3,170,208,152,222,140,226,144,190,152,222,144,190,146,173,152,222,146,173,146,132,152,222,146,132,146,31,152,222,146,31,149,17,152,222,149,17,153,7,146,146,146,132,146,173,218,29,214,27,214,9,218,29,214,9,223,19,218,29,223,19,223,33,210,25,206,24,214,9,210,25,214,9,214,27,201,23,197,-1,206,2,146,31,146,132,146,65,146,31,146,65,145,57,146,31,145,57,144,50,146,31,144,50,140,44,146,31,140,44,135,38,146,31,135,38,130,16,130,16,135,38,128,32,128,32,122,29,130,16,130,16,122,29,116,27,130,16,116,27,114,6,114,6,116,27,110,25,114,6,110,25,103,24,99,111,112,118,116,135,116,135,112,118,128,125,116,135,128,125,146,146,146,146,128,125,146,132,65,78,68,84,76,118,76,118,68,84,73,91,76,118,73,91,79,97,79,97,88,104,93,126,93,126,88,104,99,111,93,126,99,111,116,135,93,126,76,118,79,97,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,78,63,112,65,78,76,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,99,0,86,25,86,25,99,0,97,24,103,24,97,24,99,0,103,24,99,0,114,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,186,56,188,-3,187,44,29,167,29,183,28,175,
+42,174,47,203,59,230,77,253,100,270,129,278,142,279,169,279,182,280,194,283,210,293,220,306,226,320,229,333,230,343,220,343,217,332,212,325,205,320,195,318,183,317,150,317,94,304,57,269,34,223,23,172,20,127,24,87,36,52,57,22,87,2,127,-4,164,1,195,17,219,43,234,76,239,116,233,154,218,186,195,210,166,225,131,230,111,228,92,223,74,213,57,196,43,173,16383,16383,194,102,192,70,184,44,172,25,155,13,135,9,125,10,115,13,106,18,98,25,91,34,81,51,74,70,69,91,66,113,65,137,67,164,75,186,87,202,102,212,122,216,134,215,144,211,153,206,161,199,169,191,178,177,185,161,190,142,193,122,194,102,153,118,169,121,183,128,194,137,202,151,205,168,201,188,191,204,174,215,149,222,118,225,12,225,12,218,26,216,35,214,40,209,42,200,43,187,43,39,42,25,40,16,35,11,26,8,12,7,12,0,149,0,161,2,171,4,181,8,190,12,200,19,208,28,214,39,218,51,219,63,215,82,206,96,191,107,174,114,153,118,16383,16383,85,195,86,202,88,207,92,209,97,211,103,211,127,209,145,203,156,194,162,182,164,166,161,151,154,139,143,130,128,125,110,123,99,124,92,125,87,128,85,132,85,139,16383,16383,85,97,85,102,87,105,91,108,98,109,127,109,144,105,159,98,170,84,174,62,174,63,170,42,160,28,146,19,127,15,106,14,
+169,279,183,317,156,279,156,279,183,317,150,317,156,279,150,317,142,279,142,279,150,317,129,278,100,270,129,278,150,317,100,270,150,317,94,304,229,333,230,343,226,320,226,320,230,343,220,343,226,320,220,343,220,306,220,306,220,343,217,332,220,306,217,332,212,325,210,293,220,306,212,325,210,293,212,325,205,320,210,293,205,320,195,318,210,293,195,318,194,283,169,279,182,280,183,317,183,317,182,280,194,283,183,317,194,283,195,318,42,174,47,203,57,269,57,269,47,203,59,230,57,269,59,230,94,304,94,304,59,230,77,253,94,304,77,253,100,270,42,174,57,269,34,223,42,174,34,223,36,52,42,174,36,52,57,22,42,174,57,22,43,173,24,87,36,52,34,223,24,87,34,223,23,172,24,87,23,172,20,127,74,70,87,2,81,51,81,51,87,2,91,34,98,25,91,34,87,2,98,25,87,2,127,-4,65,137,57,196,66,113,66,113,57,196,57,22,66,113,57,22,69,91,69,91,57,22,87,2,69,91,87,2,74,70,131,230,122,216,134,215,131,230,134,215,166,225,166,225,134,215,144,211,166,225,144,211,153,206,75,186,87,202,92,223,92,223,87,202,102,212,92,223,102,212,111,228,111,228,102,212,122,216,111,228,122,216,131,230,74,213,57,196,67,164,74,213,67,164,75,186,74,213,75,186,92,223,67,164,57,196,65,137,192,70,184,44,195,17,195,17,184,44,172,25,195,17,172,25,164,1,164,1,172,25,155,13,164,1,155,13,135,9,135,9,125,10,127,-4,127,-4,125,10,115,13,127,-4,115,13,106,18,185,161,195,210,178,177,178,177,195,210,169,191,161,199,169,191,166,225,161,199,166,225,153,206,195,210,194,102,195,17,195,210,195,17,218,186,218,186,195,17,219,43,218,186,219,43,233,154,233,154,219,43,234,76,233,154,234,76,239,116,195,210,185,161,190,142,195,210,190,142,193,122,195,210,193,122,194,102,195,210,166,225,169,191,135,9,127,-4,164,1,192,70,195,17,194,102,98,25,127,-4,106,18,43,173,57,22,57,196,
+153,118,169,121,183,128,194,137,202,151,205,168,201,188,191,204,174,215,149,222,118,225,12,225,12,218,26,216,35,214,40,209,42,200,43,187,43,39,42,25,40,16,35,11,26,8,12,7,12,0,149,0,161,2,171,4,181,8,190,12,200,19,208,28,214,39,218,51,219,63,215,82,206,96,191,107,174,114,153,118,16383,16383,85,195,86,202,88,207,92,209,97,211,103,211,127,209,145,203,156,194,162,182,164,166,161,151,154,139,143,130,128,125,110,123,99,124,92,125,87,128,85,132,85,139,16383,16383,85,97,85,102,87,105,91,108,98,109,127,109,144,105,159,98,170,84,174,62,174,63,170,42,160,28,146,19,127,15,106,14,98,15,92,17,88,20,85,26,85,34,194,155,191,225,8,225,8,218,22,217,31,215,36,211,39,204,40,194,40,40,39,25,36,16,30,11,21,9,8,7,8,0,113,0,113,7,100,9,91,13,85,18,82,26,81,36,81,194,82,200,83,205,86,208,91,209,98,210,130,208,154,201,170,190,180,175,185,155,219,225,21,225,21,218,34,216,44,212,51,206,55,197,56,183,56,99,55,66,51,40,42,22,28,11,7,7,7,-68,16,-68,26,-37,37,-17,47,-5,58,0,172,0,182,-5,191,-17,200,-37,210,-68,219,-68,219,7,206,9,197,11,192,16,189,25,189,198,192,207,198,213,206,216,219,218,16383,16383,147,41,146,30,143,23,139,18,133,15,126,14,58,14,64,28,68,43,71,59,73,75,73,190,74,199,
+40,16,35,11,137,0,137,0,35,11,26,8,137,0,26,8,12,7,86,202,88,207,43,187,43,187,88,207,92,209,43,187,92,209,118,225,118,225,92,209,97,211,118,225,97,211,103,211,103,211,127,209,118,225,118,225,127,209,149,222,159,98,170,84,174,114,174,114,170,84,174,62,174,114,174,62,174,63,174,63,174,62,181,8,181,8,174,62,171,4,171,4,174,62,170,42,171,4,170,42,161,2,161,2,170,42,160,28,161,2,160,28,149,0,149,0,160,28,146,19,149,0,146,19,137,0,137,0,146,19,127,15,137,0,127,15,106,14,106,14,98,15,137,0,137,0,98,15,92,17,137,0,92,17,42,25,42,25,92,17,43,39,127,109,110,123,109,109,98,109,109,109,99,124,98,109,99,124,92,125,85,139,85,102,85,132,85,132,85,102,87,105,85,132,87,105,87,128,87,128,87,105,91,108,87,128,91,108,92,125,92,125,91,108,98,109,110,123,99,124,109,109,161,151,169,121,164,166,164,166,169,121,174,215,174,215,169,121,183,128,174,215,183,128,191,204,191,204,183,128,194,137,191,204,194,137,201,188,201,188,194,137,202,151,201,188,202,151,205,168,127,209,145,203,149,222,149,222,145,203,156,194,149,222,156,194,174,215,174,215,156,194,162,182,174,215,162,182,164,166,159,98,153,118,144,105,144,105,153,118,154,139,154,139,153,118,169,121,154,139,169,121,161,151,110,123,127,109,128,125,128,125,127,109,144,105,128,125,144,105,143,130,143,130,144,105,154,139,215,82,206,96,208,28,215,82,208,28,214,39,215,82,214,39,218,51,215,82,218,51,219,63,181,8,190,12,191,107,191,107,190,12,200,19,191,107,200,19,206,96,206,96,200,19,208,28,191,107,174,114,174,63,191,107,174,63,181,8,85,26,85,34,43,187,85,26,43,187,43,39,85,26,43,39,88,20,85,195,86,202,43,187,85,195,43,187,85,34,35,214,40,209,118,225,118,225,40,209,42,200,118,225,42,200,43,187,26,216,35,214,118,225,26,216,118,225,12,225,26,216,12,225,12,218,137,0,12,7,12,0,40,16,137,0,42,25,43,39,92,17,88,20,153,118,159,98,174,114,85,102,85,139,85,97,
+194,155,191,225,8,225,8,218,22,217,31,215,36,211,39,204,40,194,40,40,39,25,36,16,30,11,21,9,8,7,8,0,113,0,113,7,100,9,91,13,85,18,82,26,81,36,81,194,82,200,83,205,86,208,91,209,98,210,130,208,154,201,170,190,180,175,185,155,219,225,21,225,21,218,34,216,44,212,51,206,55,197,56,183,56,99,55,66,51,40,42,22,28,11,7,7,7,-68,16,-68,26,-37,37,-17,47,-5,58,0,172,0,182,-5,191,-17,200,-37,210,-68,219,-68,219,7,206,9,197,11,192,16,189,25,189,198,192,207,198,213,
+36,211,39,204,191,225,191,225,39,204,91,209,191,225,91,209,98,210,98,210,130,208,191,225,191,225,130,208,154,201,191,225,154,201,170,190,191,225,170,190,180,175,191,225,180,175,185,155,191,225,185,155,194,155,81,36,81,194,40,194,40,194,81,194,82,200,40,194,82,200,83,205,40,194,83,205,86,208,40,194,86,208,91,209,40,194,91,209,39,204,40,194,82,26,81,36,191,225,8,225,22,217,191,225,22,217,31,215,191,225,31,215,36,211,113,0,113,7,100,9,113,0,100,9,91,13,113,0,91,13,40,40,113,0,40,40,39,25,113,0,39,25,36,16,113,0,36,16,30,11,113,0,30,11,21,9,113,0,21,9,8,7,113,0,8,7,8,0,40,40,91,13,85,18,40,40,85,18,82,26,40,40,82,26,40,194,22,217,8,225,8,218,
+219,225,21,225,21,218,34,216,44,212,51,206,55,197,56,183,56,99,55,66,51,40,42,22,28,11,7,7,7,-68,16,-68,26,-37,37,-17,47,-5,58,0,172,0,182,-5,191,-17,200,-37,210,-68,219,-68,219,7,206,9,197,11,192,16,189,25,189,198,192,207,198,213,206,216,219,218,16383,16383,147,41,146,30,143,23,139,18,133,15,126,14,58,14,64,28,68,43,71,59,73,75,73,190,74,199,76,205,80,209,85,210,92,211,135,211,141,209,145,205,146,199,147,190,210,82,196,63,182,48,167,39,150,33,132,31,102,37,80,53,66,77,58,106,55,137,209,137,208,152,205,165,202,176,197,186,192,195,181,207,169,217,156,224,140,228,123,230,88,224,59,207,37,182,24,148,19,108,23,70,35,39,55,15,81,0,114,-4,142,-1,167,9,188,26,205,49,219,79,16383,16383,56,151,61,172,69,190,80,203,93,211,109,214,126,211,139,203,148,191,154,173,158,151,353,0,353,7,347,8,341,10,331,14,327,17,323,21,317,28,311,37,304,47,
+34,216,44,212,219,225,219,225,44,212,85,210,219,225,85,210,92,211,219,225,92,211,127,211,219,225,127,211,135,211,126,14,58,14,68,0,126,14,68,0,161,0,126,14,161,0,133,15,147,190,161,0,189,198,189,198,161,0,172,0,189,198,172,0,189,183,189,183,172,0,182,-5,189,183,182,-5,189,41,189,41,182,-5,191,-17,189,41,191,-17,189,25,161,0,147,190,147,41,161,0,147,41,146,30,161,0,146,30,143,23,161,0,143,23,139,18,161,0,139,18,133,15,219,225,135,211,141,209,219,225,141,209,145,205,219,225,145,205,146,199,219,225,146,199,147,190,219,225,147,190,198,213,219,225,198,213,206,216,219,225,206,216,219,218,192,207,198,213,147,190,192,207,147,190,189,198,73,190,74,199,58,14,73,190,58,14,64,28,73,190,64,28,68,43,73,190,68,43,71,59,73,190,71,59,73,75,73,190,73,75,73,89,58,0,68,0,58,14,58,0,58,14,56,183,58,0,56,183,56,99,58,0,56,99,55,66,58,0,55,66,51,40,58,0,51,40,47,-5,58,14,74,199,56,183,56,183,74,199,76,205,56,183,76,205,55,197,55,197,76,205,80,209,55,197,80,209,51,206,51,206,80,209,85,210,51,206,85,210,44,212,21,225,21,218,34,216,21,225,34,216,219,225,219,-68,219,7,210,-68,210,-68,219,7,206,9,210,-68,206,9,200,-37,200,-37,206,9,197,11,200,-37,197,11,192,16,192,16,189,25,191,-17,192,16,191,-17,200,-37,16,-68,26,-37,28,11,28,11,26,-37,37,-17,28,11,37,-17,42,22,42,22,37,-17,47,-5,42,22,47,-5,51,40,7,7,7,-68,16,-68,7,7,16,-68,28,11,
+210,82,196,63,182,48,167,39,150,33,132,31,102,37,80,53,66,77,58,106,55,137,209,137,208,152,205,165,202,176,197,186,192,195,181,207,169,217,156,224,140,228,123,230,88,224,59,207,37,182,24,148,19,108,23,70,35,39,55,15,81,0,114,-4,142,-1,167,9,188,26,205,49,219,79,16383,16383,56,151,61,172,69,190,80,203,93,211,109,214,126,211,139,203,148,191,154,173,158,151,353,0,353,7,347,8,341,10,331,14,327,17,323,21,317,28,311,37,304,47,298,58,286,79,275,94,264,105,253,113,240,120,240,121,258,137,269,156,278,172,286,185,297,190,301,189,306,187,318,183,324,182,332,183,338,186,343,191,346,197,347,204,346,211,342,218,336,223,327,227,316,228,306,227,297,224,289,218,282,211,275,201,267,187,259,171,251,156,242,143,233,135,228,132,222,130,215,128,
+80,53,66,77,81,0,81,0,66,77,58,106,81,0,58,106,55,15,55,15,58,106,55,137,56,151,55,137,209,137,56,151,209,137,158,151,158,151,209,137,169,217,140,228,123,230,126,211,126,211,123,230,109,214,93,211,109,214,123,230,93,211,123,230,88,224,156,224,140,228,148,191,156,224,148,191,154,173,156,224,154,173,158,151,156,224,158,151,169,217,140,228,126,211,139,203,140,228,139,203,148,191,56,151,61,172,59,207,59,207,61,172,69,190,59,207,69,190,88,224,88,224,69,190,80,203,88,224,80,203,93,211,37,182,24,148,35,39,37,182,35,39,55,15,37,182,55,15,55,137,37,182,55,137,56,151,37,182,56,151,59,207,24,148,19,108,23,70,24,148,23,70,35,39,81,0,114,-4,102,37,102,37,114,-4,132,31,150,33,132,31,142,-1,150,33,142,-1,167,9,209,137,208,152,205,165,209,137,205,165,202,176,209,137,202,176,197,186,209,137,197,186,192,195,209,137,192,195,181,207,209,137,181,207,169,217,219,79,210,82,205,49,205,49,210,82,196,63,205,49,196,63,188,26,188,26,196,63,182,48,188,26,182,48,167,9,167,9,182,48,167,39,167,9,167,39,150,33,132,31,114,-4,142,-1,80,53,81,0,102,37,
+353,0,353,7,347,8,341,10,331,14,327,17,323,21,317,28,311,37,304,47,298,58,286,79,275,94,264,105,253,113,240,120,240,121,258,137,269,156,278,172,286,185,297,190,301,189,306,187,318,183,324,182,332,183,338,186,343,191,346,197,347,204,346,211,342,218,336,223,327,227,316,228,306,227,297,224,289,218,282,211,275,201,267,187,259,171,251,156,242,143,233,135,228,132,222,130,215,128,208,127,200,127,200,190,201,199,204,207,210,212,219,216,232,218,232,225,128,225,128,218,140,216,149,214,154,209,158,201,158,127,151,127,144,128,138,129,132,132,127,135,117,145,108,157,101,170,88,196,82,207,75,216,67,223,56,227,44,228,34,227,26,224,20,219,15,212,14,204,15,197,18,191,23,186,29,183,36,182,43,183,50,185,60,189,65,190,74,185,80,172,87,155,100,137,121,121,121,120,107,114,95,107,85,95,74,79,62,57,63,57,56,46,50,36,44,28,38,21,33,17,29,14,25,12,19,10,14,8,7,7,7,0,73,0,124,83,133,96,139,104,145,109,151,112,158,113,158,25,155,18,151,13,145,10,137,8,126,7,126,0,234,0,234,7,214,9,207,12,203,17,201,24,200,33,200,113,209,111,216,108,222,104,228,95,237,82,287,0,114,121,130,126,146,134,158,146,167,160,170,177,168,188,164,198,158,207,149,215,139,221,121,227,111,229,99,230,80,230,75,229,69,228,64,226,57,224,49,222,46,220,42,219,35,219,29,223,27,226,26,230,20,230,16,150,25,150,30,172,38,190,50,204,65,213,85,216,98,214,110,209,119,200,125,188,127,172,126,163,123,155,118,147,112,140,104,135,97,132,89,129,81,128,72,127,60,127,60,113,86,111,106,106,120,96,129,82,132,62,130,47,124,34,114,23,99,15,79,13,65,14,52,18,40,24,28,33,14,46,7,39,19,23,32,11,46,2,64,-2,85,-4,113,-2,125,1,137,5,147,12,157,20,166,29,173,40,177,52,179,65,175,84,165,99,151,110,133,117,114,121,251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,84,60,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,178,165,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,229,12,224,17,221,26,220,40,220,183,221,198,223,207,229,213,238,216,251,218,201,319,199,330,195,340,
+25,12,19,10,73,0,73,0,19,10,14,8,73,0,14,8,7,7,50,36,44,28,73,0,73,0,44,28,38,21,73,0,38,21,33,17,33,17,29,14,73,0,73,0,29,14,25,12,95,107,85,95,124,83,124,83,85,95,74,79,124,83,74,79,73,0,73,0,74,79,62,57,73,0,62,57,56,46,56,46,62,57,63,57,67,223,65,190,74,185,67,223,74,185,75,216,75,216,74,185,80,172,75,216,80,172,82,207,82,207,80,172,87,155,82,207,87,155,88,196,88,196,87,155,100,137,88,196,100,137,94,184,94,184,100,137,101,170,50,185,55,187,56,227,56,227,55,187,60,189,56,227,60,189,67,223,67,223,60,189,65,190,44,228,34,227,36,182,44,228,36,182,43,183,44,228,43,183,50,185,44,228,50,185,56,227,14,204,15,197,15,212,15,212,15,197,18,191,15,212,18,191,20,219,20,219,18,191,23,186,20,219,23,186,26,224,26,224,23,186,29,183,26,224,29,183,34,227,34,227,29,183,36,182,127,135,121,121,124,83,127,135,124,83,133,96,127,135,117,145,121,121,121,121,117,145,108,157,121,121,108,157,101,170,121,121,101,170,100,137,155,18,151,13,234,0,234,0,151,13,145,10,234,0,145,10,137,8,137,8,126,7,234,0,234,0,126,7,126,0,234,0,234,7,224,8,234,0,224,8,214,9,234,0,214,9,207,12,234,0,207,12,158,33,234,0,158,33,158,25,234,0,158,25,155,18,201,24,200,33,158,113,201,24,158,113,203,17,203,17,158,113,158,33,158,113,200,33,200,127,158,113,200,127,200,190,158,113,200,190,201,199,158,113,201,199,204,207,158,113,204,207,158,189,158,113,158,189,158,127,215,128,208,127,209,111,209,111,208,127,200,127,232,225,128,225,140,216,232,225,140,216,149,214,232,225,149,214,154,209,232,225,154,209,158,201,232,225,158,201,158,189,232,225,158,189,210,212,232,225,210,212,219,216,232,225,219,216,232,218,264,105,253,113,287,0,287,0,253,113,240,120,287,0,240,120,237,82,237,82,240,120,240,121,237,82,240,121,233,135,237,82,233,135,228,95,228,95,233,135,228,132,228,95,228,132,222,104,222,104,228,132,222,130,222,104,222,130,216,108,216,108,222,130,215,128,216,108,215,128,209,111,317,28,311,37,287,0,287,0,311,37,304,47,287,0,304,47,298,58,297,224,297,190,301,189,297,224,301,189,306,227,306,227,301,189,306,187,306,227,306,187,316,228,316,228,306,187,312,185,316,228,312,185,318,183,297,190,289,218,286,185,286,185,289,218,282,211,286,185,282,211,278,172,278,172,282,211,275,201,278,172,275,201,269,156,269,156,275,201,267,187,269,156,267,187,259,171,258,137,269,156,259,171,258,137,259,171,251,156,258,137,251,156,242,143,258,137,242,143,240,121,242,143,233,135,240,121,318,183,324,182,327,227,327,227,324,182,332,183,327,227,332,183,336,223,336,223,332,183,338,186,336,223,338,186,342,218,342,218,338,186,343,191,342,218,343,191,346,211,346,211,343,191,346,197,346,211,346,197,347,204,317,28,287,0,323,21,323,21,287,0,327,17,331,14,327,17,287,0,331,14,287,0,353,0,353,0,353,7,347,8,353,0,347,8,341,10,353,0,341,10,336,12,353,0,336,12,331,14,287,0,298,58,286,79,287,0,286,79,275,94,287,0,275,94,264,105,145,109,151,112,151,127,151,127,151,112,158,113,151,127,158,113,158,127,132,132,127,135,133,96,132,132,133,96,138,129,138,129,133,96,139,104,138,129,139,104,144,128,144,128,139,104,145,109,144,128,145,109,151,127,124,83,121,121,121,120,124,83,121,120,107,114,124,83,107,114,95,107,73,0,7,7,7,0,50,36,73,0,56,46,316,228,318,183,327,227,297,190,297,224,289,218,200,127,200,113,209,111,140,216,128,225,128,218,210,212,158,189,204,207,158,33,207,12,203,17,
+114,121,130,126,146,134,158,146,167,160,170,177,168,188,164,198,158,207,149,215,139,221,121,227,111,229,99,230,80,230,75,229,69,228,64,226,57,224,49,222,46,220,42,219,35,219,29,223,27,226,26,230,20,230,16,150,25,150,30,172,38,190,50,204,65,213,85,216,98,214,110,209,119,200,125,188,127,172,126,163,123,155,118,147,112,140,104,135,97,132,89,129,81,128,72,127,60,127,60,113,86,111,106,106,120,96,129,82,132,62,130,47,124,34,114,23,99,15,79,13,65,14,52,18,40,24,28,33,14,46,7,39,19,23,32,11,46,2,64,-2,85,-4,113,-2,125,1,137,5,147,12,157,20,166,29,173,40,177,52,179,65,175,84,165,99,151,110,133,117,114,121,251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,84,60,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,178,165,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,229,12,224,17,221,26,220,40,220,183,221,198,223,207,229,213,238,216,251,218,201,319,199,330,195,340,188,347,180,351,171,352,167,352,161,348,159,344,158,339,160,332,166,329,172,327,178,324,180,319,179,313,174,307,166,303,152,300,133,299,115,300,102,303,93,307,88,313,87,319,89,324,95,327,101,329,107,332,
+26,230,20,230,25,150,26,230,25,150,30,172,26,230,30,172,27,226,49,222,46,220,50,204,50,204,46,220,42,219,50,204,42,219,39,219,39,219,35,219,38,190,38,190,35,219,32,221,38,190,32,221,30,172,30,172,32,221,29,223,30,172,29,223,27,226,64,-2,85,-4,65,14,65,14,85,-4,79,13,99,15,79,13,85,-4,99,15,85,-4,99,-3,85,216,80,230,75,229,85,216,75,229,69,228,85,216,69,228,65,213,85,216,86,230,80,230,65,213,69,228,64,226,65,213,64,226,57,224,65,213,57,224,53,223,65,213,53,223,50,204,39,219,38,190,50,204,81,128,86,111,89,129,89,129,86,111,106,106,89,129,106,106,97,132,97,132,106,106,104,135,112,140,104,135,106,106,112,140,106,106,114,121,114,121,106,106,120,96,114,121,120,96,133,117,133,117,120,96,129,82,133,117,129,82,132,62,86,230,98,214,99,230,99,230,98,214,110,209,99,230,110,209,111,229,111,229,110,209,119,200,111,229,119,200,121,227,121,227,119,200,125,188,121,227,125,188,130,224,130,224,125,188,127,172,130,126,127,172,126,163,126,163,123,155,130,126,130,126,123,155,118,147,130,126,118,147,114,121,114,121,118,147,112,140,170,177,168,188,167,160,167,160,168,188,164,198,167,160,164,198,158,146,158,146,164,198,158,207,158,146,158,207,149,215,146,134,158,146,149,215,146,134,149,215,139,221,146,134,139,221,130,224,146,134,130,224,130,126,85,216,98,214,86,230,133,117,132,62,137,5,133,117,137,5,151,110,151,110,137,5,147,12,151,110,147,12,157,20,175,84,165,99,166,29,175,84,166,29,173,40,175,84,173,40,177,52,175,84,177,52,179,65,165,99,151,110,157,20,165,99,157,20,166,29,130,47,124,34,125,1,130,47,125,1,137,5,130,47,137,5,132,62,114,23,99,15,99,-3,114,23,99,-3,113,-2,114,23,113,-2,125,1,114,23,125,1,124,34,72,127,60,127,86,111,72,127,86,111,81,128,14,46,19,23,28,33,28,33,19,23,32,11,28,33,32,11,40,24,40,24,32,11,46,2,40,24,46,2,52,18,52,18,46,2,64,-2,52,18,64,-2,65,14,19,23,14,46,7,39,86,111,60,127,60,113,130,224,127,172,130,126,49,222,50,204,53,223,25,150,20,230,16,150,
+251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,84,60,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,178,165,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,229,12,224,17,221,26,220,40,220,183,221,198,223,207,229,213,238,216,251,218,201,319,199,330,195,340,188,347,180,351,171,352,167,352,161,348,159,344,158,339,160,332,166,329,172,327,178,324,180,319,179,313,174,307,166,303,152,300,133,299,115,300,102,303,93,307,88,313,87,319,89,324,95,327,101,329,107,332,109,339,108,344,107,348,101,352,97,352,88,351,80,347,73,340,68,330,66,319,70,302,82,289,98,280,116,275,133,273,151,275,169,280,185,289,196,302,201,319,16383,16383,251,225,147,225,147,218,160,216,169,213,174,207,
+39,16,33,11,116,0,116,0,33,11,25,9,116,0,25,9,12,7,178,189,84,60,84,36,84,36,84,189,42,183,42,183,84,189,85,199,42,183,85,199,88,207,116,225,12,225,25,216,116,225,25,216,33,212,116,225,33,212,39,206,116,225,39,206,42,197,116,225,42,197,93,212,116,225,93,212,102,216,116,225,102,216,116,218,42,183,88,207,93,212,42,183,93,212,42,197,174,18,169,12,251,0,251,0,169,12,160,9,251,0,160,9,147,7,169,213,174,207,251,225,251,225,174,207,177,200,251,225,177,200,178,189,178,189,178,165,221,26,221,26,178,165,178,37,221,26,178,37,224,17,224,17,178,37,229,12,238,216,251,218,251,225,238,216,251,225,229,213,229,213,251,225,178,189,229,213,178,189,223,207,223,207,178,189,221,198,220,40,220,183,178,189,220,40,178,189,221,26,160,216,169,213,251,225,160,216,251,225,147,225,160,216,147,225,147,218,251,0,251,7,238,9,251,0,238,9,229,12,251,0,229,12,178,37,251,0,178,37,177,26,251,0,177,26,174,18,116,0,116,7,102,9,116,0,102,9,93,13,116,0,93,13,42,40,116,0,42,40,42,25,116,0,42,25,39,16,85,26,84,36,42,183,85,26,42,183,42,40,85,26,42,40,88,18,116,0,12,7,12,0,42,40,93,13,88,18,251,0,147,7,147,0,221,198,178,189,220,183,178,189,84,36,178,165,25,216,12,225,12,218,
+201,319,199,330,195,340,188,347,180,351,171,352,167,352,161,348,159,344,158,339,160,332,166,329,172,327,178,324,180,319,179,313,174,307,166,303,152,300,133,299,115,300,102,303,93,307,88,313,87,319,89,324,95,327,101,329,107,332,109,339,108,344,107,348,101,352,97,352,88,351,80,347,73,340,68,330,66,319,70,302,82,289,98,280,116,275,133,273,151,275,169,280,185,289,196,302,201,319,16383,16383,251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,84,60,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,178,165,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,229,12,224,17,221,26,220,40,220,183,221,198,223,207,229,213,238,216,251,218,248,0,248,7,241,8,235,10,225,14,221,17,217,21,211,28,205,37,198,47,192,58,180,79,168,94,156,105,144,113,131,120,131,121,148,137,160,156,168,172,176,185,188,190,192,189,202,185,208,183,214,182,222,183,228,186,233,191,237,197,238,204,236,211,233,218,226,223,218,227,207,228,196,227,185,223,176,216,168,207,161,196,140,154,132,143,124,135,118,132,112,130,105,128,98,127,91,127,91,190,92,199,95,207,100,212,109,216,122,218,122,225,18,225,18,218,31,216,39,214,45,209,48,201,49,189,49,25,46,18,42,13,36,10,26,8,12,7,12,0,128,0,128,7,117,8,107,9,99,12,94,17,92,24,91,33,91,113,99,111,106,108,112,103,118,95,127,82,181,0,238,225,45,225,45,218,57,216,66,212,71,206,74,197,75,183,75,99,74,77,73,53,69,33,62,18,50,12,46,15,42,22,38,30,32,36,23,39,18,38,13,36,
+102,303,93,307,98,280,98,280,93,307,88,313,98,280,88,313,82,289,82,289,88,313,87,319,88,351,87,319,89,324,88,351,89,324,97,352,97,352,89,324,95,327,97,352,95,327,101,329,101,352,101,329,104,350,104,350,101,329,107,332,104,350,107,332,107,348,107,348,107,332,109,339,107,348,109,339,108,344,82,289,87,319,88,351,82,289,88,351,80,347,82,289,80,347,73,340,82,289,73,340,70,302,68,330,66,319,70,302,68,330,70,302,73,340,102,303,116,275,115,300,115,300,116,275,133,299,152,300,133,299,133,273,152,300,133,273,151,275,196,302,201,319,199,330,196,302,199,330,195,340,196,302,195,340,188,347,196,302,188,347,185,289,185,289,188,347,180,319,185,289,180,319,179,313,185,289,179,313,174,307,185,289,174,307,169,280,180,351,171,352,172,327,180,351,172,327,178,324,180,351,178,324,180,319,180,351,180,319,188,347,167,352,164,350,166,329,167,352,166,329,172,327,167,352,172,327,171,352,161,348,159,344,160,332,161,348,160,332,166,329,161,348,166,329,164,350,169,280,174,307,166,303,169,280,166,303,152,300,169,280,152,300,151,275,133,299,116,275,133,273,39,16,33,11,116,0,116,0,33,11,25,9,116,0,25,9,12,7,178,189,84,60,84,36,84,36,84,189,42,183,42,183,84,189,85,199,42,183,85,199,88,207,116,225,12,225,25,216,116,225,25,216,33,212,116,225,33,212,39,206,116,225,39,206,42,197,116,225,42,197,93,212,116,225,93,212,102,216,116,225,102,216,116,218,42,183,88,207,93,212,42,183,93,212,42,197,174,18,169,12,251,0,251,0,169,12,160,9,251,0,160,9,147,7,169,213,174,207,251,225,251,225,174,207,177,200,251,225,177,200,178,189,178,189,178,165,221,26,221,26,178,165,178,37,221,26,178,37,224,17,224,17,178,37,229,12,238,216,251,218,251,225,238,216,251,225,229,213,229,213,251,225,178,189,229,213,178,189,223,207,223,207,178,189,221,198,220,40,220,183,178,189,220,40,178,189,221,26,160,216,169,213,251,225,160,216,251,225,147,225,160,216,147,225,147,218,251,0,251,7,238,9,251,0,238,9,229,12,251,0,229,12,178,37,251,0,178,37,177,26,251,0,177,26,174,18,116,0,116,7,102,9,116,0,102,9,93,13,116,0,93,13,42,40,116,0,42,40,42,25,116,0,42,25,39,16,85,26,84,36,42,183,85,26,42,183,42,40,85,26,42,40,88,18,116,0,12,7,12,0,42,40,93,13,88,18,251,0,147,7,147,0,221,198,178,189,220,183,178,189,84,36,178,165,25,216,12,225,12,218,160,332,159,344,158,339,102,303,98,280,116,275,97,352,101,329,101,352,
+248,0,248,7,241,8,235,10,225,14,221,17,217,21,211,28,205,37,198,47,192,58,180,79,168,94,156,105,144,113,131,120,131,121,148,137,160,156,168,172,176,185,188,190,192,189,202,185,208,183,214,182,222,183,228,186,233,191,237,197,238,204,236,211,233,218,226,223,218,227,207,228,196,227,185,223,176,216,168,207,161,196,140,154,132,143,124,135,118,132,112,130,105,128,98,127,91,127,91,190,92,199,95,207,100,212,109,216,122,218,122,225,18,225,18,218,31,216,39,214,45,209,48,201,49,189,49,25,46,18,42,13,36,10,26,8,12,7,12,0,128,0,128,7,117,8,107,9,99,12,94,17,92,24,91,33,91,113,99,111,106,108,112,103,118,95,127,82,181,0,238,225,45,225,45,218,57,216,66,212,71,206,74,197,75,183,75,99,74,77,73,53,69,33,62,18,50,12,46,15,42,22,38,30,32,36,23,39,18,38,13,36,8,33,5,27,4,20,6,10,10,3,18,-1,28,-3,39,-4,64,2,79,18,88,41,91,66,92,89,92,198,94,204,98,208,103,210,110,211,154,211,159,209,163,205,165,199,165,37,164,26,161,18,156,12,147,9,134,7,134,0,238,0,238,7,225,9,216,12,211,17,208,26,207,40,207,183,208,198,211,207,216,213,225,216,238,218,297,225,229,225,157,62,79,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,92,0,92,7,78,9,69,12,63,18,60,26,
+46,18,42,13,128,0,128,0,42,13,36,10,128,0,36,10,26,8,26,8,12,7,128,0,128,0,12,7,12,0,128,0,128,7,117,8,128,0,117,8,107,9,128,0,107,9,99,12,128,0,99,12,49,33,128,0,49,33,49,25,128,0,49,25,46,18,91,33,91,127,49,189,91,33,49,189,92,24,49,33,99,12,94,17,49,33,94,17,92,24,49,33,92,24,49,189,91,113,99,111,91,127,91,127,91,190,49,189,49,189,91,190,92,199,49,189,92,199,95,207,122,225,18,225,31,216,122,225,31,216,39,214,122,225,39,214,45,209,122,225,45,209,48,201,122,225,48,201,49,189,122,225,49,189,100,212,122,225,100,212,109,216,122,225,109,216,122,218,106,108,112,103,112,130,112,130,112,103,118,95,112,130,118,95,118,132,118,132,118,95,124,135,132,143,124,135,127,82,105,128,98,127,99,111,105,128,99,111,106,108,105,128,106,108,112,130,127,82,124,135,118,95,202,185,207,228,197,187,197,187,207,228,196,227,197,187,196,227,192,189,192,189,196,227,188,190,176,185,188,190,185,223,176,185,185,223,176,216,147,168,148,137,154,182,154,182,148,137,160,156,154,182,160,156,161,196,161,196,160,156,168,172,161,196,168,172,168,207,168,207,168,172,176,185,168,207,176,185,176,216,156,105,144,113,181,0,181,0,144,113,131,120,181,0,131,120,127,82,127,82,131,120,131,121,127,82,131,121,132,143,132,143,131,121,148,137,132,143,148,137,140,154,140,154,148,137,147,168,208,183,214,182,218,227,218,227,214,182,222,183,218,227,222,183,226,223,226,223,222,183,228,186,226,223,228,186,233,218,233,218,228,186,233,191,233,218,233,191,236,211,236,211,233,191,237,197,236,211,237,197,238,204,207,228,202,185,208,183,207,228,208,183,218,227,196,227,185,223,188,190,211,28,181,0,217,21,217,21,181,0,221,17,225,14,221,17,181,0,225,14,181,0,248,0,248,0,248,7,241,8,248,0,241,8,235,10,248,0,235,10,230,12,248,0,230,12,225,14,181,0,211,28,205,37,181,0,205,37,198,47,181,0,198,47,192,58,181,0,192,58,180,79,181,0,180,79,168,94,181,0,168,94,156,105,91,127,99,111,98,127,31,216,18,225,18,218,100,212,49,189,95,207,
+238,225,45,225,45,218,57,216,66,212,71,206,74,197,75,183,75,99,74,77,73,53,69,33,62,18,50,12,46,15,42,22,38,30,32,36,23,39,18,38,13,36,8,33,5,27,4,20,6,10,10,3,18,-1,28,-3,39,-4,64,2,79,18,88,41,91,66,92,89,92,198,94,204,98,208,103,210,110,211,154,211,159,209,163,205,165,199,165,37,164,26,161,18,156,12,147,9,134,7,134,0,238,0,238,7,225,9,216,12,211,17,208,26,207,40,207,183,208,198,211,207,216,213,225,216,238,218,297,225,229,225,157,62,79,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,92,0,92,7,78,9,69,12,63,18,60,26,59,36,59,172,60,172,143,0,147,0,224,174,224,37,223,26,220,18,214,12,204,9,190,7,190,0,296,0,296,7,284,9,275,12,270,17,267,26,266,40,266,183,267,198,270,207,275,213,284,216,297,218,251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,178,124,84,124,84,189,85,199,88,207,93,212,102,216,
+74,77,73,53,79,18,79,18,73,53,69,33,79,18,69,33,64,2,64,2,69,33,62,18,64,2,62,18,50,12,50,12,46,15,64,2,64,2,46,15,39,-4,57,216,66,212,238,225,238,225,66,212,103,210,238,225,103,210,110,211,238,225,110,211,145,211,238,225,145,211,154,211,161,18,156,12,238,0,238,0,156,12,147,9,238,0,147,9,134,7,238,225,154,211,159,209,238,225,159,209,163,205,238,225,163,205,165,199,238,225,165,199,165,190,238,225,165,190,216,213,238,225,216,213,225,216,238,225,225,216,238,218,207,40,207,183,165,190,165,190,207,183,208,198,165,190,208,198,211,207,216,12,211,17,165,37,165,37,211,17,208,26,165,37,208,26,165,190,92,189,92,198,75,183,92,189,75,183,79,18,92,189,79,18,88,41,92,189,88,41,91,66,92,189,91,66,92,89,75,183,92,198,94,204,75,183,94,204,98,208,75,183,98,208,74,197,71,206,74,197,98,208,71,206,98,208,103,210,71,206,103,210,66,212,45,225,45,218,57,216,45,225,57,216,238,225,238,0,238,7,225,9,238,0,225,9,216,12,238,0,216,12,165,37,238,0,165,37,164,26,238,0,164,26,161,18,75,99,74,77,79,18,75,99,79,18,75,183,39,-4,46,15,42,22,39,-4,42,22,38,30,39,-4,38,30,32,36,39,-4,32,36,28,-3,32,36,23,39,28,-3,28,-3,23,39,18,38,28,-3,18,38,18,-1,18,-1,18,38,13,36,18,-1,13,36,10,3,10,3,13,36,8,33,10,3,8,33,6,10,6,10,8,33,5,27,6,10,5,27,4,20,238,0,134,7,134,0,165,190,208,26,207,40,216,213,165,190,211,207,
+297,225,229,225,157,62,79,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,92,0,92,7,78,9,69,12,63,18,60,26,59,36,59,172,60,172,143,0,147,0,224,174,224,37,223,26,220,18,214,12,204,9,190,7,190,0,296,0,296,7,284,9,275,12,270,17,267,26,266,40,266,183,267,198,270,207,275,213,284,216,297,218,251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,178,124,84,124,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,108,178,108,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,
+39,16,33,11,92,0,92,0,33,11,25,9,92,0,25,9,12,7,220,18,214,12,296,0,296,0,214,12,204,9,296,0,204,9,190,7,229,225,157,62,224,174,229,225,224,174,267,26,229,225,267,26,266,40,229,225,266,40,266,183,229,225,266,183,267,198,229,225,267,198,270,207,229,225,270,207,275,213,229,225,275,213,297,225,59,172,60,172,79,225,79,225,60,172,143,0,79,225,143,0,157,62,157,62,143,0,147,0,157,62,147,0,224,174,92,7,78,9,92,0,92,0,78,9,69,12,92,0,69,12,42,25,42,25,69,12,63,18,42,25,63,18,42,40,42,40,63,18,60,26,42,40,60,26,42,183,42,183,60,26,59,36,42,183,59,36,59,172,79,225,12,225,25,216,79,225,25,216,33,212,79,225,33,212,39,206,79,225,39,206,42,197,79,225,42,197,42,183,79,225,42,183,59,172,284,216,297,218,297,225,284,216,297,225,275,213,296,0,296,7,284,9,296,0,284,9,275,12,296,0,275,12,224,37,296,0,224,37,223,26,296,0,223,26,220,18,224,37,275,12,270,17,224,37,270,17,267,26,224,37,267,26,224,174,92,0,12,7,12,0,39,16,92,0,42,25,296,0,190,7,190,0,25,216,12,225,12,218,
+251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,178,124,84,124,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,108,178,108,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,229,12,224,17,221,26,220,40,220,183,221,198,223,207,229,213,238,216,251,218,238,116,232,154,217,186,194,210,165,225,130,230,92,225,61,209,38,185,23,153,17,114,23,75,38,42,61,17,91,1,126,-4,163,1,194,17,218,43,233,76,238,116,16383,16383,193,102,190,70,183,44,171,25,154,13,134,9,123,10,114,13,104,18,96,25,89,34,79,51,72,70,66,91,63,113,63,137,65,164,73,186,85,202,101,212,121,216,132,215,143,211,152,206,161,199,168,191,177,177,184,161,189,142,192,122,193,102,251,225,12,225,12,218,25,217,33,214,
+39,16,33,11,116,0,116,0,33,11,25,9,116,0,25,9,12,7,116,225,12,225,25,216,116,225,25,216,33,212,116,225,33,212,39,206,116,225,39,206,42,197,116,225,42,197,93,212,116,225,93,212,102,216,116,225,102,216,116,218,42,183,85,26,84,36,84,124,84,108,178,108,84,124,178,108,178,124,178,124,178,108,224,17,178,124,224,17,221,26,42,183,84,36,84,189,42,183,84,189,85,199,42,183,85,199,88,207,42,183,88,207,93,212,42,183,93,212,42,197,174,18,169,12,251,0,251,0,169,12,160,9,251,0,160,9,147,7,251,225,147,225,160,216,251,225,160,216,169,213,251,225,169,213,174,207,251,225,174,207,177,200,251,225,177,200,178,189,251,225,178,189,229,213,251,225,229,213,238,216,251,225,238,216,251,218,220,40,220,183,178,189,178,189,220,183,221,198,178,189,221,198,223,207,178,189,221,26,220,40,251,0,251,7,238,9,251,0,238,9,229,12,251,0,229,12,178,37,251,0,178,37,177,26,251,0,177,26,174,18,178,37,229,12,224,17,178,37,224,17,178,108,116,0,116,7,102,9,116,0,102,9,93,13,116,0,93,13,42,40,116,0,42,40,42,25,116,0,42,25,39,16,42,40,93,13,88,18,42,40,88,18,85,26,42,40,85,26,42,183,116,0,12,7,12,0,251,0,147,7,147,0,178,124,221,26,178,189,160,216,147,225,147,218,229,213,178,189,223,207,25,216,12,225,12,218,
+238,116,232,154,217,186,194,210,165,225,130,230,92,225,61,209,38,185,23,153,17,114,23,75,38,42,61,17,91,1,126,-4,163,1,194,17,218,43,233,76,238,116,16383,16383,193,102,190,70,183,44,171,25,154,13,134,9,123,10,114,13,104,18,96,25,89,34,79,51,72,70,66,91,63,113,63,137,65,164,73,186,85,202,101,212,121,216,132,215,143,211,152,206,161,199,168,191,177,177,184,161,189,142,192,122,193,102,251,225,12,225,12,218,25,217,33,214,39,209,42,200,42,26,39,17,33,12,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,186,85,196,88,203,92,208,98,210,105,211,156,211,163,210,169,208,174,203,177,196,178,186,178,37,177,26,175,18,170,12,161,9,148,7,148,0,251,0,251,7,238,9,229,11,224,16,221,24,220,37,220,184,221,199,224,209,230,214,238,217,251,218,76,229,
+66,91,61,17,72,70,72,70,61,17,91,1,72,70,91,1,79,51,79,51,91,1,89,34,96,25,89,34,91,1,96,25,91,1,126,-4,165,225,130,230,132,215,132,215,130,230,121,216,101,212,121,216,130,230,101,212,130,230,92,225,190,70,183,44,194,17,194,17,183,44,171,25,194,17,171,25,163,1,163,1,171,25,154,13,163,1,154,13,134,9,134,9,123,10,126,-4,126,-4,123,10,114,13,126,-4,114,13,104,18,143,211,152,206,165,225,165,225,152,206,161,199,165,225,161,199,168,191,168,191,177,177,194,210,194,210,177,177,184,161,194,210,184,161,189,142,194,210,193,102,194,17,194,210,194,17,217,186,217,186,194,17,218,43,217,186,218,43,232,154,232,154,218,43,233,76,232,154,233,76,238,116,194,210,189,142,192,122,194,210,192,122,193,102,194,210,165,225,168,191,134,9,126,-4,163,1,61,17,63,113,63,137,63,137,65,164,61,209,61,209,65,164,73,186,61,209,73,186,92,225,92,225,73,186,85,202,92,225,85,202,101,212,61,17,63,137,61,209,61,17,61,209,38,42,38,42,61,209,38,185,38,42,38,185,23,75,23,75,38,185,23,153,23,75,23,153,17,114,63,113,61,17,66,91,190,70,194,17,193,102,165,225,132,215,143,211,96,25,126,-4,104,18,
+251,225,12,225,12,218,25,217,33,214,39,209,42,200,42,26,39,17,33,12,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,186,85,196,88,203,92,208,98,210,105,211,156,211,163,210,169,208,174,203,177,196,178,186,178,37,177,26,175,18,170,12,161,9,148,7,148,0,251,0,251,7,238,9,229,11,224,16,221,24,220,37,220,184,221,199,224,209,230,214,238,217,251,218,76,229,73,230,58,224,44,219,31,214,17,209,1,204,1,196,4,197,13,197,22,196,28,194,32,189,34,180,34,-65,33,-79,30,-88,24,-94,14,-98,0,-100,0,-107,120,-107,120,-100,101,-99,88,-95,81,-89,77,-78,76,-62,76,17,86,8,96,2,107,-1,117,-3,129,-4,163,1,191,19,213,47,227,82,232,123,228,158,216,188,198,210,175,225,148,230,132,228,117,224,103,216,89,205,76,190,16383,16383,76,167,79,176,
+39,17,33,12,116,0,116,0,33,12,25,9,116,0,25,9,12,7,156,211,251,225,105,211,98,210,105,211,39,209,98,210,39,209,42,200,175,18,170,12,251,0,251,0,170,12,161,9,251,0,161,9,148,7,238,217,251,218,251,225,238,217,251,225,230,214,230,214,251,225,177,196,230,214,177,196,178,186,221,24,178,186,178,37,221,24,178,37,224,16,224,16,178,37,229,11,220,37,220,184,178,186,178,186,220,184,221,199,178,186,221,199,224,209,251,225,156,211,163,210,251,225,163,210,169,208,251,225,169,208,174,203,251,225,174,203,177,196,93,13,88,18,42,39,42,39,88,18,85,26,42,39,85,26,42,185,42,185,85,26,84,36,42,185,84,36,84,186,42,185,84,186,85,196,42,185,85,196,88,203,42,185,88,203,92,208,42,185,92,208,42,200,251,225,12,225,25,217,251,225,25,217,33,214,251,225,33,214,39,209,251,225,39,209,105,211,251,0,251,7,238,9,251,0,238,9,229,11,251,0,229,11,178,37,251,0,178,37,177,26,251,0,177,26,175,18,116,0,116,7,102,9,116,0,102,9,93,13,116,0,93,13,42,39,116,0,42,39,42,26,116,0,42,26,39,17,116,0,12,7,12,0,251,0,148,7,148,0,178,186,221,24,220,37,25,217,12,225,12,218,98,210,42,200,92,208,230,214,178,186,224,209,
+76,229,73,230,58,224,44,219,31,214,17,209,1,204,1,196,4,197,13,197,22,196,28,194,32,189,34,180,34,-65,33,-79,30,-88,24,-94,14,-98,0,-100,0,-107,120,-107,120,-100,101,-99,88,-95,81,-89,77,-78,76,-62,76,17,86,8,96,2,107,-1,117,-3,129,-4,163,1,191,19,213,47,227,82,232,123,228,158,216,188,198,210,175,225,148,230,132,228,117,224,103,216,89,205,76,190,16383,16383,76,167,79,176,87,185,99,193,113,198,127,200,148,195,165,183,178,163,186,136,189,103,186,73,178,47,165,27,148,14,128,10,113,12,99,18,87,26,79,35,76,44,207,78,193,60,180,46,167,38,153,33,137,31,111,36,89,49,73,69,63,96,59,128,62,157,71,182,86,200,105,212,127,216,137,215,144,212,149,208,153,201,156,191,160,180,163,172,167,166,171,161,177,158,184,157,191,158,197,161,202,166,206,172,207,179,203,195,192,209,175,220,154,227,130,230,116,229,102,226,88,221,75,213,62,204,63,204,48,189,36,172,28,152,22,130,21,106,25,70,38,39,58,15,84,0,116,-4,128,-3,140,-1,152,3,163,9,173,16,182,24,189,32,197,43,205,57,214,74,213,155,210,225,7,225,4,155,12,155,17,175,24,191,35,202,
+30,-88,24,-94,120,-107,120,-107,24,-94,14,-98,120,-107,14,-98,0,-100,6,197,8,197,17,209,17,209,8,197,11,197,17,209,11,197,13,197,13,197,22,196,17,209,17,209,22,196,31,214,17,209,1,204,4,197,17,209,4,197,6,197,79,35,76,44,86,8,86,8,76,44,76,17,77,-78,76,-62,44,219,77,-78,44,219,34,169,34,169,44,219,34,180,22,196,28,194,31,214,31,214,28,194,32,189,31,214,32,189,44,219,44,219,32,189,34,180,76,190,76,229,73,230,76,190,73,230,76,-62,76,190,76,-62,76,167,76,190,76,167,79,176,76,190,79,176,89,205,232,123,228,158,227,82,227,82,228,158,216,188,227,82,216,188,213,47,213,47,216,188,198,210,213,47,198,210,191,19,191,19,198,210,189,103,191,19,189,103,186,73,191,19,186,73,178,47,198,210,175,225,178,163,198,210,178,163,186,136,198,210,186,136,189,103,132,228,127,200,148,195,132,228,148,195,148,230,148,230,148,195,165,183,148,230,165,183,175,225,175,225,165,183,178,163,128,10,129,-4,148,14,148,14,129,-4,163,1,148,14,163,1,165,27,165,27,163,1,191,19,165,27,191,19,178,47,120,-107,120,-100,101,-99,120,-107,101,-99,88,-95,120,-107,88,-95,33,-79,120,-107,33,-79,30,-88,58,224,44,219,76,-62,58,224,76,-62,73,230,34,-65,33,-79,88,-95,34,-65,88,-95,81,-89,34,-65,81,-89,77,-78,34,-65,77,-78,34,169,79,176,87,185,89,205,89,205,87,185,99,193,89,205,99,193,103,216,103,216,99,193,113,198,103,216,113,198,117,224,117,224,113,198,127,200,117,224,127,200,132,228,113,12,99,18,107,-1,113,12,107,-1,117,-3,113,12,117,-3,128,10,79,35,86,8,87,26,87,26,86,8,96,2,87,26,96,2,99,18,99,18,96,2,107,-1,129,-4,128,10,117,-3,4,197,1,204,1,196,120,-107,0,-100,0,-107,
+207,78,193,60,180,46,167,38,153,33,137,31,111,36,89,49,73,69,63,96,59,128,62,157,71,182,86,200,105,212,127,216,137,215,144,212,149,208,153,201,156,191,160,180,163,172,167,166,171,161,177,158,184,157,191,158,197,161,202,166,206,172,207,179,203,195,192,209,175,220,154,227,130,230,116,229,102,226,88,221,75,213,62,204,63,204,48,189,36,172,28,152,22,130,21,106,25,70,38,39,58,15,84,0,116,-4,128,-3,140,-1,152,3,163,9,173,16,182,24,189,32,197,43,205,57,214,74,213,155,210,225,7,225,4,155,12,155,17,175,24,191,35,202,50,209,70,211,77,211,82,209,85,207,87,202,88,195,88,40,87,25,84,16,78,11,69,9,56,7,56,0,161,0,161,7,148,9,139,13,133,18,130,26,129,36,129,195,130,201,131,206,134,209,139,210,146,211,166,209,182,202,192,191,200,175,204,155,242,225,175,225,175,218,184,217,190,216,195,213,198,210,199,205,199,201,198,198,198,195,197,193,145,55,84,184,83,188,79,196,78,201,78,204,79,209,82,212,87,215,95,217,107,218,
+89,49,73,69,84,0,84,0,73,69,63,96,84,0,63,96,58,15,58,15,63,96,59,128,63,204,59,128,62,157,63,204,62,157,71,182,137,31,116,-4,128,-3,137,31,128,-3,140,-1,137,31,111,36,116,-4,89,49,84,0,116,-4,89,49,116,-4,111,36,203,195,192,209,197,161,203,195,197,161,202,166,203,195,202,166,206,172,203,195,206,172,207,179,192,209,175,220,177,158,192,209,177,158,184,157,192,209,184,157,191,158,192,209,191,158,197,161,175,220,154,227,156,191,175,220,156,191,160,180,175,220,160,180,163,172,175,220,163,172,167,166,175,220,167,166,171,161,175,220,171,161,177,158,144,212,149,208,154,227,154,227,149,208,153,201,154,227,153,201,156,191,130,230,127,216,137,215,130,230,137,215,154,227,154,227,137,215,144,212,182,24,189,32,193,60,193,60,189,32,197,43,193,60,197,43,207,78,207,78,197,43,205,57,207,78,205,57,214,74,140,-1,152,3,153,33,153,33,152,3,163,9,153,33,163,9,167,38,167,38,163,9,173,16,167,38,173,16,180,46,180,46,173,16,182,24,180,46,182,24,193,60,153,33,137,31,140,-1,105,212,127,216,116,229,105,212,116,229,102,226,105,212,102,226,88,221,105,212,88,221,86,200,75,213,63,204,71,182,75,213,71,182,86,200,75,213,86,200,88,221,48,189,36,172,38,39,48,189,38,39,58,15,48,189,58,15,59,128,48,189,59,128,63,204,28,152,22,130,25,70,28,152,25,70,38,39,28,152,38,39,36,172,127,216,130,230,116,229,25,70,22,130,21,106,
+213,155,210,225,7,225,4,155,12,155,17,175,24,191,35,202,50,209,70,211,77,211,82,209,85,207,87,202,88,195,88,40,87,25,84,16,78,11,69,9,56,7,56,0,161,0,161,7,148,9,139,13,133,18,130,26,129,36,129,195,130,201,131,206,134,209,139,210,146,211,166,209,182,202,192,191,200,175,204,155,242,225,175,225,175,218,184,217,190,216,195,213,198,210,199,205,199,201,198,198,198,195,197,193,145,55,84,184,83,188,79,196,78,201,78,204,79,209,82,212,87,215,95,217,107,218,107,225,4,225,4,218,11,217,23,211,27,206,31,200,99,59,105,47,111,34,116,22,120,13,122,6,119,-5,111,-24,100,-44,88,-60,
+84,16,78,11,161,0,161,0,78,11,69,9,161,0,69,9,56,7,24,191,35,202,7,225,7,225,35,202,50,209,7,225,50,209,70,211,70,211,77,211,210,225,210,225,77,211,82,209,210,225,82,209,85,207,85,207,87,202,210,225,210,225,87,202,139,210,210,225,139,210,146,211,146,211,166,209,210,225,210,225,166,209,182,202,210,225,182,202,192,191,210,225,192,191,200,175,210,225,200,175,204,155,210,225,204,155,213,155,129,36,129,195,88,195,88,195,129,195,130,201,88,195,130,201,131,206,88,195,131,206,134,209,88,195,134,209,139,210,88,195,139,210,87,202,88,195,130,26,129,36,210,225,7,225,70,211,7,225,4,155,12,155,7,225,12,155,17,175,7,225,17,175,24,191,161,0,161,7,148,9,161,0,148,9,139,13,161,0,139,13,88,40,161,0,88,40,87,25,161,0,87,25,84,16,88,40,139,13,133,18,88,40,133,18,130,26,88,40,130,26,88,195,161,0,56,7,56,0,
+242,225,175,225,175,218,184,217,190,216,195,213,198,210,199,205,199,201,198,198,198,195,197,193,145,55,84,184,83,188,79,196,78,201,78,204,79,209,82,212,87,215,95,217,107,218,107,225,4,225,4,218,11,217,23,211,27,206,31,200,99,59,105,47,111,34,116,22,120,13,122,6,119,-5,111,-24,100,-44,88,-60,75,-66,70,-66,64,-64,60,-63,55,-60,49,-58,39,-56,33,-56,27,-57,21,-60,16,-65,13,-72,12,-79,14,-88,18,-96,26,-102,35,-106,47,-108,68,-105,86,-94,102,-76,118,-48,134,-11,217,192,221,202,225,208,230,213,235,216,242,218,190,330,186,331,172,325,146,315,132,310,117,305,117,297,119,298,129,298,138,297,144,295,147,290,149,281,150,270,150,204,144,212,136,219,127,225,116,229,104,230,76,225,53,209,36,185,25,153,22,113,23,89,27,66,32,46,41,29,51,15,60,8,69,2,79,-1,91,-3,103,-4,115,-3,126,0,136,6,144,13,150,22,150,-65,149,-79,146,-88,140,-94,129,-98,114,-100,114,-107,233,-107,233,-100,214,-99,202,-95,194,-89,191,-78,190,-62,190,22,195,13,203,6,213,0,224,-3,236,-4,249,-3,260,-1,270,2,279,8,287,15,298,29,306,46,313,66,316,89,
+67,-65,68,-105,70,-66,70,-66,68,-105,86,-94,70,-66,86,-94,73,-66,73,-66,86,-94,75,-66,88,-60,75,-66,86,-94,88,-60,86,-94,102,-76,31,200,78,201,78,204,78,204,79,209,31,200,31,200,79,209,82,212,31,200,82,212,107,225,107,225,82,212,87,215,107,225,87,215,95,217,95,217,107,218,107,225,107,225,4,225,11,217,107,225,11,217,17,214,107,225,17,214,23,211,107,225,23,211,27,206,107,225,27,206,31,200,122,6,134,-11,145,55,145,55,134,-11,217,192,145,55,217,192,197,193,197,193,217,192,198,195,242,225,175,225,184,217,242,225,184,217,190,216,242,225,190,216,195,213,242,225,195,213,198,210,242,225,198,210,199,205,242,225,199,205,230,213,242,225,230,213,235,216,242,225,235,216,242,218,199,205,217,192,221,202,199,205,221,202,225,208,199,205,225,208,230,213,199,204,199,201,217,192,199,204,217,192,199,205,198,198,198,195,217,192,198,198,217,192,199,201,111,34,116,22,145,55,145,55,116,22,120,13,145,55,120,13,122,6,145,55,84,184,99,59,145,55,99,59,105,47,145,55,105,47,111,34,99,59,84,184,83,188,99,59,83,188,81,192,99,59,81,192,79,196,99,59,79,196,78,201,99,59,78,201,31,200,119,-5,111,-24,118,-48,119,-5,118,-48,134,-11,119,-5,134,-11,122,6,102,-76,118,-48,111,-24,102,-76,111,-24,100,-44,102,-76,100,-44,88,-60,68,-105,67,-65,64,-64,68,-105,64,-64,60,-63,68,-105,60,-63,55,-60,68,-105,55,-60,49,-58,68,-105,49,-58,47,-108,49,-58,44,-57,47,-108,47,-108,44,-57,39,-56,47,-108,39,-56,35,-106,35,-106,39,-56,33,-56,35,-106,33,-56,27,-57,35,-106,27,-57,26,-102,26,-102,27,-57,21,-60,26,-102,21,-60,18,-96,18,-96,21,-60,16,-65,18,-96,16,-65,14,-88,14,-88,16,-65,13,-72,14,-88,13,-72,12,-79,184,217,175,225,175,218,11,217,4,225,4,218,
+190,330,186,331,172,325,146,315,132,310,117,305,117,297,119,298,129,298,138,297,144,295,147,290,149,281,150,270,150,204,144,212,136,219,127,225,116,229,104,230,76,225,53,209,36,185,25,153,22,113,23,89,27,66,32,46,41,29,51,15,60,8,69,2,79,-1,91,-3,103,-4,115,-3,126,0,136,6,144,13,150,22,150,-65,149,-79,146,-88,140,-94,129,-98,114,-100,114,-107,233,-107,233,-100,214,-99,202,-95,194,-89,191,-78,190,-62,190,22,195,13,203,6,213,0,224,-3,236,-4,249,-3,260,-1,270,2,279,8,287,15,298,29,306,46,313,66,316,89,318,113,314,153,303,185,286,209,263,225,235,230,223,229,212,225,203,219,195,212,190,204,16383,16383,190,179,192,188,198,197,207,206,219,212,233,215,248,209,260,194,268,172,273,146,275,117,274,99,273,82,271,66,267,51,263,38,258,29,253,21,247,15,240,11,233,10,219,13,207,19,198,28,192,38,190,47,16383,16383,150,47,147,38,141,28,132,19,120,13,105,10,99,11,92,15,86,21,81,29,76,38,72,51,68,66,66,82,65,99,65,117,66,146,71,172,80,194,91,209,105,215,120,212,132,206,141,197,147,187,150,177,238,0,238,7,229,8,221,12,213,18,205,26,197,37,133,136,175,195,181,203,188,209,197,214,215,218,215,225,136,225,136,218,144,217,150,215,154,213,156,210,156,201,154,195,150,187,145,178,138,169,124,149,116,162,108,174,101,185,97,194,94,201,93,206,93,210,96,213,100,216,106,217,114,218,114,225,11,225,11,218,15,218,23,217,31,214,38,208,45,200,54,187,54,188,100,115,45,32,37,22,30,15,23,11,16,9,7,7,7,0,79,0,79,7,72,8,66,9,62,11,60,13,60,19,61,23,63,27,65,33,69,39,108,100,155,28,156,27,156,25,157,23,157,15,155,12,152,9,146,8,137,7,137,0,251,225,146,225,146,218,159,216,168,212,174,207,177,199,178,189,178,39,177,29,174,22,170,17,164,15,157,14,104,14,97,15,92,17,88,22,85,29,84,39,84,188,85,199,88,207,94,213,103,216,116,218,116,225,12,225,12,218,25,216,33,214,39,209,42,201,42,26,39,16,33,11,24,8,12,7,12,0,199,0,210,-3,221,-14,232,-34,243,-68,251,-68,251,7,238,8,229,11,224,16,221,25,220,40,220,186,221,199,223,208,229,213,238,216,251,218,
+69,2,79,-1,72,51,72,51,79,-1,76,38,81,29,76,38,79,-1,81,29,79,-1,91,-3,150,177,150,47,150,22,150,22,150,47,147,38,150,22,147,38,144,13,144,13,147,38,141,28,144,13,141,28,136,6,136,6,141,28,132,19,136,6,132,19,126,0,126,0,132,19,120,13,126,0,120,13,115,-3,115,-3,120,13,105,10,105,10,99,11,103,-4,103,-4,99,11,92,15,103,-4,92,15,91,-3,91,-3,92,15,86,21,91,-3,86,21,81,29,150,270,150,204,150,22,150,22,150,204,150,177,150,177,150,204,147,187,147,187,150,204,144,212,147,187,144,212,141,197,141,197,144,212,136,219,141,197,136,219,132,206,132,206,136,219,127,225,132,206,127,225,120,212,120,212,127,225,116,229,120,212,116,229,105,215,66,146,71,172,76,225,76,225,71,172,80,194,76,225,80,194,104,230,104,230,80,194,91,209,104,230,91,209,105,215,76,225,53,209,66,146,66,146,53,209,65,117,65,99,65,117,60,8,65,99,60,8,69,2,41,29,51,15,53,209,53,209,51,15,60,8,53,209,60,8,65,117,36,185,25,153,27,66,36,185,27,66,32,46,36,185,32,46,41,29,36,185,41,29,53,209,25,153,22,113,23,89,25,153,23,89,27,66,146,-88,140,-94,233,-107,233,-107,140,-94,129,-98,233,-107,129,-98,114,-100,122,298,124,298,132,310,132,310,124,298,126,298,132,310,126,298,129,298,129,298,138,297,132,310,132,310,138,297,146,315,132,310,117,305,119,298,132,310,119,298,122,298,192,38,190,47,195,13,195,13,190,47,190,22,191,-78,190,-62,159,320,191,-78,159,320,150,22,150,22,159,320,150,270,138,297,144,295,146,315,146,315,144,295,147,290,146,315,147,290,159,320,159,320,147,290,149,281,159,320,149,281,150,270,190,204,190,330,186,331,190,204,186,331,190,-62,190,204,190,-62,190,179,190,204,190,179,195,212,274,99,273,82,279,8,279,8,273,82,271,66,279,8,271,66,270,2,270,2,271,66,267,51,270,2,267,51,263,38,263,38,258,29,260,-1,260,-1,258,29,253,21,260,-1,253,21,249,-3,249,-3,253,21,247,15,249,-3,247,15,240,11,213,0,224,-3,219,13,219,13,224,-3,233,10,240,11,233,10,236,-4,240,11,236,-4,249,-3,314,153,303,185,306,46,314,153,306,46,313,66,314,153,313,66,316,89,314,153,316,89,318,113,274,99,279,8,275,117,275,117,279,8,286,209,286,209,279,8,287,15,286,209,287,15,303,185,303,185,287,15,298,29,303,185,298,29,306,46,248,209,260,194,263,225,263,225,260,194,268,172,263,225,268,172,286,209,286,209,268,172,273,146,286,209,273,146,275,117,263,225,235,230,248,209,248,209,235,230,233,215,219,212,233,215,223,229,219,212,223,229,212,225,263,38,260,-1,270,2,233,-107,233,-100,214,-99,233,-107,214,-99,202,-95,233,-107,202,-95,149,-79,233,-107,149,-79,146,-88,172,325,159,320,190,-62,172,325,190,-62,186,331,194,-89,191,-78,150,22,194,-89,150,22,150,-65,194,-89,150,-65,202,-95,69,2,72,51,68,66,69,2,68,66,66,82,69,2,66,82,65,99,192,38,195,13,198,28,198,28,195,13,203,6,198,28,203,6,207,19,207,19,203,6,213,0,207,19,213,0,219,13,190,179,192,188,195,212,195,212,192,188,198,197,195,212,198,197,203,219,203,219,198,197,207,206,203,219,207,206,212,225,212,225,207,206,219,212,235,230,223,229,233,215,233,10,224,-3,236,-4,115,-3,105,10,103,-4,119,298,117,305,117,297,233,-107,114,-100,114,-107,149,-79,202,-95,150,-65,105,215,116,229,104,230,
+238,0,238,7,229,8,221,12,213,18,205,26,197,37,133,136,175,195,181,203,188,209,197,214,215,218,215,225,136,225,136,218,144,217,150,215,154,213,156,210,156,201,154,195,150,187,145,178,138,169,124,149,116,162,108,174,101,185,97,194,94,201,93,206,93,210,96,213,100,216,106,217,114,218,114,225,11,225,11,218,15,218,23,217,31,214,38,208,45,200,54,187,54,188,100,115,45,32,37,22,30,15,23,11,16,9,7,7,7,0,79,0,79,7,72,8,66,9,62,11,60,13,60,19,61,23,63,27,65,33,69,39,108,100,155,28,156,27,156,25,157,23,157,15,155,12,152,9,146,8,137,7,137,0,251,225,146,225,146,218,159,216,168,212,174,207,177,199,178,189,178,39,177,29,174,22,170,17,164,15,157,14,104,14,97,15,92,17,88,22,85,29,84,39,84,188,85,199,88,207,94,213,103,216,116,218,116,225,12,225,12,218,25,216,33,214,39,209,42,201,42,26,39,16,33,11,24,8,12,7,12,0,199,0,210,-3,221,-14,232,-34,243,-68,251,-68,251,7,238,8,229,11,224,16,221,25,220,40,220,186,221,199,223,208,229,213,238,216,251,218,244,225,139,225,139,218,152,216,161,212,167,207,170,200,171,190,171,118,166,116,158,113,148,110,136,108,123,107,106,108,94,112,87,120,83,131,81,147,81,186,
+30,15,23,11,79,0,79,0,23,11,16,9,79,0,16,9,7,7,31,214,38,208,114,225,114,225,38,208,45,200,114,225,45,200,54,188,54,188,45,200,54,187,54,187,100,115,93,206,93,206,93,210,54,187,54,187,93,210,96,213,54,187,96,213,114,225,114,225,96,213,100,216,114,225,100,216,106,217,30,15,79,0,37,22,37,22,79,0,62,11,37,22,62,11,45,32,45,32,62,11,60,13,45,32,60,13,60,17,60,17,60,19,45,32,45,32,60,19,61,23,45,32,61,23,63,27,106,217,114,218,114,225,114,225,11,225,15,218,114,225,15,218,23,217,114,225,23,217,31,214,138,169,124,149,133,136,138,169,133,136,175,195,138,169,175,195,145,178,215,225,136,225,144,217,215,225,144,217,150,215,215,225,150,215,154,213,215,225,154,213,156,210,215,225,156,210,156,206,215,225,156,206,188,209,215,225,188,209,197,214,215,225,197,214,206,216,215,225,206,216,215,218,175,195,181,203,156,206,175,195,156,206,156,201,175,195,156,201,154,195,175,195,154,195,150,187,175,195,150,187,145,178,155,12,152,9,238,0,238,0,152,9,146,8,238,0,146,8,137,7,157,20,238,0,221,12,157,20,221,12,213,18,157,20,213,18,205,26,157,20,205,26,197,37,157,20,197,37,157,21,197,37,133,136,155,28,197,37,155,28,156,27,197,37,156,27,156,25,197,37,156,25,157,23,197,37,157,23,157,21,133,136,124,149,155,28,155,28,124,149,116,162,155,28,116,162,108,100,108,100,116,162,108,174,108,100,108,174,101,185,100,115,45,32,63,27,100,115,63,27,65,33,100,115,65,33,69,39,100,115,69,39,108,100,100,115,108,100,101,185,100,115,101,185,97,194,100,115,97,194,94,201,100,115,94,201,93,206,229,8,221,12,238,0,229,8,238,0,238,7,157,15,155,12,238,0,157,15,238,0,157,20,79,0,79,7,72,8,79,0,72,8,66,9,79,0,66,9,62,11,79,0,7,7,7,0,238,0,137,7,137,0,144,217,136,225,136,218,188,209,156,206,181,203,15,218,11,225,11,218,114,225,54,188,54,187,
+251,225,146,225,146,218,159,216,168,212,174,207,177,199,178,189,178,39,177,29,174,22,170,17,164,15,157,14,104,14,97,15,92,17,88,22,85,29,84,39,84,188,85,199,88,207,94,213,103,216,116,218,116,225,12,225,12,218,25,216,33,214,39,209,42,201,42,26,39,16,33,11,24,8,12,7,12,0,199,0,210,-3,221,-14,232,-34,243,-68,251,-68,251,7,238,8,229,11,224,16,221,25,220,40,220,186,221,199,223,208,229,213,238,216,251,218,244,225,139,225,139,218,152,216,161,212,167,207,170,200,171,190,171,118,166,116,158,113,148,110,136,108,123,107,106,108,94,112,87,120,83,131,81,147,81,186,82,199,86,208,91,213,100,216,113,218,113,225,9,225,9,218,22,216,30,213,36,209,39,200,40,186,40,144,43,121,52,105,66,97,85,93,107,92,124,93,139,96,152,100,162,104,171,108,171,27,168,18,162,13,153,9,141,7,141,0,244,0,244,7,231,9,223,12,217,17,215,25,214,39,
+39,16,33,11,187,0,187,0,33,11,24,8,187,0,24,8,12,7,116,225,12,225,25,216,116,225,25,216,33,214,116,225,33,214,39,209,116,225,39,209,42,201,116,225,42,201,42,188,116,225,42,188,94,213,116,225,94,213,103,216,116,225,103,216,116,218,92,17,88,22,42,41,42,41,88,22,85,29,42,41,85,29,42,188,42,188,85,29,84,39,42,188,84,39,84,188,42,188,84,188,85,199,42,188,85,199,88,207,42,188,88,207,94,213,251,225,146,225,159,216,251,225,159,216,168,212,251,225,168,212,174,207,251,225,174,207,177,199,251,225,177,199,178,189,251,225,178,189,229,213,251,225,229,213,238,216,251,225,238,216,251,218,224,16,221,25,221,-14,221,-14,221,25,220,40,220,40,220,186,210,-3,210,-3,220,186,199,0,178,189,187,0,221,199,221,199,187,0,199,0,221,199,199,0,220,186,223,208,229,213,178,189,223,208,178,189,221,199,251,-68,251,7,243,-68,243,-68,251,7,238,8,243,-68,238,8,232,-34,232,-34,238,8,229,11,232,-34,229,11,224,16,174,22,170,17,187,0,187,0,170,17,164,15,187,0,164,15,157,14,187,0,178,189,178,39,187,0,178,39,177,29,187,0,177,29,174,22,42,26,39,16,97,15,97,15,39,16,187,0,97,15,187,0,104,14,104,14,187,0,157,14,42,26,97,15,92,17,42,26,92,17,42,41,187,0,12,7,12,0,221,-14,220,40,210,-3,224,16,221,-14,232,-34,159,216,146,225,146,218,25,216,12,225,12,218,42,188,42,201,42,187,
+244,225,139,225,139,218,152,216,161,212,167,207,170,200,171,190,171,118,166,116,158,113,148,110,136,108,123,107,106,108,94,112,87,120,83,131,81,147,81,186,82,199,86,208,91,213,100,216,113,218,113,225,9,225,9,218,22,216,30,213,36,209,39,200,40,186,40,144,43,121,52,105,66,97,85,93,107,92,124,93,139,96,152,100,162,104,171,108,171,27,168,18,162,13,153,9,141,7,141,0,244,0,244,7,231,9,223,12,217,17,215,25,214,39,214,199,217,208,223,213,231,216,244,218,373,225,270,225,270,218,282,216,291,213,296,207,299,200,300,189,300,39,299,29,297,22,293,17,287,15,278,14,235,14,228,15,221,17,217,22,214,29,213,39,213,189,214,199,218,207,224,213,232,216,243,218,243,225,141,225,141,218,152,216,160,213,166,207,170,199,171,189,171,39,170,29,168,22,164,17,158,15,150,14,107,14,99,15,93,17,88,22,85,29,84,39,84,189,85,199,88,207,93,212,102,216,114,218,114,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,
+113,218,113,218,100,216,100,216,113,218,113,225,100,216,113,225,91,213,91,213,113,225,40,186,91,213,40,186,86,208,86,208,40,186,43,121,86,208,43,121,82,199,82,199,43,121,52,105,82,199,52,105,66,97,87,120,83,131,85,93,85,93,83,131,81,147,81,147,81,186,66,97,66,97,81,186,82,199,30,213,36,209,113,225,113,225,36,209,39,200,113,225,39,200,40,186,22,216,30,213,113,225,22,216,113,225,9,225,22,216,9,225,9,218,244,7,231,9,244,0,244,0,231,9,223,12,244,0,223,12,171,39,171,39,223,12,217,17,171,39,217,17,171,108,171,108,171,118,166,116,171,108,166,116,162,104,162,104,166,116,158,113,162,104,158,113,152,100,152,100,158,113,148,110,152,100,148,110,139,96,139,96,148,110,136,108,139,96,136,108,124,93,124,93,136,108,123,107,107,92,124,93,123,107,107,92,123,107,106,108,107,92,106,108,94,112,107,92,94,112,87,120,107,92,87,120,85,93,244,225,139,225,152,216,244,225,152,216,161,212,244,225,161,212,167,207,244,225,167,207,170,200,244,225,170,200,171,190,244,225,171,190,223,213,244,225,223,213,231,216,244,225,231,216,244,218,214,39,214,186,171,108,171,108,214,186,214,199,171,108,214,199,217,208,171,190,171,108,217,208,171,190,217,208,223,213,171,108,217,17,215,25,171,108,215,25,214,39,244,0,171,39,171,27,244,0,171,27,168,18,244,0,168,18,162,13,244,0,162,13,153,9,244,0,153,9,141,7,244,0,141,7,141,0,43,121,40,186,40,144,171,118,171,108,171,190,152,216,139,225,139,218,85,93,81,147,66,97,
+373,225,270,225,270,218,282,216,291,213,296,207,299,200,300,189,300,39,299,29,297,22,293,17,287,15,278,14,235,14,228,15,221,17,217,22,214,29,213,39,213,189,214,199,218,207,224,213,232,216,243,218,243,225,141,225,141,218,152,216,160,213,166,207,170,199,171,189,171,39,170,29,168,22,164,17,158,15,150,14,107,14,99,15,93,17,88,22,85,29,84,39,84,189,85,199,88,207,93,212,102,216,114,218,114,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,372,0,372,7,360,8,351,11,345,16,342,25,342,198,345,207,351,213,360,216,373,218,373,225,270,225,270,218,282,216,291,213,296,207,299,200,300,189,300,39,299,29,297,22,293,17,287,15,278,14,235,14,228,15,221,17,217,22,214,29,213,39,213,189,214,199,218,207,224,212,232,216,243,218,243,225,141,225,141,218,142,218,152,216,160,212,166,207,170,199,171,189,171,39,170,29,168,22,164,17,158,15,150,14,107,14,99,15,93,17,88,22,85,29,84,39,84,189,85,199,87,207,93,212,101,216,114,218,114,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,325,0,335,-5,345,-17,354,-37,364,-68,372,-68,372,7,360,8,351,11,345,15,
+39,16,33,11,372,0,372,0,33,11,25,9,372,0,25,9,12,7,114,225,12,225,25,216,114,225,25,216,33,212,114,225,33,212,39,206,114,225,39,206,42,197,114,225,42,197,42,183,114,225,42,183,93,212,114,225,93,212,102,216,114,225,102,216,114,218,93,17,88,22,42,40,42,40,88,22,85,29,42,40,85,29,42,183,42,183,85,29,84,39,42,183,84,39,84,189,42,183,84,189,85,199,42,183,85,199,88,207,42,183,88,207,93,212,93,17,42,25,99,15,99,15,42,25,39,16,99,15,39,16,107,14,107,14,39,16,372,0,107,14,372,0,150,14,150,14,372,0,158,15,243,225,141,225,152,216,243,225,152,216,160,213,243,225,160,213,166,207,243,225,166,207,170,199,243,225,170,199,171,189,243,225,171,189,224,213,243,225,224,213,232,216,243,225,232,216,243,218,213,39,213,189,171,189,171,189,213,189,214,199,171,189,214,199,218,207,221,17,217,22,171,39,171,39,217,22,214,29,171,39,214,29,171,189,297,22,293,17,372,0,372,0,293,17,287,15,372,0,287,15,278,14,373,225,270,225,282,216,373,225,282,216,291,213,373,225,291,213,296,207,373,225,296,207,299,200,373,225,299,200,300,189,373,225,300,189,351,213,373,225,351,213,360,216,373,225,360,216,373,218,342,40,342,183,300,189,300,189,342,183,342,198,300,189,342,198,345,207,351,11,345,16,300,39,300,39,345,16,342,25,300,39,342,25,300,189,372,0,372,7,360,8,372,0,360,8,351,11,372,0,351,11,299,29,372,0,299,29,297,22,372,0,278,14,235,14,372,0,235,14,228,15,372,0,228,15,164,17,372,0,164,17,158,15,170,29,168,22,228,15,170,29,228,15,221,17,170,29,221,17,171,39,372,0,12,7,12,0,42,25,93,17,42,40,164,17,228,15,168,22,171,189,214,29,213,39,299,29,351,11,300,39,300,189,342,25,342,40,282,216,270,225,270,218,351,213,300,189,345,207,152,216,141,225,141,218,224,213,171,189,218,207,25,216,12,225,12,218,
+373,225,270,225,270,218,282,216,291,213,296,207,299,200,300,189,300,39,299,29,297,22,293,17,287,15,278,14,235,14,228,15,221,17,217,22,214,29,213,39,213,189,214,199,218,207,224,212,232,216,243,218,243,225,141,225,141,218,142,218,152,216,160,212,166,207,170,199,171,189,171,39,170,29,168,22,164,17,158,15,150,14,107,14,99,15,93,17,88,22,85,29,84,39,84,189,85,199,87,207,93,212,101,216,114,218,114,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,325,0,335,-5,345,-17,354,-37,364,-68,372,-68,372,7,360,8,351,11,345,15,342,25,342,198,345,207,351,213,360,216,373,218,126,126,126,199,129,207,134,212,143,216,156,218,156,225,8,225,4,161,12,161,18,181,25,195,35,205,46,209,61,211,68,211,74,209,79,207,83,202,84,195,84,40,83,25,80,16,75,11,66,9,52,7,52,0,169,0,196,3,220,10,238,23,249,40,253,62,249,86,235,105,215,117,188,124,158,126,16383,16383,126,112,148,112,167,111,183,107,196,98,205,84,208,64,205,43,196,29,182,20,164,15,142,14,135,14,130,16,127,19,126,23,126,30,323,0,323,8,310,10,301,13,295,18,293,26,292,36,292,199,295,207,300,212,309,216,323,218,323,225,219,225,219,218,232,216,241,212,246,206,249,197,250,183,250,40,249,25,246,16,241,11,232,9,219,7,
+39,16,33,11,315,0,315,0,33,11,25,9,315,0,25,9,12,7,114,225,12,225,25,216,114,225,25,216,33,212,114,225,33,212,39,206,114,225,39,206,42,197,114,225,42,197,42,183,114,225,42,183,93,212,114,225,93,212,101,216,114,225,101,216,114,218,93,17,88,22,42,40,42,40,88,22,85,29,42,40,85,29,42,183,42,183,85,29,84,39,42,183,84,39,84,189,42,183,84,189,85,199,42,183,85,199,87,207,42,183,87,207,93,212,93,17,42,25,99,15,99,15,42,25,39,16,99,15,39,16,107,14,107,14,39,16,315,0,107,14,315,0,150,14,150,14,315,0,158,15,243,225,141,225,142,218,243,225,142,218,152,216,243,225,152,216,160,212,243,225,160,212,166,207,243,225,166,207,170,199,243,225,170,199,171,189,243,225,171,189,224,212,243,225,224,212,232,216,243,225,232,216,243,218,213,39,213,189,171,189,171,189,213,189,214,199,171,189,214,199,218,207,221,17,217,22,171,39,171,39,217,22,214,29,171,39,214,29,171,189,373,225,270,225,282,216,373,225,282,216,291,213,373,225,291,213,296,207,373,225,296,207,299,200,373,225,299,200,300,189,373,225,300,189,351,213,373,225,351,213,360,216,373,225,360,216,373,218,345,15,342,25,345,-17,345,-17,342,25,342,40,342,40,342,183,335,-5,335,-5,342,183,325,0,300,189,315,0,342,198,342,198,315,0,325,0,342,198,325,0,342,183,345,207,351,213,300,189,345,207,300,189,342,198,372,-68,372,7,364,-68,364,-68,372,7,360,8,364,-68,360,8,354,-37,354,-37,360,8,351,11,354,-37,351,11,345,15,297,22,293,17,315,0,315,0,293,17,287,15,315,0,287,15,278,14,315,0,300,189,300,39,315,0,300,39,299,29,315,0,299,29,297,22,315,0,278,14,235,14,315,0,235,14,228,15,315,0,228,15,168,22,315,0,168,22,164,17,315,0,164,17,158,15,170,29,168,22,228,15,170,29,228,15,221,17,170,29,221,17,171,39,315,0,12,7,12,0,42,25,93,17,42,40,171,189,214,29,213,39,345,-17,342,40,335,-5,345,15,345,-17,354,-37,282,216,270,225,270,218,142,218,141,225,141,218,224,212,171,189,218,207,25,216,12,225,12,218,
+126,126,126,199,129,207,134,212,143,216,156,218,156,225,8,225,4,161,12,161,18,181,25,195,35,205,46,209,61,211,68,211,74,209,79,207,83,202,84,195,84,40,83,25,80,16,75,11,66,9,52,7,52,0,169,0,196,3,220,10,238,23,249,40,253,62,249,86,235,105,215,117,188,124,158,126,16383,16383,126,112,148,112,167,111,183,107,196,98,205,84,208,64,205,43,196,29,182,20,164,15,142,14,135,14,130,16,127,19,126,23,126,30,323,0,323,8,310,10,301,13,295,18,293,26,292,36,292,199,295,207,300,212,309,216,323,218,323,225,219,225,219,218,232,216,241,212,246,206,249,197,250,183,250,40,249,25,246,16,241,11,232,9,219,7,219,0,16383,16383,84,126,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,127,0,155,3,179,10,197,23,209,40,213,62,208,86,194,105,
+80,16,75,11,169,0,169,0,75,11,66,9,169,0,66,9,52,7,74,209,156,225,68,211,68,211,156,225,61,211,46,209,61,211,156,225,46,209,156,225,8,225,156,225,74,209,79,207,156,225,79,207,83,202,156,225,83,202,84,195,156,225,84,195,134,212,156,225,134,212,143,216,156,225,143,216,156,218,84,195,126,23,126,30,126,126,126,112,148,112,126,126,148,112,158,126,158,126,148,112,167,111,158,126,167,111,188,124,188,124,167,111,183,107,188,124,183,107,196,98,84,195,126,30,126,189,84,195,126,189,126,199,84,195,126,199,129,207,84,195,129,207,134,212,8,225,4,161,12,161,8,225,12,161,18,181,8,225,18,181,25,195,8,225,25,195,35,205,8,225,35,205,46,209,205,43,196,29,196,3,196,3,196,29,182,20,196,3,182,20,169,0,169,0,182,20,164,15,169,0,164,15,142,14,142,14,135,14,169,0,169,0,135,14,130,16,169,0,130,16,83,25,83,25,130,16,84,40,196,3,220,10,205,43,205,43,220,10,208,64,215,117,208,64,220,10,215,117,220,10,235,105,235,105,220,10,238,23,235,105,238,23,249,86,249,86,238,23,249,40,249,86,249,40,253,62,215,117,188,124,196,98,215,117,196,98,205,84,215,117,205,84,208,64,84,40,130,16,127,19,84,40,127,19,126,23,84,40,126,23,84,195,169,0,52,7,52,0,80,16,169,0,83,25,
+323,0,323,8,310,10,301,13,295,18,293,26,292,36,292,199,295,207,300,212,309,216,323,218,323,225,219,225,219,218,232,216,241,212,246,206,249,197,250,183,250,40,249,25,246,16,241,11,232,9,219,7,219,0,16383,16383,84,126,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,127,0,155,3,179,10,197,23,209,40,213,62,208,86,194,105,174,117,148,124,118,126,16383,16383,84,112,107,112,126,111,142,107,155,98,164,84,167,64,164,43,155,29,141,20,123,15,102,14,94,14,89,16,86,19,85,23,84,30,84,126,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,127,0,155,3,179,10,197,23,209,40,213,62,208,86,194,105,174,117,148,124,118,126,16383,16383,84,112,107,112,126,111,142,107,155,98,164,84,167,64,164,43,155,29,141,20,123,15,102,14,94,14,89,16,86,19,85,23,84,30,30,228,23,157,32,157,38,173,46,189,58,203,75,212,99,216,122,212,140,200,154,182,162,157,165,128,75,128,75,112,165,112,160,87,150,64,135,47,114,35,88,31,71,33,56,37,42,46,28,59,15,78,7,74,18,53,
+323,218,323,218,309,216,309,216,323,218,323,225,309,216,323,225,300,212,300,212,323,225,249,197,300,212,249,197,250,183,293,26,250,183,250,40,293,26,250,40,295,18,295,18,250,40,301,13,292,36,292,189,250,183,250,183,292,189,292,199,250,183,292,199,295,207,323,225,219,225,232,216,323,225,232,216,241,212,323,225,241,212,246,206,323,225,246,206,249,197,323,0,323,8,310,10,323,0,310,10,301,13,323,0,301,13,250,40,323,0,250,40,249,25,323,0,249,25,246,16,323,0,246,16,241,11,323,0,241,11,232,9,323,0,232,9,219,7,323,0,219,7,219,0,39,16,33,11,127,0,127,0,33,11,25,9,127,0,25,9,12,7,116,225,12,225,25,216,116,225,25,216,33,212,116,225,33,212,39,206,116,225,39,206,42,197,116,225,42,197,93,212,116,225,93,212,102,216,116,225,102,216,116,218,42,183,85,23,84,30,84,126,84,112,107,112,84,126,107,112,118,126,118,126,107,112,126,111,118,126,126,111,148,124,148,124,126,111,142,107,148,124,142,107,155,98,42,183,84,30,84,189,42,183,84,189,85,199,42,183,85,199,88,207,42,183,88,207,93,212,42,183,93,212,42,197,164,43,155,29,155,3,155,3,155,29,141,20,155,3,141,20,127,0,127,0,141,20,123,15,127,0,123,15,102,14,102,14,94,14,127,0,127,0,94,14,89,16,127,0,89,16,42,25,42,25,89,16,42,40,155,3,179,10,164,43,164,43,179,10,167,64,174,117,167,64,179,10,174,117,179,10,194,105,194,105,179,10,197,23,194,105,197,23,208,86,208,86,197,23,209,40,208,86,209,40,213,62,174,117,148,124,155,98,174,117,155,98,164,84,174,117,164,84,167,64,42,40,89,16,86,19,42,40,86,19,85,23,42,40,85,23,42,183,127,0,12,7,12,0,39,16,127,0,42,25,25,216,12,225,12,218,250,183,293,26,292,36,232,216,219,225,219,218,300,212,250,183,295,207,
+84,126,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,127,0,155,3,179,10,197,23,209,40,213,62,208,86,194,105,174,117,148,124,118,126,16383,16383,84,112,107,112,126,111,142,107,155,98,164,84,167,64,164,43,155,29,141,20,123,15,102,14,94,14,89,16,86,19,85,23,84,30,30,228,23,157,32,157,38,173,46,189,58,203,75,212,99,216,122,212,140,200,154,182,162,157,165,128,75,128,75,112,165,112,160,87,150,64,135,47,114,35,88,31,71,33,56,37,42,46,28,59,15,78,7,74,18,53,32,32,49,14,72,0,101,-4,136,1,165,16,187,41,200,73,205,110,201,147,189,179,169,206,140,223,102,230,92,230,84,229,63,222,59,220,56,218,52,217,48,217,
+39,16,33,11,127,0,127,0,33,11,25,9,127,0,25,9,12,7,116,225,12,225,25,216,116,225,25,216,33,212,116,225,33,212,39,206,116,225,39,206,42,197,116,225,42,197,93,212,116,225,93,212,102,216,116,225,102,216,116,218,42,183,85,23,84,30,84,126,84,112,107,112,84,126,107,112,118,126,118,126,107,112,126,111,118,126,126,111,148,124,148,124,126,111,142,107,148,124,142,107,155,98,42,183,84,30,84,189,42,183,84,189,85,199,42,183,85,199,88,207,42,183,88,207,93,212,42,183,93,212,42,197,164,43,155,29,155,3,155,3,155,29,141,20,155,3,141,20,127,0,127,0,141,20,123,15,127,0,123,15,102,14,102,14,94,14,127,0,127,0,94,14,89,16,127,0,89,16,42,25,42,25,89,16,42,40,155,3,179,10,164,43,164,43,179,10,167,64,174,117,167,64,179,10,174,117,179,10,194,105,194,105,179,10,197,23,194,105,197,23,208,86,208,86,197,23,209,40,208,86,209,40,213,62,174,117,148,124,155,98,174,117,155,98,164,84,174,117,164,84,167,64,42,40,89,16,86,19,42,40,86,19,85,23,42,40,85,23,42,183,127,0,12,7,12,0,39,16,127,0,42,25,25,216,12,225,12,218,
+30,228,23,157,32,157,38,173,46,189,58,203,75,212,99,216,122,212,140,200,154,182,162,157,165,128,75,128,75,112,165,112,160,87,150,64,135,47,114,35,88,31,71,33,56,37,42,46,28,59,15,78,7,74,18,53,32,32,49,14,72,0,101,-4,136,1,165,16,187,41,200,73,205,110,201,147,189,179,169,206,140,223,102,230,92,230,84,229,63,222,59,220,56,218,52,217,48,217,44,218,42,219,40,221,38,224,37,228,84,124,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,108,131,108,138,70,153,39,176,16,205,0,239,-4,276,1,308,17,331,43,346,76,352,116,346,154,331,186,308,210,278,225,243,230,207,225,177,211,154,189,138,160,131,124,16383,16383,306,102,304,70,296,44,284,25,
+59,220,56,218,58,203,58,203,56,218,52,217,58,203,52,217,48,217,48,217,44,218,46,189,46,189,44,218,42,219,46,189,42,219,40,221,30,228,32,157,37,228,37,228,32,157,38,173,37,228,38,173,38,224,38,224,38,173,46,189,38,224,46,189,40,221,15,78,18,53,28,59,28,59,18,53,32,32,28,59,32,32,42,46,42,46,32,32,49,14,42,46,49,14,56,37,56,37,49,14,72,0,56,37,72,0,71,33,71,33,72,0,88,31,114,35,88,31,101,-4,114,35,101,-4,136,1,99,216,92,230,84,229,99,216,84,229,78,227,99,216,78,227,75,212,99,216,102,230,92,230,75,212,78,227,72,225,75,212,72,225,66,223,75,212,66,223,63,222,75,212,63,222,59,220,75,212,59,220,58,203,48,217,46,189,58,203,75,128,165,112,165,128,165,128,165,112,165,16,165,128,165,16,169,206,205,110,201,147,200,73,200,73,201,147,189,179,200,73,189,179,187,41,187,41,189,179,169,206,187,41,169,206,165,16,169,206,140,223,140,200,169,206,140,200,154,182,169,206,154,182,162,157,169,206,162,157,165,128,122,212,140,200,140,223,122,212,140,223,102,230,122,212,102,230,99,216,165,112,160,87,165,16,165,16,160,87,150,64,165,16,150,64,136,1,136,1,150,64,135,47,136,1,135,47,114,35,88,31,72,0,101,-4,18,53,15,78,7,74,32,157,30,228,23,157,165,112,75,128,75,112,
+84,124,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,108,131,108,138,70,153,39,176,16,205,0,239,-4,276,1,308,17,331,43,346,76,352,116,346,154,331,186,308,210,278,225,243,230,207,225,177,211,154,189,138,160,131,124,16383,16383,306,102,304,70,296,44,284,25,268,13,248,9,237,10,227,13,218,18,210,25,203,34,193,51,185,70,180,91,177,113,176,137,179,164,186,186,199,202,215,212,234,216,246,215,257,211,266,206,274,199,281,191,290,177,297,161,302,142,305,122,306,102,224,225,121,225,91,224,65,219,45,210,31,193,26,167,30,148,40,131,55,118,74,109,97,104,37,31,32,25,26,19,19,14,11,9,2,7,2,0,64,0,142,103,151,103,151,25,148,16,143,11,135,8,123,7,123,0,224,0,224,8,211,10,202,13,197,18,194,26,193,40,193,183,194,198,197,207,202,213,211,216,224,218,16383,16383,151,117,131,117,111,119,94,125,82,135,74,148,71,165,75,185,85,198,99,206,117,210,136,211,142,211,147,209,149,206,151,202,151,195,193,286,191,294,188,301,182,306,175,310,167,311,160,310,153,306,148,301,144,294,143,286,144,278,147,272,153,266,159,263,167,262,175,263,182,266,188,272,191,278,193,286,16383,16383,
+39,16,33,11,116,0,116,0,33,11,25,9,116,0,25,9,12,7,116,225,12,225,25,216,116,225,25,216,33,212,116,225,33,212,39,206,116,225,39,206,42,197,116,225,42,197,93,212,116,225,93,212,102,216,116,225,102,216,116,218,138,160,131,124,131,108,131,108,131,124,84,124,131,108,84,124,84,108,85,26,84,36,42,183,85,26,42,183,42,40,42,183,84,36,84,189,42,183,84,189,85,199,42,183,85,199,88,207,42,183,88,207,93,212,42,183,93,212,42,197,116,0,116,7,102,9,116,0,102,9,93,13,116,0,93,13,42,40,116,0,42,40,42,25,116,0,42,25,39,16,42,40,93,13,88,18,42,40,88,18,85,26,180,91,176,16,185,70,185,70,176,16,205,0,185,70,205,0,193,51,193,51,205,0,203,34,210,25,203,34,205,0,210,25,205,0,239,-4,278,225,243,230,246,215,246,215,243,230,234,216,215,212,234,216,243,230,215,212,243,230,207,225,304,70,296,44,308,17,308,17,296,44,284,25,308,17,284,25,276,1,276,1,284,25,268,13,276,1,268,13,248,9,248,9,237,10,239,-4,239,-4,237,10,227,13,239,-4,227,13,218,18,257,211,266,206,278,225,278,225,266,206,274,199,278,225,274,199,281,191,281,191,290,177,308,210,308,210,290,177,297,161,308,210,297,161,302,142,346,154,331,186,331,43,346,154,331,43,346,76,346,154,346,76,352,116,304,70,308,17,306,102,306,102,308,17,308,210,308,210,308,17,331,43,308,210,331,43,331,186,308,210,302,142,305,122,308,210,305,122,306,102,308,210,278,225,281,191,248,9,239,-4,276,1,176,137,179,164,177,211,177,211,179,164,186,186,177,211,186,186,207,225,207,225,186,186,199,202,207,225,199,202,215,212,131,108,138,70,138,160,138,160,138,70,153,39,138,160,153,39,154,189,154,189,153,39,176,16,154,189,176,16,176,137,176,137,177,211,154,189,177,113,176,137,176,16,177,113,176,16,180,91,278,225,246,215,257,211,210,25,239,-4,218,18,116,0,12,7,12,0,25,216,12,225,12,218,
+224,225,121,225,91,224,65,219,45,210,31,193,26,167,30,148,40,131,55,118,74,109,97,104,37,31,32,25,26,19,19,14,11,9,2,7,2,0,64,0,142,103,151,103,151,25,148,16,143,11,135,8,123,7,123,0,224,0,224,8,211,10,202,13,197,18,194,26,193,40,193,183,194,198,197,207,202,213,211,216,224,218,16383,16383,151,117,131,117,111,119,94,125,82,135,74,148,71,165,75,185,85,198,99,206,117,210,136,211,142,211,147,209,149,206,151,202,151,195,193,286,191,294,188,301,182,306,175,310,167,311,160,310,153,306,148,301,144,294,143,286,144,278,147,272,153,266,159,263,167,262,175,263,182,266,188,272,191,278,193,286,16383,16383,93,286,92,294,88,301,83,306,76,310,68,311,60,310,54,306,48,301,45,294,44,286,45,278,48,272,53,266,60,263,68,262,76,263,83,266,88,272,92,278,93,286,16383,16383,210,82,196,63,182,48,167,39,150,33,132,31,102,37,80,53,66,77,58,106,55,137,209,137,208,152,205,165,202,176,
+26,19,19,14,64,0,64,0,19,14,11,9,64,0,11,9,2,7,97,104,64,0,142,103,97,104,142,103,111,119,97,104,111,119,94,125,97,104,94,125,82,135,97,104,82,135,74,148,97,104,74,148,74,109,85,198,91,224,75,185,75,185,91,224,65,219,75,185,65,219,71,165,71,165,74,109,74,148,26,167,30,148,31,193,31,193,30,148,40,131,31,193,40,131,45,210,45,210,40,131,55,118,45,210,55,118,65,219,65,219,55,118,74,109,65,219,74,109,71,165,148,16,143,11,224,0,224,0,143,11,135,8,224,0,135,8,123,7,147,209,224,225,142,211,142,211,224,225,136,211,117,210,136,211,121,225,117,210,121,225,99,206,99,206,121,225,91,224,99,206,91,224,85,198,224,8,211,10,224,0,224,0,211,10,202,13,224,0,202,13,151,38,151,38,202,13,197,18,151,38,197,18,151,103,151,103,197,18,151,117,151,103,151,117,142,103,142,103,151,117,131,117,142,103,131,117,111,119,64,0,97,104,37,31,64,0,37,31,32,25,64,0,32,25,26,19,224,225,147,209,149,206,224,225,149,206,151,202,224,225,151,202,151,195,224,225,151,195,202,213,224,225,202,213,211,216,224,225,211,216,224,218,193,40,193,183,151,195,151,195,193,183,194,198,151,195,194,198,197,207,151,195,194,26,193,40,224,225,121,225,136,211,151,117,197,18,194,26,151,117,194,26,151,195,151,25,148,16,224,0,151,25,224,0,151,38,224,0,123,7,123,0,202,213,151,195,197,207,64,0,2,7,2,0,
+266,59,253,44,242,34,234,29,228,26,222,25,216,28,216,31,215,33,216,38,217,44,218,49,220,55,221,61,247,151,249,159,252,180,252,186,250,202,245,214,236,223,224,228,208,230,189,227,169,216,147,196,123,165,99,123,98,123,133,252,205,278,211,300,139,273,146,296,148,306,151,315,153,324,156,332,158,340,155,342,143,337,131,333,116,329,98,325,76,320,76,312,85,312,92,311,99,309,103,306,104,301,104,293,103,290,103,286,93,257,45,239,40,218,87,234,23,0,65,0,78,41,88,72,98,97,109,117,121,137,137,159,152,177,167,191,180,200,190,203,198,202,203,199,207,194,209,188,209,175,207,161,206,155,204,150,185,78,182,66,178,54,175,41,173,31,172,23,174,13,177,5,183,0,190,-3,199,-4,211,-2,225,3,240,14,256,30,273,54,344,337,341,331,335,324,327,316,316,310,302,308,271,312,246,322,222,334,193,344,154,348,118,342,88,327,65,305,51,278,46,248,49,224,60,204,77,189,100,179,128,176,136,176,144,177,151,179,159,182,167,186,163,197,157,195,150,193,144,191,137,190,131,190,116,192,102,198,90,208,82,222,79,241,83,262,93,278,106,289,122,295,138,297,168,293,193,283,216,272,242,262,273,258,303,263,325,276,340,294,349,314,355,334,16383,16383,352,209,344,217,335,225,325,231,312,235,295,237,275,234,257,225,241,212,231,195,227,174,232,145,243,121,257,99,269,76,273,49,271,34,264,22,253,11,238,5,219,2,204,4,191,8,181,16,172,28,165,44,158,63,149,82,136,98,118,110,94,114,72,109,53,97,38,82,28,65,22,51,34,49,39,57,45,64,53,69,61,73,
+99,123,98,123,99,123,99,123,98,123,109,117,99,123,109,117,123,165,123,165,109,117,121,137,104,296,104,293,133,252,133,252,104,293,103,290,133,252,103,290,103,286,103,286,93,257,98,123,98,123,93,257,98,97,98,123,98,97,109,117,203,199,208,230,198,202,198,202,208,230,190,203,180,200,190,203,189,227,180,200,189,227,169,216,123,165,137,159,147,196,147,196,137,159,152,177,147,196,152,177,169,216,169,216,152,177,167,191,169,216,167,191,180,200,204,150,185,78,190,-3,204,150,190,-3,199,-4,204,150,199,-4,211,-2,204,150,211,-2,206,155,211,-2,216,31,215,33,215,33,224,228,211,-2,211,-2,224,228,209,181,211,-2,209,181,209,175,211,-2,209,175,208,168,224,228,215,33,216,38,224,228,216,38,217,44,224,228,217,44,218,49,224,228,218,49,220,55,224,228,220,55,221,61,224,228,221,61,247,151,224,228,247,151,236,223,209,188,209,181,224,228,209,188,224,228,208,230,209,188,208,230,207,194,208,230,189,227,190,203,249,159,250,166,250,202,250,202,250,166,251,173,250,202,251,173,252,186,252,186,251,173,252,180,247,151,249,159,250,202,247,151,250,202,245,214,247,151,245,214,236,223,218,27,225,3,220,26,220,26,225,3,222,25,228,26,222,25,225,3,228,26,225,3,240,14,256,30,273,54,266,59,256,30,266,59,253,44,256,30,253,44,242,34,256,30,242,34,240,14,234,29,228,26,240,14,234,29,240,14,242,34,225,3,218,27,216,28,225,3,216,28,216,31,225,3,216,31,211,-2,207,161,206,155,211,-2,207,161,211,-2,208,168,183,0,190,-3,185,78,183,0,185,78,182,66,183,0,182,66,178,54,183,0,178,54,177,5,175,41,173,31,174,13,175,41,174,13,177,5,175,41,177,5,178,54,65,0,78,41,87,234,87,234,78,41,88,72,87,234,88,72,93,257,93,257,88,72,98,97,45,239,40,218,87,234,45,239,87,234,93,257,85,312,92,311,98,325,98,325,92,311,99,309,98,325,99,309,116,329,116,329,99,309,103,306,116,329,103,306,104,301,104,301,104,299,133,252,133,252,104,299,104,296,76,320,76,312,85,312,76,320,85,312,98,325,151,315,153,324,155,342,155,342,153,324,156,332,155,342,156,332,158,340,133,252,139,273,143,337,143,337,139,273,146,296,143,337,146,296,155,342,155,342,146,296,148,306,155,342,148,306,151,315,133,252,143,337,131,333,133,252,131,333,116,329,133,252,116,329,104,301,103,286,98,123,133,252,139,273,133,252,205,278,139,273,205,278,211,300,65,0,87,234,23,0,174,13,173,31,172,23,208,230,203,199,207,194,121,137,137,159,123,165,
+344,337,341,331,335,324,327,316,316,310,302,308,271,312,246,322,222,334,193,344,154,348,118,342,88,327,65,305,51,278,46,248,49,224,60,204,77,189,100,179,128,176,136,176,144,177,151,179,159,182,167,186,163,197,157,195,150,193,144,191,137,190,131,190,116,192,102,198,90,208,82,222,79,241,83,262,93,278,106,289,122,295,138,297,168,293,193,283,216,272,242,262,273,258,303,263,325,276,340,294,349,314,355,334,16383,16383,352,209,344,217,335,225,325,231,312,235,295,237,275,234,257,225,241,212,231,195,227,174,232,145,243,121,257,99,269,76,273,49,271,34,264,22,253,11,238,5,219,2,204,4,191,8,181,16,172,28,165,44,158,63,149,82,136,98,118,110,94,114,72,109,53,97,38,82,28,65,22,51,34,49,39,57,45,64,53,69,61,73,69,74,75,73,81,70,87,65,92,58,97,49,102,39,108,29,114,20,122,11,132,3,144,-3,157,-9,172,-13,192,-15,215,-16,253,-11,285,1,311,22,329,47,335,76,329,103,316,127,300,149,287,169,281,186,283,197,287,205,294,211,302,214,310,215,316,215,322,214,328,211,335,207,343,200,314,0,314,331,292,331,292,78,291,78,118,309,103,331,35,331,35,0,57,0,57,252,58,252,247,0,16383,16383,292,22,257,22,57,289,57,309,91,309,292,41,483,153,480,178,471,200,456,217,437,229,414,233,389,229,370,217,356,199,347,177,344,152,347,128,355,107,370,89,389,78,414,74,437,78,457,89,471,106,480,128,483,153,16383,16383,444,152,443,127,439,108,433,95,424,87,413,84,402,87,393,95,387,108,384,127,383,152,384,178,388,197,394,211,402,219,412,222,424,219,433,211,439,197,443,178,444,152,16383,16383,481,0,481,44,346,44,346,0,16383,16383,278,107,135,331,45,331,45,321,53,321,71,318,75,316,80,313,86,308,92,301,99,291,107,280,107,112,104,78,98,47,88,26,71,17,64,21,53,43,45,53,31,57,24,56,17,53,10,48,5,40,3,30,6,14,13,4,24,-2,38,-5,55,-6,91,2,113,27,124,60,128,97,129,131,129,246,291,-5,300,-5,300,186,301,219,303,253,309,284,319,305,335,314,343,309,348,300,354,288,362,278,376,274,383,275,390,278,397,283,402,291,403,301,401,317,394,327,383,334,369,337,353,338,316,329,
+102,198,90,208,100,179,100,179,90,208,82,222,100,179,82,222,77,189,77,189,82,222,79,241,88,327,79,241,83,262,88,327,83,262,93,278,154,348,138,297,168,293,154,348,168,293,193,344,193,344,168,293,193,283,193,344,193,283,222,334,222,334,193,283,216,272,222,334,216,272,242,262,222,334,242,262,246,322,246,322,242,262,273,258,246,322,273,258,271,312,271,312,273,258,302,308,316,310,302,308,303,263,316,310,303,263,325,276,355,334,344,337,349,314,349,314,344,337,341,331,349,314,341,331,340,294,340,294,341,331,335,324,340,294,335,324,327,316,327,316,316,310,325,276,327,316,325,276,340,294,302,308,273,258,303,263,295,237,275,234,283,197,283,197,275,234,281,186,285,1,281,186,275,234,285,1,275,234,273,49,273,49,271,34,285,1,285,1,271,34,264,22,285,1,264,22,253,-11,253,-11,264,22,253,11,253,-11,253,11,238,5,325,231,312,235,316,215,316,215,312,235,310,215,302,214,310,215,312,235,302,214,312,235,295,237,295,237,283,197,287,205,295,237,287,205,294,211,295,237,294,211,302,214,343,200,352,209,344,217,343,200,344,217,335,225,343,200,335,225,335,207,316,215,322,214,325,231,325,231,322,214,328,211,325,231,328,211,335,225,335,225,328,211,335,207,335,76,329,103,329,47,329,47,329,103,316,127,329,47,316,127,311,22,311,22,316,127,300,149,311,22,300,149,287,169,287,169,281,186,285,1,287,169,285,1,311,22,238,5,219,2,253,-11,253,-11,219,2,215,-16,215,-16,219,2,204,4,215,-16,204,4,192,-15,192,-15,204,4,191,8,192,-15,191,8,181,16,93,278,106,289,118,342,118,342,106,289,122,295,118,342,122,295,154,348,154,348,122,295,138,297,65,305,51,278,60,204,65,305,60,204,77,189,65,305,77,189,79,241,65,305,79,241,88,327,51,278,46,248,49,224,51,278,49,224,60,204,157,195,150,193,151,179,151,179,150,193,144,191,151,179,144,191,144,177,144,177,144,191,137,190,144,177,137,190,136,176,136,176,137,190,131,190,128,176,136,176,131,190,128,176,131,190,116,192,128,176,116,192,102,198,128,176,102,198,100,179,159,182,167,186,163,197,159,182,163,197,157,195,159,182,157,195,151,179,94,114,72,109,75,73,75,73,72,109,69,74,61,73,69,74,72,109,61,73,72,109,53,97,53,97,38,82,39,57,53,97,39,57,45,64,53,97,45,64,53,69,53,97,53,69,61,73,34,49,39,57,38,82,34,49,38,82,28,65,34,49,28,65,22,51,81,70,87,65,94,114,94,114,87,65,92,58,94,114,92,58,97,49,97,49,102,39,118,110,118,110,102,39,108,29,118,110,108,29,114,20,122,11,132,3,136,98,136,98,132,3,144,-3,136,98,144,-3,149,82,149,82,144,-3,157,-9,149,82,157,-9,158,63,158,63,157,-9,172,-13,158,63,172,-13,165,44,165,44,172,-13,172,28,181,16,172,28,172,-13,181,16,172,-13,192,-15,118,110,114,20,122,11,118,110,122,11,136,98,118,110,94,114,97,49,231,195,232,145,241,212,241,212,232,145,243,121,241,212,243,121,257,225,257,225,243,121,257,99,257,225,257,99,275,234,275,234,257,99,269,76,275,234,269,76,273,49,232,145,231,195,227,174,94,114,75,73,81,70,88,327,93,278,118,342,
+
+
+406,57,402,52,396,46,384,36,379,35,361,47,353,78,347,119,335,159,309,190,309,191,331,203,348,218,361,236,368,256,371,277,367,300,355,321,335,337,308,348,272,352,206,304,193,317,178,329,160,339,140,345,118,348,89,344,63,335,43,319,30,297,25,270,31,247,45,229,62,214,76,197,82,175,79,163,73,153,64,144,54,138,45,134,49,123,74,132,97,145,115,161,128,180,132,200,126,227,112,245,95,259,81,275,75,299,76,308,80,318,87,325,97,330,108,332,133,322,149,297,157,265,161,231,162,203,162,165,160,123,156,84,149,56,137,45,129,47,116,54,100,62,86,70,76,75,30,2,41,-3,51,9,56,14,60,17,63,20,70,17,83,11,97,3,111,-4,122,-10,149,19,173,53,193,88,209,125,220,161,257,170,269,162,276,149,280,132,282,113,283,94,284,70,289,44,298,21,313,1,333,-10,339,-10,355,0,372,11,388,24,403,36,415,47,16383,16383,222,179,223,189,223,200,224,212,224,233,223,242,222,253,220,265,217,276,214,286,225,297,235,304,245,310,255,313,266,314,283,310,296,302,305,291,310,278,312,266,310,246,303,226,289,208,268,192,238,182,356,0,248,142,271,153,290,167,303,186,311,208,314,233,308,271,291,298,265,317,232,328,195,331,35,331,35,0,118,0,118,136,155,136,252,0,16383,16383,246,302,262,293,275,281,284,268,290,251,292,232,290,214,284,197,274,182,261,170,246,161,16383,16383,224,160,218,159,212,159,207,158,201,158,196,157,118,157,118,309,203,309,208,308,214,307,224,305,16383,16383,313,22,264,22,181,136,184,136,186,135,206,135,213,136,219,136,225,137,16383,16383,96,22,57,22,57,309,96,309,382,0,382,11,365,13,350,18,337,26,326,36,314,47,382,113,368,127,300,61,284,80,254,120,224,158,250,166,274,178,295,196,309,217,315,244,306,281,282,306,250,323,213,331,177,334,35,334,35,321,57,320,73,315,85,307,92,292,94,269,94,65,92,42,85,27,73,18,57,14,35,12,35,0,197,0,197,12,175,14,158,18,147,27,140,42,138,65,138,152,145,152,149,151,162,151,165,152,172,152,270,31,200,-35,213,-49,282,17,295,0,16383,16383,138,283,140,298,146,308,156,314,168,317,182,318,212,315,235,307,251,293,261,271,264,240,259,207,244,186,222,174,194,168,163,166,158,166,153,167,
+82,175,79,163,82,175,82,175,79,163,97,145,82,175,97,145,95,259,82,175,95,259,81,275,82,175,81,275,76,197,76,197,81,275,75,299,63,335,75,299,76,308,63,335,76,308,89,344,89,344,76,308,80,318,89,344,80,318,87,325,118,348,108,332,133,322,118,348,133,322,140,345,140,345,133,322,149,297,140,345,149,297,160,339,160,339,149,297,157,265,160,339,157,265,161,231,162,165,160,123,173,53,173,53,160,123,156,84,173,53,156,84,149,19,149,19,156,84,149,56,149,19,149,56,137,45,137,45,129,47,149,19,149,19,129,47,122,-10,220,161,257,170,222,179,220,161,222,179,222,253,220,161,222,253,220,265,220,161,220,265,217,276,220,161,217,276,214,286,220,161,214,286,209,125,222,179,223,189,223,242,223,242,223,189,223,200,223,242,223,200,224,233,224,233,223,200,224,212,224,233,224,212,224,223,206,304,193,317,193,88,193,88,193,317,178,329,193,88,178,329,173,53,173,53,178,329,162,203,63,20,70,17,76,75,76,75,70,17,83,11,76,75,83,11,86,70,86,70,83,11,97,3,86,70,97,3,100,62,100,62,97,3,111,-4,100,62,111,-4,116,54,116,54,111,-4,122,-10,116,54,122,-10,129,47,76,75,30,2,41,-3,76,75,41,-3,46,3,76,75,46,3,51,9,76,75,51,9,56,14,76,75,56,14,60,17,76,75,60,17,63,20,97,330,108,332,118,348,97,330,118,348,89,344,97,330,89,344,87,325,63,335,43,319,45,229,63,335,45,229,62,214,63,335,62,214,76,197,63,335,76,197,75,299,31,247,45,229,43,319,31,247,43,319,30,297,31,247,30,297,25,270,95,259,97,145,112,245,112,245,97,145,115,161,112,245,115,161,126,227,126,227,115,161,128,180,126,227,128,180,132,200,74,132,97,145,79,163,74,132,79,163,73,153,74,132,73,153,64,144,74,132,64,144,54,138,74,132,54,138,49,123,54,138,45,134,49,123,276,149,289,208,269,162,269,162,289,208,268,192,269,162,268,192,257,170,257,170,268,192,238,182,235,304,245,310,272,352,272,352,245,310,255,313,272,352,255,313,266,314,266,314,283,310,272,352,272,352,283,310,308,348,312,266,331,203,335,337,335,337,331,203,348,218,335,337,348,218,355,321,355,321,348,218,361,236,355,321,361,236,367,300,367,300,361,236,368,256,367,300,368,256,371,277,310,278,312,266,335,337,310,278,335,337,308,348,310,278,308,348,305,291,308,348,283,310,296,302,308,348,296,302,305,291,310,246,303,226,309,191,310,246,309,191,331,203,310,246,331,203,312,266,309,190,309,191,303,226,309,190,303,226,313,1,309,190,313,1,335,159,402,52,396,46,403,36,403,36,396,46,390,41,403,36,390,41,388,24,388,24,390,41,384,36,388,24,384,36,379,35,379,35,361,47,372,11,372,11,361,47,355,0,313,1,333,-10,335,159,335,159,333,-10,339,-10,335,159,339,-10,347,119,347,119,339,-10,355,0,347,119,355,0,353,78,353,78,355,0,361,47,283,94,284,70,289,208,289,208,284,70,289,44,289,208,289,44,303,226,303,226,289,44,298,21,303,226,298,21,313,1,276,149,280,132,289,208,289,208,280,132,282,113,289,208,282,113,283,94,406,57,402,52,403,36,406,57,403,36,415,47,379,35,372,11,388,24,272,352,206,304,214,286,272,352,214,286,225,297,272,352,225,297,235,304,206,304,193,88,209,125,206,304,209,125,214,286,161,231,162,203,178,329,161,231,178,329,160,339,222,179,257,170,238,182,162,165,173,53,162,203,222,179,223,242,222,253,
+429,110,429,143,125,143,121,145,119,147,117,150,117,155,119,161,123,167,132,176,141,186,149,195,165,215,155,224,134,202,112,180,89,160,63,143,36,129,36,124,63,110,89,93,112,73,134,51,154,29,164,39,157,49,149,59,140,68,132,78,123,86,120,89,118,92,116,96,116,99,117,102,119,105,122,107,126,109,129,110,225,212,203,232,181,254,162,278,144,303,130,331,125,331,111,303,94,278,74,254,52,233,30,213,40,203,49,210,69,226,79,235,88,243,90,246,93,248,97,250,100,251,103,250,109,244,111,238,111,-77,144,-77,144,237,145,242,146,246,148,248,151,250,157,250,159,249,168,243,177,234,187,226,197,217,206,209,216,202,428,129,
+121,145,119,147,119,105,119,105,119,147,117,150,119,105,117,150,117,102,117,102,117,150,117,153,116,99,112,180,112,73,112,73,112,180,89,160,112,73,89,160,89,93,89,93,89,160,63,143,89,93,63,143,63,110,63,110,63,143,36,129,63,110,36,129,36,124,155,224,134,202,141,186,155,224,141,186,149,195,155,224,149,195,157,205,155,224,157,205,165,215,134,202,112,180,118,158,134,202,118,158,119,161,134,202,119,161,121,164,134,202,121,164,123,167,134,202,123,167,132,176,134,202,132,176,141,186,117,155,118,158,112,180,117,155,112,180,117,153,140,68,132,78,134,51,134,51,132,78,123,86,134,51,123,86,120,89,129,143,125,143,126,109,129,143,126,109,129,110,129,143,129,110,429,110,129,143,429,110,429,143,122,107,126,109,125,143,122,107,125,143,121,145,122,107,121,145,119,105,154,29,164,39,157,49,154,29,157,49,149,59,154,29,149,59,140,68,154,29,140,68,134,51,116,96,116,99,112,73,116,96,112,73,117,94,117,94,112,73,134,51,117,94,134,51,118,92,118,92,134,51,120,89,117,102,117,153,116,99,117,153,112,180,116,99,
+225,212,203,232,181,254,162,278,144,303,130,331,125,331,111,303,94,278,74,254,52,233,30,213,40,203,49,210,69,226,79,235,88,243,90,246,93,248,97,250,100,251,103,250,109,244,111,238,111,-77,144,-77,144,237,145,242,146,246,148,248,151,250,157,250,159,249,168,243,177,234,187,226,197,217,206,209,216,202,428,129,400,143,375,160,352,180,330,201,310,224,300,214,314,194,323,185,332,175,340,166,343,164,345,161,347,159,347,157,348,154,347,151,341,145,338,144,334,143,35,143,35,110,334,110,339,109,343,108,345,106,347,103,347,97,346,95,340,86,331,77,322,67,314,58,306,48,299,38,309,28,330,51,351,72,375,92,
+90,246,93,248,94,278,94,278,93,248,95,249,94,278,95,249,111,303,111,303,95,249,97,250,111,303,97,250,100,251,100,251,103,250,111,303,111,303,103,250,106,247,111,303,106,247,109,244,110,241,111,238,111,303,111,303,111,238,125,331,125,331,111,238,144,-77,125,331,144,-77,130,331,130,331,144,-77,144,237,130,331,144,237,144,303,144,303,144,237,145,242,144,303,145,242,146,246,88,243,90,246,94,278,88,243,94,278,79,235,79,235,94,278,74,254,79,235,74,254,69,226,69,226,74,254,59,218,52,233,30,213,40,203,52,233,40,203,49,210,52,233,49,210,59,218,52,233,59,218,74,254,146,246,148,248,162,278,162,278,148,248,151,250,162,278,151,250,154,250,154,250,157,250,162,278,162,278,157,250,159,249,162,278,159,249,162,247,187,226,197,217,203,232,203,232,197,217,206,209,203,232,206,209,225,212,225,212,206,209,216,202,181,254,162,278,162,247,181,254,162,247,165,245,181,254,165,245,168,243,181,254,168,243,177,234,181,254,177,234,187,226,181,254,187,226,203,232,111,238,111,-77,144,-77,144,303,146,246,162,278,111,303,109,244,110,241,
+428,129,400,143,375,160,352,180,330,201,310,224,300,214,314,194,323,185,332,175,340,166,343,164,345,161,347,159,347,157,348,154,347,151,341,145,338,144,334,143,35,143,35,110,334,110,339,109,343,108,345,106,347,103,347,97,346,95,340,86,331,77,322,67,314,58,306,48,299,38,309,28,330,51,351,72,375,92,400,110,428,124,216,50,206,43,186,27,168,9,165,7,163,5,160,3,158,3,156,2,153,3,147,9,145,12,145,331,112,331,112,16,111,11,110,8,105,3,99,3,96,4,90,8,88,10,78,19,69,28,49,44,40,51,30,41,53,20,74,-1,94,-24,111,-49,126,-77,131,-77,145,-49,162,-24,182,-1,203,20,225,41,444,129,417,143,391,160,
+347,97,351,72,347,100,347,100,351,72,348,154,348,154,351,72,352,180,352,180,351,72,375,92,352,180,375,92,375,160,375,160,375,92,400,110,375,160,400,110,400,143,400,143,400,110,428,124,400,143,428,124,428,129,352,180,330,201,332,175,352,180,332,175,340,166,352,180,340,166,343,164,352,180,343,164,345,161,352,180,345,161,347,159,352,180,347,159,347,157,352,180,347,157,348,154,300,214,307,204,310,224,310,224,307,204,314,194,310,224,314,194,330,201,330,201,314,194,323,185,330,201,323,185,332,175,35,143,334,110,334,143,338,144,334,143,339,109,338,144,339,109,341,145,341,145,339,109,343,108,341,145,343,108,344,148,344,148,343,108,345,106,344,148,345,106,347,151,347,151,345,106,347,103,347,151,347,103,347,100,322,67,330,51,331,77,331,77,330,51,351,72,331,77,351,72,340,86,340,86,351,72,342,89,351,72,347,97,346,95,351,72,346,95,344,92,351,72,344,92,342,89,314,58,306,48,309,28,314,58,309,28,330,51,314,58,330,51,322,67,348,154,347,151,347,100,334,110,35,143,35,110,334,143,334,110,339,109,309,28,306,48,299,38,
+216,50,206,43,186,27,168,9,165,7,163,5,160,3,158,3,156,2,153,3,147,9,145,12,145,331,112,331,112,16,111,11,110,8,105,3,99,3,96,4,90,8,88,10,78,19,69,28,49,44,40,51,30,41,53,20,74,-1,94,-24,111,-49,126,-77,131,-77,145,-49,162,-24,182,-1,203,20,225,41,444,129,417,143,391,160,368,180,346,201,325,224,315,214,322,204,330,194,339,185,348,175,359,164,361,161,363,157,363,154,362,151,360,148,357,145,354,144,350,143,108,143,104,145,102,147,100,150,100,155,101,158,107,167,116,176,125,186,133,195,141,205,148,215,138,224,96,180,72,160,47,143,19,129,19,124,
+110,8,107,5,111,-49,111,-49,107,5,105,3,111,-49,105,3,102,3,102,3,99,3,111,-49,111,-49,99,3,96,4,111,-49,96,4,94,-24,94,-24,96,4,93,6,94,-24,93,6,90,8,150,6,147,9,162,-24,162,-24,147,9,145,12,162,-24,145,12,145,-49,145,-49,145,12,145,16,145,16,145,331,131,-77,131,-77,145,331,126,-77,145,331,112,331,126,-77,126,-77,112,331,112,16,126,-77,112,16,111,-49,111,-49,112,16,111,11,111,-49,111,11,110,8,163,5,160,3,162,-24,162,-24,160,3,158,3,162,-24,158,3,156,2,156,2,153,3,162,-24,162,-24,153,3,150,6,186,27,177,18,182,-1,182,-1,177,18,168,9,182,-1,168,9,165,7,206,43,196,35,203,20,206,43,203,20,225,41,206,43,225,41,216,50,186,27,182,-1,203,20,186,27,203,20,196,35,163,5,162,-24,182,-1,163,5,182,-1,165,7,90,8,88,10,94,-24,94,-24,88,10,78,19,94,-24,78,19,74,-1,74,-1,78,19,69,28,74,-1,69,28,59,36,53,20,74,-1,59,36,53,20,59,36,49,44,53,20,49,44,40,51,53,20,40,51,30,41,145,-49,145,16,131,-77,
+444,129,417,143,391,160,368,180,346,201,325,224,315,214,322,204,330,194,339,185,348,175,359,164,361,161,363,157,363,154,362,151,360,148,357,145,354,144,350,143,108,143,104,145,102,147,100,150,100,155,101,158,107,167,116,176,125,186,133,195,141,205,148,215,138,224,96,180,72,160,47,143,19,129,19,124,47,110,72,93,95,73,117,51,137,29,147,39,133,59,124,68,115,78,104,89,102,92,100,94,100,96,99,99,100,102,103,105,109,109,113,110,350,110,355,109,358,108,361,106,363,100,362,97,362,95,356,86,347,77,338,67,330,58,322,48,315,38,325,28,345,51,367,72,391,92,417,110,444,124,225,246,203,266,182,288,162,312,145,337,131,365,126,365,112,337,94,312,74,288,53,267,31,247,40,237,50,244,70,260,79,269,88,277,93,282,96,283,100,285,104,284,107,281,111,275,112,272,112,-16,111,-21,110,-25,107,-28,105,-29,102,-30,93,-27,90,-25,88,-22,78,-13,69,-5,59,2,49,10,40,17,30,7,53,-12,74,-34,94,-58,111,-83,126,-111,131,-111,145,-83,162,-58,181,-34,203,-12,225,7,215,17,206,10,196,2,186,-5,163,-28,160,-29,158,-30,156,-30,153,-29,150,-27,147,-24,145,-20,145,276,147,280,149,282,152,284,157,284,160,283,169,277,178,268,187,260,197,251,206,243,216,236,428,-54,
+104,145,102,147,103,105,103,105,102,147,100,150,103,105,100,150,100,102,100,102,100,150,100,153,99,99,96,180,95,73,95,73,96,180,72,160,95,73,72,160,72,93,72,93,72,160,47,143,72,93,47,143,47,110,47,110,47,143,19,129,47,110,19,129,19,124,138,224,117,202,125,186,138,224,125,186,133,195,138,224,133,195,141,205,138,224,141,205,148,215,117,202,96,180,101,158,117,202,101,158,103,161,117,202,103,161,105,164,117,202,105,164,107,167,117,202,107,167,116,176,117,202,116,176,125,186,100,155,101,158,96,180,100,155,96,180,100,153,124,68,115,78,117,51,117,51,115,78,107,86,117,51,107,86,104,89,137,29,147,39,140,49,137,29,140,49,133,59,137,29,133,59,124,68,137,29,124,68,117,51,363,100,367,72,363,154,363,154,367,72,368,180,368,180,367,72,391,92,368,180,391,92,391,160,391,160,391,92,417,110,391,160,417,110,417,143,417,143,417,110,444,124,417,143,444,124,444,129,368,180,346,201,348,175,368,180,348,175,357,166,368,180,357,166,359,164,368,180,359,164,361,161,368,180,361,161,362,159,368,180,362,159,363,157,368,180,363,157,363,154,315,214,322,204,325,224,325,224,322,204,330,194,325,224,330,194,346,201,346,201,330,194,339,185,346,201,339,185,348,175,350,110,355,109,350,143,354,144,350,143,355,109,354,144,355,109,357,145,357,145,355,109,358,108,357,145,358,108,360,148,360,148,358,108,361,106,360,148,361,106,362,151,362,151,361,106,362,103,362,151,362,103,363,100,338,67,345,51,347,77,347,77,345,51,367,72,347,77,367,72,356,86,356,86,367,72,358,89,362,97,362,95,367,72,362,97,367,72,363,100,360,92,358,89,367,72,360,92,367,72,362,95,330,58,322,48,325,28,330,58,325,28,345,51,330,58,345,51,338,67,363,154,362,151,363,100,350,110,350,143,113,110,113,110,350,143,113,143,113,110,113,143,109,109,108,143,104,145,106,107,108,143,106,107,109,109,108,143,109,109,113,143,100,96,99,99,95,73,100,96,95,73,100,94,100,94,95,73,117,51,100,94,117,51,102,92,102,92,117,51,104,89,100,102,100,153,99,99,104,145,103,105,106,107,325,28,322,48,315,38,100,153,96,180,99,99,
+225,246,203,266,182,288,162,312,145,337,131,365,126,365,112,337,94,312,74,288,53,267,31,247,40,237,50,244,70,260,79,269,88,277,93,282,96,283,100,285,104,284,107,281,111,275,112,272,112,-16,111,-21,110,-25,107,-28,105,-29,102,-30,93,-27,90,-25,88,-22,78,-13,69,-5,59,2,49,10,40,17,30,7,53,-12,74,-34,94,-58,111,-83,126,-111,131,-111,145,-83,162,-58,181,-34,203,-12,225,7,215,17,206,10,196,2,186,-5,163,-28,160,-29,158,-30,156,-30,153,-29,150,-27,147,-24,145,-20,145,276,147,280,149,282,152,284,157,284,160,283,169,277,178,268,187,260,197,251,206,243,216,236,428,-54,118,271,115,274,111,280,110,282,110,285,111,287,111,288,112,290,113,291,115,292,117,294,121,295,124,296,153,296,166,297,178,298,190,300,190,315,182,314,173,313,125,313,103,315,81,318,60,324,39,331,35,328,43,306,48,285,51,263,53,241,54,219,53,210,53,193,52,184,51,176,65,176,68,188,70,214,70,243,72,249,73,251,76,254,77,254,78,255,83,255,85,254,88,254,92,252,404,-77,425,331,403,324,382,318,360,315,338,313,289,313,281,314,272,315,272,300,284,298,297,297,309,296,339,296,342,295,346,294,348,292,350,291,351,290,352,288,353,287,353,282,352,280,348,274,345,271,
+69,-5,74,-34,78,-13,78,-13,74,-34,94,-58,78,-13,94,-58,88,-22,88,-22,94,-58,90,-25,91,280,93,282,94,312,94,312,93,282,96,283,94,312,96,283,112,337,112,337,96,283,98,284,112,337,98,284,100,285,100,285,104,284,112,337,112,337,104,284,107,281,112,337,107,281,109,278,110,-25,107,-28,111,-83,111,-83,107,-28,105,-29,111,-83,105,-29,102,-30,102,-30,99,-29,111,-83,111,-83,99,-29,96,-28,111,-83,96,-28,94,-58,94,-58,96,-28,93,-27,94,-58,93,-27,90,-25,109,278,111,275,112,337,112,337,111,275,112,272,112,272,126,-111,126,365,126,365,126,-111,131,-111,126,365,131,-111,131,365,131,365,131,-111,145,-83,131,365,145,-83,145,271,145,271,145,-83,145,-17,88,277,91,280,94,312,88,277,94,312,79,269,79,269,94,312,74,288,79,269,74,288,70,260,70,260,74,288,60,252,53,267,31,247,40,237,53,267,40,237,50,244,53,267,50,244,60,252,53,267,60,252,74,288,147,280,149,282,162,312,162,312,149,282,152,284,162,312,152,284,155,284,155,284,157,284,162,312,162,312,157,284,160,283,162,312,160,283,163,281,187,260,197,251,203,266,203,266,197,251,206,243,203,266,206,243,225,246,225,246,206,243,216,236,182,288,162,312,163,281,182,288,163,281,166,279,182,288,166,279,169,277,182,288,169,277,178,268,182,288,178,268,187,260,182,288,187,260,203,266,145,337,131,365,145,271,145,337,145,271,145,276,145,337,145,276,147,280,145,337,147,280,162,312,163,-28,160,-29,162,-58,162,-58,160,-29,158,-30,162,-58,158,-30,156,-30,156,-30,153,-29,162,-58,162,-58,153,-29,150,-27,162,-58,150,-27,147,-24,186,-5,177,-14,181,-34,181,-34,177,-14,168,-23,181,-34,168,-23,165,-26,206,10,196,2,203,-12,206,10,203,-12,225,7,206,10,225,7,215,17,186,-5,181,-34,203,-12,186,-5,203,-12,196,2,163,-28,162,-58,181,-34,163,-28,181,-34,165,-26,145,-20,145,-17,145,-83,145,-20,145,-83,162,-58,145,-20,162,-58,147,-24,112,-16,111,-21,111,-83,112,-16,111,-83,126,-111,112,-16,126,-111,112,272,59,2,49,10,53,-12,59,2,53,-12,74,-34,59,2,74,-34,69,-5,40,17,30,7,53,-12,40,17,53,-12,49,10,110,-25,111,-83,111,-21,112,337,112,272,126,365,
+428,-54,118,271,115,274,111,280,110,282,110,285,111,287,111,288,112,290,113,291,115,292,117,294,121,295,124,296,153,296,166,297,178,298,190,300,190,315,182,314,173,313,125,313,103,315,81,318,60,324,39,331,35,328,43,306,48,285,51,263,53,241,54,219,53,210,53,193,52,184,51,176,65,176,68,188,70,214,70,243,72,249,73,251,76,254,77,254,78,255,83,255,85,254,88,254,92,252,404,-77,425,331,403,324,382,318,360,315,338,313,289,313,281,314,272,315,272,300,284,298,297,297,309,296,339,296,342,295,346,294,348,292,350,291,351,290,352,288,353,287,353,282,352,280,348,274,345,271,35,-54,59,-77,372,252,373,253,375,254,377,254,380,255,385,255,387,254,388,254,388,253,390,251,391,249,392,246,392,226,393,214,395,188,397,176,411,176,411,185,410,193,410,241,412,263,415,285,421,307,428,328,
+48,285,51,263,60,324,60,324,51,263,53,241,60,324,53,241,54,219,54,219,53,210,65,176,65,176,53,210,53,201,65,176,53,201,53,193,60,324,39,331,43,306,60,324,43,306,48,285,77,254,78,255,81,318,81,318,78,255,79,255,81,318,79,255,80,255,80,255,83,255,81,318,81,318,83,255,103,315,81,318,60,324,71,246,81,318,71,246,72,249,81,318,72,249,73,251,81,318,73,251,75,253,81,318,75,253,76,254,81,318,76,254,77,254,65,176,68,188,70,243,70,243,68,188,69,201,70,243,69,201,70,239,70,239,69,201,70,214,70,239,70,214,70,226,60,324,54,219,65,176,60,324,65,176,70,243,60,324,70,243,71,246,52,184,51,176,65,176,52,184,65,176,53,193,103,315,92,252,110,282,103,315,110,282,110,284,110,284,110,285,103,315,103,315,110,285,111,287,103,315,111,287,111,288,103,315,83,255,85,254,103,315,85,254,88,254,103,315,88,254,90,253,103,315,90,253,92,252,103,315,111,288,125,313,125,313,111,288,112,290,125,313,112,290,113,291,113,291,115,292,125,313,125,313,115,292,117,294,125,313,117,294,121,295,147,313,127,296,140,296,147,313,140,296,153,296,147,313,147,312,125,313,147,313,125,313,127,296,165,313,166,297,173,313,173,313,166,297,178,298,173,313,178,298,182,314,182,314,178,298,190,300,182,314,190,300,190,315,156,313,147,312,147,313,156,313,147,313,153,296,156,313,153,296,166,297,156,313,166,297,165,313,124,296,127,296,125,313,124,296,125,313,121,295,428,-54,118,271,404,-77,404,-77,118,271,115,274,404,-77,115,274,92,252,92,252,115,274,113,277,92,252,113,277,111,280,43,306,39,331,35,328,92,252,111,280,110,282,
+425,331,403,324,382,318,360,315,338,313,289,313,281,314,272,315,272,300,284,298,297,297,309,296,339,296,342,295,346,294,348,292,350,291,351,290,352,288,353,287,353,282,352,280,348,274,345,271,35,-54,59,-77,372,252,373,253,375,254,377,254,380,255,385,255,387,254,388,254,388,253,390,251,391,249,392,246,392,226,393,214,395,188,397,176,411,176,411,185,410,193,410,241,412,263,415,285,421,307,428,328,428,-74,421,-53,415,-31,412,-9,410,12,410,60,411,68,411,76,397,77,395,65,392,26,392,7,391,4,390,2,387,-1,380,-1,377,0,373,0,372,2,59,331,35,307,345,-17,348,-20,352,-26,353,-28,353,-33,352,-34,351,-36,350,-36,346,-40,342,-41,335,-41,322,-42,309,-42,297,-43,284,-45,272,-46,272,-60,281,-60,289,-59,338,-59,360,-61,382,-65,403,-70,425,-77,428,307,404,331,92,2,90,0,88,0,
+272,315,272,315,281,314,281,314,272,315,284,298,281,314,284,298,289,313,289,313,284,298,297,297,289,313,297,297,298,313,298,313,297,297,309,296,298,313,309,296,307,313,307,313,309,296,315,313,338,313,315,313,322,296,338,313,322,296,335,296,375,254,377,254,382,318,382,318,377,254,380,255,382,318,380,255,382,255,382,255,384,255,403,324,403,324,384,255,385,255,403,324,385,255,387,254,353,285,353,284,360,315,360,315,353,284,372,252,360,315,372,252,382,318,382,318,372,252,373,253,382,318,373,253,375,254,372,252,353,284,353,282,372,252,353,282,352,280,372,252,352,280,350,277,372,252,350,277,348,274,372,252,348,274,345,271,372,252,345,271,59,-77,410,193,410,201,403,324,403,324,410,201,410,210,403,324,410,210,410,219,410,219,410,241,403,324,403,324,410,241,412,263,403,324,412,263,415,285,403,324,415,285,425,331,425,331,415,285,421,307,425,331,421,307,428,328,395,188,397,176,403,324,403,324,397,176,411,176,403,324,411,176,410,193,410,193,411,176,411,185,403,324,387,254,388,254,403,324,388,254,388,253,403,324,388,253,390,251,403,324,390,251,391,249,403,324,391,249,392,246,403,324,392,246,392,243,403,324,392,243,392,239,403,324,392,239,392,226,403,324,392,226,393,214,403,324,393,214,394,201,403,324,394,201,395,188,403,324,382,318,382,255,360,315,338,313,339,296,360,315,339,296,342,295,360,315,342,295,346,294,360,315,346,294,348,292,360,315,348,292,350,291,360,315,350,291,351,290,360,315,351,290,352,288,360,315,352,288,353,287,360,315,353,287,353,285,335,296,339,296,338,313,315,313,309,296,322,296,59,-77,345,271,35,-54,284,298,272,315,272,300,
+428,-74,421,-53,415,-31,412,-9,410,12,410,60,411,68,411,76,397,77,395,65,392,26,392,7,391,4,390,2,387,-1,380,-1,377,0,373,0,372,2,59,331,35,307,345,-17,348,-20,352,-26,353,-28,353,-33,352,-34,351,-36,350,-36,346,-40,342,-41,335,-41,322,-42,309,-42,297,-43,284,-45,272,-46,272,-60,281,-60,289,-59,338,-59,360,-61,382,-65,403,-70,425,-77,428,307,404,331,92,2,90,0,88,0,85,-1,77,-1,76,0,75,0,73,2,72,4,70,10,70,39,68,65,65,77,51,76,53,60,53,43,54,35,53,12,51,-9,48,-31,43,-53,35,-74,39,-77,60,-70,81,-65,103,-61,125,-59,173,-59,182,-60,190,-60,190,-46,178,-45,166,-43,153,-42,140,-42,127,-41,121,-41,117,-40,113,-36,112,-36,111,-34,111,-33,110,-32,
+335,-41,322,-42,338,-59,338,-59,322,-42,315,-59,307,-59,315,-59,309,-42,307,-59,309,-42,298,-59,298,-59,309,-42,297,-43,298,-59,297,-43,289,-59,289,-59,297,-43,284,-45,289,-59,284,-45,281,-60,281,-60,284,-45,272,-46,281,-60,272,-46,272,-60,322,-42,309,-42,315,-59,353,-33,352,-34,360,-61,360,-61,352,-34,351,-36,360,-61,351,-36,350,-36,372,2,59,331,345,-17,372,2,345,-17,348,-20,372,2,348,-20,350,-23,372,2,350,-23,352,-26,372,2,352,-26,353,-28,372,2,353,-28,353,-30,372,2,353,-30,360,-61,372,2,360,-61,382,-65,372,2,382,-65,373,0,387,-1,385,-1,403,-70,403,-70,385,-1,384,-1,403,-70,384,-1,382,-1,382,-1,380,-1,382,-65,382,-65,380,-1,377,0,382,-65,377,0,375,0,360,-61,353,-30,353,-32,360,-61,353,-32,353,-33,393,39,392,26,403,-70,403,-70,392,26,392,14,403,-70,392,14,392,10,415,-31,412,-9,403,-70,403,-70,412,-9,410,12,403,-70,410,12,410,35,410,35,410,43,403,-70,403,-70,410,43,410,52,403,-70,410,52,410,60,411,76,397,77,403,-70,411,76,403,-70,410,60,411,76,410,60,411,68,403,-70,397,77,395,65,403,-70,395,65,394,52,403,-70,394,52,393,39,403,-70,392,10,392,7,403,-70,392,7,391,4,403,-70,391,4,390,2,403,-70,390,2,388,0,403,-70,388,0,387,-1,382,-1,382,-65,403,-70,425,-77,428,-74,421,-53,425,-77,421,-53,415,-31,425,-77,415,-31,403,-70,360,-61,350,-36,348,-38,360,-61,348,-38,346,-40,360,-61,346,-40,342,-41,360,-61,342,-41,339,-41,360,-61,339,-41,338,-59,339,-41,335,-41,338,-59,345,-17,59,331,35,307,373,0,382,-65,375,0,
+428,307,404,331,92,2,90,0,88,0,85,-1,77,-1,76,0,75,0,73,2,72,4,70,10,70,39,68,65,65,77,51,76,53,60,53,43,54,35,53,12,51,-9,48,-31,43,-53,35,-74,39,-77,60,-70,81,-65,103,-61,125,-59,173,-59,182,-60,190,-60,190,-46,178,-45,166,-43,153,-42,140,-42,127,-41,121,-41,117,-40,113,-36,112,-36,111,-34,111,-33,110,-32,110,-28,111,-26,115,-20,118,-17,433,110,433,143,300,143,349,225,320,225,272,143,119,143,113,147,111,153,111,155,113,161,115,164,127,176,135,186,144,196,152,206,159,215,149,225,129,202,107,181,83,161,58,143,30,129,30,124,58,110,83,93,107,73,128,51,148,29,158,39,151,49,143,59,135,68,126,78,115,89,113,92,111,96,110,99,111,102,114,105,120,109,123,110,252,110,204,29,233,29,281,110,433,129,405,143,380,161,
+78,-1,81,-65,79,-1,79,-1,81,-65,80,-1,83,-1,80,-1,81,-65,83,-1,81,-65,103,-61,111,-34,111,-33,103,-61,103,-61,111,-33,110,-32,103,-61,110,-32,110,-30,110,-30,110,-28,103,-61,103,-61,110,-28,92,2,103,-61,92,2,90,0,115,-20,118,-17,404,331,115,-20,404,331,92,2,404,331,118,-17,428,307,92,2,110,-28,111,-26,92,2,111,-26,113,-23,92,2,113,-23,115,-20,103,-61,90,0,88,0,103,-61,88,0,85,-1,103,-61,85,-1,83,-1,147,-59,140,-42,127,-41,147,-59,127,-41,125,-59,147,-59,153,-42,140,-42,156,-59,165,-59,166,-43,166,-43,165,-59,173,-59,166,-43,173,-59,178,-45,178,-45,173,-59,182,-60,178,-45,182,-60,190,-46,190,-46,182,-60,190,-60,156,-59,166,-43,153,-42,156,-59,153,-42,147,-59,121,-41,117,-40,125,-59,125,-59,117,-40,115,-38,125,-59,115,-38,113,-36,124,-41,121,-41,125,-59,124,-41,125,-59,127,-41,125,-59,113,-36,112,-36,125,-59,112,-36,111,-34,125,-59,111,-34,103,-61,81,-65,78,-1,77,-1,81,-65,77,-1,76,0,81,-65,76,0,75,0,81,-65,75,0,73,2,81,-65,73,2,72,4,81,-65,72,4,71,7,81,-65,71,7,60,-70,70,10,70,14,69,52,70,10,69,52,68,65,70,10,68,65,65,77,70,10,65,77,60,-70,70,10,60,-70,71,7,70,39,69,52,70,14,70,39,70,14,70,26,60,-70,65,77,54,35,60,-70,54,35,53,12,60,-70,53,12,51,-9,60,-70,51,-9,48,-31,60,-70,48,-31,43,-53,60,-70,43,-53,39,-77,53,60,53,51,65,77,65,77,53,51,53,43,65,77,53,43,54,35,65,77,51,76,52,68,65,77,52,68,53,60,43,-53,35,-74,39,-77,
+279,331,243,331,206,232,74,232,36,331,1,331,123,0,156,0,16383,16383,195,201,140,51,84,201,202,110,169,110,169,65,165,48,155,37,141,30,128,27,117,26,107,26,92,29,78,36,67,47,
+156,0,279,331,195,201,195,201,279,331,206,232,195,201,206,232,84,201,84,201,206,232,74,232,84,201,74,232,123,0,123,0,74,232,36,331,123,0,36,331,1,331,140,51,84,201,123,0,140,51,123,0,156,0,140,51,156,0,195,201,206,232,279,331,243,331,
+202,110,169,110,169,65,165,48,155,37,141,30,128,27,117,26,107,26,92,29,78,36,67,47,63,65,63,308,67,326,78,337,92,344,105,346,116,347,126,347,140,344,154,338,165,326,169,307,169,262,202,262,202,305,196,339,180,360,158,373,136,379,117,380,97,379,74,373,52,361,36,339,30,306,30,65,36,32,51,11,72,0,94,-5,114,-6,134,-5,157,0,179,10,196,30,202,61,98,313,112,317,119,318,127,319,134,319,161,314,179,300,191,279,198,255,200,228,200,221,199,214,199,207,198,200,196,194,189,203,180,210,169,214,159,217,148,218,107,210,72,188,44,156,26,117,20,75,22,51,30,29,43,11,62,0,88,-5,148,9,190,47,217,98,231,154,235,204,232,250,220,287,202,313,175,329,142,334,131,334,121,333,101,327,93,323,16383,16383,184,160,182,140,180,131,
+105,346,116,347,116,347,117,380,116,347,126,347,117,380,126,347,136,379,136,379,126,347,140,344,136,379,140,344,158,373,158,373,140,344,154,338,158,373,154,338,165,326,202,305,196,339,202,262,202,262,196,339,180,360,202,262,180,360,169,307,169,307,180,360,165,326,78,337,92,344,97,379,97,379,92,344,105,346,97,379,105,346,117,380,117,380,105,346,116,347,74,373,52,361,63,308,74,373,63,308,67,326,74,373,67,326,78,337,74,373,78,337,97,379,30,306,30,65,36,32,30,306,36,32,36,339,36,339,36,32,51,11,36,339,51,11,52,361,52,361,51,11,63,65,52,361,63,65,63,308,165,48,155,37,157,0,157,0,155,37,141,30,157,0,141,30,134,-5,134,-5,141,30,128,27,134,-5,128,27,117,26,117,26,107,26,114,-6,114,-6,107,26,94,-5,107,26,92,29,94,-5,94,-5,92,29,78,36,94,-5,78,36,72,0,72,0,78,36,67,47,72,0,67,47,63,65,63,65,51,11,72,0,202,110,169,110,179,10,202,110,179,10,196,30,202,110,196,30,202,61,179,10,169,110,169,65,179,10,169,65,165,48,179,10,165,48,157,0,117,26,114,-6,134,-5,202,262,169,307,169,262,158,373,165,326,180,360,
+98,313,112,317,119,318,127,319,134,319,161,314,179,300,191,279,198,255,200,228,200,221,199,214,199,207,198,200,196,194,189,203,180,210,169,214,159,217,148,218,107,210,72,188,44,156,26,117,20,75,22,51,30,29,43,11,62,0,88,-5,148,9,190,47,217,98,231,154,235,204,232,250,220,287,202,313,175,329,142,334,131,334,121,333,101,327,93,323,16383,16383,184,160,182,140,180,131,178,121,176,110,166,80,152,53,135,30,116,15,94,9,78,13,68,21,63,33,61,46,60,59,65,100,79,139,99,172,124,194,153,203,161,201,169,197,177,189,182,176,184,160,243,0,243,331,36,331,36,298,210,298,210,182,42,182,42,149,210,149,210,33,36,33,36,0,243,0,243,331,199,331,219,387,190,387,170,331,36,331,36,298,159,298,119,182,42,182,42,149,108,149,68,33,36,33,36,0,56,0,36,-60,65,-60,85,0,16383,16383,210,182,148,182,188,298,210,298,16383,16383,210,33,97,33,137,149,210,149,353,291,318,291,289,258,272,270,253,279,233,285,212,290,190,291,138,283,93,259,57,223,34,178,25,126,27,100,33,75,43,51,56,30,72,11,28,-39,63,-39,92,-6,110,-17,129,-26,148,-33,169,-37,190,-39,242,-30,288,-6,
+127,319,134,319,134,319,142,334,134,319,161,314,142,334,161,314,175,329,175,329,161,314,179,300,175,329,179,300,202,313,202,313,179,300,191,279,202,313,191,279,198,255,112,317,119,318,121,333,121,333,119,318,127,319,121,333,127,319,131,334,131,334,127,319,134,319,131,334,134,319,142,334,93,323,98,313,101,327,101,327,98,313,105,315,101,327,105,315,111,330,111,330,105,315,112,317,111,330,112,317,121,333,152,53,135,30,148,9,148,9,135,30,116,15,148,9,116,15,94,9,94,9,78,13,88,-5,88,-5,78,13,68,21,88,-5,68,21,62,0,62,0,68,21,63,33,62,0,63,33,61,46,61,46,60,59,62,0,62,0,60,59,44,156,44,156,60,59,72,188,72,188,60,59,65,100,20,75,22,51,26,117,26,117,22,51,30,29,26,117,30,29,44,156,44,156,30,29,43,11,44,156,43,11,62,0,159,217,153,203,161,201,159,217,161,201,169,214,169,214,161,201,169,197,169,214,169,197,180,210,180,210,169,197,177,189,180,210,177,189,182,176,79,139,99,172,107,210,107,210,99,172,124,194,107,210,124,194,148,218,148,218,124,194,153,203,148,218,153,203,159,217,72,188,65,100,79,139,72,188,79,139,107,210,182,140,180,131,190,47,190,47,180,131,178,121,190,47,178,121,176,110,176,110,166,80,190,47,190,47,166,80,152,53,190,47,152,53,148,9,198,200,196,194,217,98,217,98,196,194,190,47,190,47,196,194,189,203,190,47,189,203,184,160,184,160,189,203,182,176,190,47,184,160,183,150,190,47,183,150,182,140,94,9,88,-5,148,9,235,204,232,250,231,154,231,154,232,250,220,287,231,154,220,287,217,98,217,98,220,287,202,313,217,98,202,313,200,228,200,228,202,313,198,255,217,98,200,228,200,221,217,98,200,221,199,214,217,98,199,214,199,207,217,98,199,207,198,200,180,210,182,176,189,203,
+243,0,243,331,36,331,36,298,210,298,210,182,42,182,42,149,210,149,210,33,36,33,36,0,243,0,243,331,199,331,219,387,190,387,170,331,36,331,36,298,159,298,119,182,42,182,42,149,
+42,182,210,149,210,182,210,182,210,149,243,0,210,182,243,0,210,298,210,298,243,0,243,331,210,298,243,331,36,331,243,0,210,149,210,33,243,0,210,33,36,33,243,0,36,33,36,0,210,298,36,331,36,298,210,149,42,182,42,149,
+243,0,243,331,199,331,219,387,190,387,170,331,36,331,36,298,159,298,119,182,42,182,42,149,108,149,68,33,36,33,36,0,56,0,36,-60,65,-60,85,0,16383,16383,210,182,148,182,188,298,210,298,16383,16383,210,33,97,33,137,149,210,149,353,291,318,291,289,258,272,270,253,279,233,285,212,290,190,291,138,283,93,259,57,223,34,178,25,126,27,100,33,75,43,51,56,30,72,11,28,-39,63,-39,92,-6,110,-17,129,-26,148,-33,169,-37,190,-39,242,-30,288,-6,324,28,348,74,
+36,331,159,298,170,331,170,331,159,298,188,298,170,331,188,298,190,387,190,387,188,298,199,331,190,387,199,331,219,387,159,298,137,149,148,182,148,182,137,149,210,149,148,182,210,149,210,182,210,182,210,149,243,0,210,182,243,0,210,298,210,298,243,0,243,331,210,298,243,331,199,331,159,298,119,182,137,149,137,149,119,182,108,149,137,149,108,149,97,33,97,33,108,149,85,0,97,33,85,0,243,0,68,33,36,33,56,0,68,33,56,0,65,-60,68,33,65,-60,85,0,68,33,85,0,108,149,210,33,97,33,243,0,210,33,243,0,210,149,42,182,42,149,108,149,42,182,108,149,119,182,65,-60,56,0,36,-60,159,298,36,331,36,298,56,0,36,33,36,0,159,298,148,182,188,298,199,331,188,298,210,298,
+353,291,318,291,289,258,272,270,253,279,233,285,212,290,190,291,138,283,93,259,57,223,34,178,25,126,27,100,33,75,43,51,56,30,72,11,28,-39,63,-39,92,-6,110,-17,129,-26,148,-33,169,-37,190,-39,242,-30,288,-6,324,28,348,74,356,126,354,152,348,176,338,200,325,221,309,241,16383,16383,287,217,300,201,310,184,317,166,322,147,323,127,316,85,297,48,269,19,232,0,190,-6,174,-5,158,-2,142,2,127,9,113,18,16383,16383,94,36,81,51,71,68,64,86,60,106,58,127,65,168,84,205,112,233,148,252,190,258,208,257,225,254,241,248,256,241,267,233,333,0,185,337,175,337,31,0,16383,16383,272,21,63,21,167,267,334,331,31,331,180,-5,190,-5,16383,16383,302,310,197,64,93,310,313,-12,313,20,167,20,137,24,111,37,89,57,73,82,64,109,313,109,313,142,65,142,74,170,90,195,112,215,138,228,167,233,313,233,313,266,166,266,121,258,84,238,55,207,37,169,30,126,37,83,55,45,84,14,122,-5,167,-12,313,-12,313,20,154,20,148,22,142,23,136,25,179,109,313,109,313,142,195,142,239,233,313,233,313,266,256,266,289,331,257,331,225,266,166,266,121,258,84,238,55,207,37,169,30,126,33,97,42,70,
+323,127,316,85,324,28,324,28,316,85,297,48,324,28,297,48,288,-6,288,-6,297,48,269,19,288,-6,269,19,242,-30,242,-30,269,19,232,0,242,-30,232,0,190,-39,190,-39,232,0,190,-6,127,9,129,-26,142,2,142,2,129,-26,148,-33,142,2,148,-33,158,-2,158,-2,148,-33,169,-37,158,-2,169,-37,174,-5,174,-5,169,-37,190,-39,174,-5,190,-39,190,-6,127,9,113,18,129,-26,267,233,113,18,287,217,267,233,287,217,272,270,129,-26,113,18,110,-17,110,-17,113,18,94,36,110,-17,94,36,92,-6,92,-6,94,36,81,51,92,-6,81,51,72,11,72,11,81,51,71,68,72,11,71,68,64,86,58,127,65,168,57,223,58,127,57,223,56,30,58,127,56,30,60,106,60,106,56,30,72,11,60,106,72,11,64,86,27,100,33,75,34,178,34,178,33,75,43,51,34,178,43,51,57,223,57,223,43,51,56,30,267,233,272,270,256,241,256,241,272,270,253,279,256,241,253,279,241,248,241,248,253,279,233,285,241,248,233,285,225,254,225,254,233,285,212,290,225,254,212,290,208,257,208,257,212,290,190,258,148,252,190,258,190,291,148,252,190,291,138,283,65,168,84,205,93,259,93,259,84,205,112,233,93,259,112,233,138,283,138,283,112,233,148,252,212,290,190,291,190,258,318,291,289,258,300,201,318,291,300,201,309,241,318,291,309,241,353,291,289,258,272,270,287,217,289,258,287,217,300,201,63,-39,92,-6,72,11,63,-39,72,11,28,-39,348,176,338,200,348,74,348,176,348,74,356,126,348,176,356,126,354,152,325,221,309,241,310,184,325,221,310,184,317,166,325,221,317,166,322,147,325,221,322,147,323,127,325,221,323,127,324,28,325,221,324,28,348,74,325,221,348,74,338,200,310,184,309,241,300,201,94,36,113,18,267,233,57,223,65,168,93,259,27,100,34,178,25,126,
+333,0,185,337,175,337,31,0,16383,16383,272,21,63,21,167,267,334,331,31,331,180,-5,190,-5,16383,16383,302,310,197,64,93,310,
+175,337,31,0,63,21,63,21,31,0,333,0,63,21,333,0,272,21,272,21,333,0,185,337,272,21,185,337,175,337,175,337,63,21,167,267,175,337,167,267,272,21,
+334,331,31,331,180,-5,190,-5,16383,16383,302,310,197,64,93,310,313,-12,313,20,167,20,137,24,111,37,89,57,73,82,64,109,
+334,331,31,331,93,310,334,331,93,310,302,310,334,331,302,310,197,64,334,331,197,64,190,-5,180,-5,190,-5,197,64,180,-5,197,64,93,310,180,-5,93,310,31,331,
+313,-12,313,20,167,20,137,24,111,37,89,57,73,82,64,109,313,109,313,142,65,142,74,170,90,195,112,215,138,228,167,233,313,233,313,266,166,266,121,258,84,238,55,207,37,169,30,126,37,83,55,45,84,14,122,-5,167,-12,313,-12,313,20,154,20,148,22,142,23,136,25,179,109,313,109,313,142,195,142,239,233,313,233,313,266,256,266,289,331,257,331,225,266,166,266,121,258,84,238,55,207,37,169,30,126,33,97,42,70,55,45,73,24,96,7,54,-78,
+55,45,84,14,64,109,64,109,65,142,55,45,55,45,65,142,55,207,55,45,55,207,37,83,37,83,55,207,37,169,37,83,37,169,30,126,65,142,64,109,313,109,65,142,313,109,313,142,90,195,112,215,121,258,121,258,112,215,138,228,121,258,138,228,166,266,166,266,138,228,167,233,166,266,167,233,313,266,313,266,167,233,313,233,84,238,55,207,65,142,84,238,65,142,74,170,84,238,74,170,90,195,84,238,90,195,121,258,167,-12,313,-12,313,20,167,-12,313,20,167,20,167,-12,167,20,137,24,167,-12,137,24,122,-5,137,24,111,37,122,-5,122,-5,111,37,89,57,122,-5,89,57,84,14,84,14,89,57,73,82,84,14,73,82,64,109,
+313,-12,313,20,154,20,148,22,142,23,136,25,179,109,313,109,313,142,195,142,239,233,313,233,313,266,256,266,289,331,257,331,225,266,166,266,121,258,84,238,55,207,37,169,30,126,33,97,42,70,55,45,73,24,96,7,54,-78,84,-78,121,-5,130,-7,139,-10,157,-12,167,-12,16383,16383,209,233,164,142,65,142,74,170,90,195,112,215,138,228,167,233,16383,16383,147,109,112,37,98,49,86,62,76,77,69,93,64,109,211,22,211,55,138,55,116,57,97,64,83,75,72,90,65,109,211,109,211,142,65,142,72,162,82,177,97,188,115,194,137,196,211,196,211,229,137,229,102,224,73,210,51,188,37,159,32,126,37,93,51,65,73,42,102,28,137,22,30,266,30,233,175,233,205,228,231,215,253,195,269,170,278,142,30,142,30,109,278,109,269,82,253,57,232,37,205,24,175,20,30,20,30,-12,175,-12,220,-5,258,14,287,45,306,83,
+96,7,96,7,84,-78,96,7,84,-78,121,-5,96,7,121,-5,98,49,96,7,98,49,86,62,96,7,86,62,76,77,96,7,76,77,73,24,55,45,73,24,64,109,64,109,73,24,69,93,69,93,73,24,76,77,161,20,154,20,157,-12,157,-12,154,20,148,22,157,-12,148,22,148,-11,148,-11,148,22,142,23,148,-11,142,23,139,-10,139,-10,142,23,136,25,139,-10,136,25,130,-7,147,109,112,37,121,-5,147,109,121,-5,130,-7,147,109,130,-7,136,25,147,109,136,25,179,109,147,109,179,109,164,142,147,109,164,142,65,142,147,109,65,142,64,109,167,-12,313,-12,313,20,167,-12,313,20,167,20,167,-12,167,20,161,20,167,-12,161,20,157,-12,90,195,112,215,121,258,121,258,112,215,138,228,121,258,138,228,166,266,166,266,138,228,167,233,166,266,167,233,225,266,225,266,167,233,209,233,225,266,209,233,239,233,239,233,209,233,195,142,256,266,289,331,257,331,256,266,257,331,239,233,256,266,239,233,313,233,256,266,313,233,313,266,179,109,313,109,195,142,179,109,195,142,209,233,179,109,209,233,164,142,84,238,55,207,65,142,84,238,65,142,74,170,84,238,74,170,90,195,84,238,90,195,121,258,30,126,33,97,37,169,37,169,33,97,42,70,37,169,42,70,55,207,55,207,42,70,55,45,55,207,55,45,65,142,65,142,55,45,64,109,195,142,313,109,313,142,84,-78,96,7,54,-78,98,49,121,-5,112,37,225,266,239,233,257,331,
+211,22,211,55,138,55,116,57,97,64,83,75,72,90,65,109,211,109,211,142,65,142,72,162,82,177,97,188,115,194,137,196,211,196,211,229,137,229,102,224,73,210,51,188,37,159,32,126,37,93,51,65,73,42,102,28,137,22,30,266,30,233,175,233,205,228,231,215,253,195,269,170,278,142,30,142,30,109,278,109,269,82,253,57,232,37,205,24,175,20,30,20,30,-12,175,-12,220,-5,258,14,287,45,306,83,312,126,313,126,306,169,288,207,259,238,222,258,
+83,75,72,90,73,42,73,42,72,90,65,109,73,42,65,109,51,188,73,42,51,188,51,65,51,65,51,188,37,159,51,65,37,159,37,93,37,93,37,159,32,126,82,177,97,188,102,224,102,224,97,188,115,194,102,224,115,194,137,229,137,229,115,194,137,196,51,188,65,109,65,142,65,142,65,109,211,142,211,142,65,109,211,109,211,229,137,229,137,196,211,229,137,196,211,196,73,210,51,188,65,142,73,210,65,142,72,162,73,210,72,162,82,177,73,210,82,177,102,224,97,64,102,28,116,57,116,57,102,28,137,22,116,57,137,22,138,55,138,55,137,22,211,22,138,55,211,22,211,55,83,75,73,42,102,28,83,75,102,28,97,64,
+30,266,30,233,175,233,205,228,231,215,253,195,269,170,278,142,30,142,30,109,278,109,269,82,253,57,232,37,205,24,175,20,30,20,30,-12,175,-12,220,-5,258,14,287,45,306,83,312,126,313,126,306,169,288,207,259,238,222,258,177,266,289,331,257,331,222,258,213,261,204,263,196,264,186,265,177,266,30,266,30,233,175,233,182,232,188,232,194,231,200,229,206,228,164,142,30,142,30,109,147,109,103,20,30,20,30,-12,86,-12,54,-78,84,-78,117,-12,175,-12,220,-5,258,14,
+269,82,253,57,258,14,258,14,253,57,232,37,258,14,232,37,220,-5,220,-5,232,37,205,24,220,-5,205,24,175,20,177,266,30,266,175,233,177,266,175,233,205,228,177,266,205,228,222,258,312,126,306,169,306,83,306,83,306,169,288,207,306,83,288,207,287,45,287,45,288,207,278,109,287,45,278,109,269,82,231,215,253,195,259,238,259,238,253,195,269,170,259,238,269,170,288,207,288,207,269,170,278,142,288,207,278,142,278,109,222,258,205,228,231,215,222,258,231,215,259,238,175,-12,220,-5,175,20,175,-12,175,20,30,20,175,-12,30,20,30,-12,278,109,278,142,30,142,278,109,30,142,30,109,269,82,258,14,287,45,175,233,30,266,30,233,
+289,331,257,331,222,258,213,261,204,263,196,264,186,265,177,266,30,266,30,233,175,233,182,232,188,232,194,231,200,229,206,228,164,142,30,142,30,109,147,109,103,20,30,20,30,-12,86,-12,54,-78,84,-78,117,-12,175,-12,220,-5,258,14,287,45,306,83,312,126,313,126,310,155,301,183,287,208,269,229,247,247,16383,16383,195,142,230,214,244,203,256,190,266,175,273,159,278,142,16383,16383,278,109,269,82,253,57,232,37,205,24,175,20,133,20,179,109,32,229,32,196,105,196,128,194,146,188,161,177,171,162,177,142,32,142,32,109,177,109,171,90,161,75,146,64,127,57,105,55,32,55,32,22,107,22,141,28,170,42,192,65,206,93,211,126,206,159,192,188,170,210,140,224,105,229,243,0,243,320,30,320,30,0,474,-128,474,-115,465,-115,447,-112,433,-104,424,-92,418,-74,416,-51,416,307,418,330,423,347,434,359,451,366,474,368,474,382,26,382,26,368,35,368,52,366,66,360,76,349,83,331,85,305,
+86,-12,54,-78,84,-78,86,-12,84,-78,117,-12,86,-12,117,-12,103,20,86,-12,103,20,30,20,86,-12,30,20,30,-12,147,109,103,20,117,-12,147,109,117,-12,133,20,147,109,133,20,179,109,147,109,179,109,164,142,147,109,164,142,30,142,147,109,30,142,30,109,269,82,253,57,258,14,258,14,253,57,232,37,258,14,232,37,220,-5,220,-5,232,37,205,24,220,-5,205,24,175,20,195,142,230,214,206,228,206,228,213,261,204,263,206,228,204,263,200,229,200,229,204,263,196,264,200,229,196,264,194,231,194,231,196,264,188,232,30,266,175,233,177,266,177,266,175,233,182,232,177,266,182,232,186,265,186,265,182,232,188,232,186,265,188,232,196,264,257,331,222,258,230,214,257,331,230,214,247,247,257,331,247,247,289,331,230,214,244,203,247,247,247,247,244,203,256,190,247,247,256,190,269,229,269,229,256,190,266,175,269,229,266,175,273,159,213,261,206,228,230,214,213,261,230,214,222,258,273,159,278,142,287,208,278,109,278,142,195,142,278,109,195,142,179,109,179,109,195,142,206,228,179,109,206,228,164,142,312,126,310,155,306,83,306,83,310,155,301,183,306,83,301,183,287,45,287,45,301,183,287,208,287,45,287,208,278,109,278,109,287,208,278,142,269,82,258,14,287,45,269,82,287,45,278,109,175,-12,220,-5,175,20,175,-12,175,20,133,20,175,-12,133,20,117,-12,269,229,273,159,287,208,175,233,30,266,30,233,
+32,229,32,196,105,196,128,194,146,188,161,177,171,162,177,142,32,142,32,109,177,109,171,90,161,75,146,64,127,57,105,55,32,55,32,22,107,22,141,28,170,42,192,65,206,93,211,126,206,159,192,188,170,210,140,224,105,229,243,0,243,320,30,320,30,0,474,-128,474,-115,465,-115,447,-112,433,-104,424,-92,418,-74,416,-51,416,307,418,330,423,347,434,359,451,366,474,368,474,382,26,382,26,368,35,368,52,366,66,360,76,349,83,331,85,305,85,-60,83,-80,
+105,229,32,229,105,229,105,229,32,229,105,196,105,229,105,196,140,224,140,224,105,196,128,194,140,224,128,194,146,188,192,188,177,142,192,65,192,65,177,142,177,109,192,65,177,109,171,90,32,142,32,109,177,109,32,142,177,109,177,142,146,188,161,177,170,210,170,210,161,177,171,162,170,210,171,162,192,188,192,188,171,162,177,142,206,159,192,188,192,65,206,159,192,65,206,93,206,159,206,93,211,126,170,42,192,65,171,90,170,42,171,90,161,75,170,42,161,75,146,64,170,42,146,64,141,28,127,57,105,55,107,22,127,57,107,22,141,28,127,57,141,28,146,64,32,55,32,22,107,22,32,55,107,22,105,55,105,196,32,229,32,196,140,224,146,188,170,210,
+243,0,243,320,30,320,30,0,474,-128,474,-115,465,-115,447,-112,
+243,0,243,320,30,320,243,0,30,320,30,0,
+474,-128,474,-115,465,-115,447,-112,433,-104,424,-92,418,-74,416,-51,416,307,418,330,423,347,434,359,451,366,474,368,474,382,26,382,26,368,35,368,52,366,66,360,76,349,83,331,85,305,85,-60,83,-80,77,-95,67,-106,54,-112,36,-115,26,-115,26,-128,210,-128,210,-115,195,-115,177,-112,165,-104,157,-91,152,-72,151,-48,151,349,350,349,350,-48,349,-69,344,-88,337,-102,324,-111,306,-115,290,-115,290,-128,474,-128,474,-115,451,-112,434,-106,423,-94,418,-77,416,-54,416,304,418,327,424,345,433,358,447,365,465,368,474,368,474,382,290,382,290,368,306,368,324,364,337,355,344,341,349,322,350,300,350,-96,151,-96,151,300,152,325,157,344,165,357,177,365,195,368,210,368,210,382,26,382,26,368,36,368,54,366,67,359,77,348,83,333,85,313,85,-53,83,-78,76,-96,66,-107,52,-113,35,-115,26,-115,26,-128,
+77,-95,67,-106,210,-128,210,-128,67,-106,54,-112,210,-128,54,-112,36,-115,344,-88,337,-102,474,-128,474,-128,337,-102,324,-111,474,-128,324,-111,306,-115,474,382,26,382,35,368,474,382,35,368,52,366,474,382,52,366,66,360,474,382,66,360,76,349,474,382,76,349,151,349,474,382,151,349,350,349,474,382,350,349,434,359,474,382,434,359,451,366,474,382,451,366,474,368,433,-104,424,-92,350,-48,350,-48,424,-92,418,-74,350,-48,418,-74,350,349,350,349,418,-74,416,-51,350,349,416,-51,416,307,350,349,416,307,418,330,350,349,418,330,423,347,350,349,423,347,434,359,165,-104,157,-91,85,-60,85,-60,157,-91,152,-72,85,-60,152,-72,85,305,85,305,152,-72,151,-48,85,305,151,-48,151,349,83,331,85,305,151,349,83,331,151,349,76,349,474,-128,474,-115,465,-115,474,-128,465,-115,447,-112,474,-128,447,-112,433,-104,474,-128,433,-104,349,-69,474,-128,349,-69,344,-88,290,-115,290,-128,474,-128,290,-115,474,-128,306,-115,210,-128,210,-115,195,-115,210,-128,195,-115,177,-112,210,-128,177,-112,83,-80,210,-128,83,-80,77,-95,85,-60,83,-80,177,-112,85,-60,177,-112,165,-104,26,-115,26,-128,210,-128,26,-115,210,-128,36,-115,349,-69,433,-104,350,-48,35,368,26,382,26,368,
+474,-128,474,-115,451,-112,434,-106,423,-94,418,-77,416,-54,416,304,418,327,424,345,433,358,447,365,465,368,474,368,474,382,290,382,290,368,306,368,324,364,337,355,344,341,349,322,350,300,350,-96,151,-96,151,300,152,325,157,344,165,357,177,365,195,368,210,368,210,382,26,382,26,368,36,368,54,366,67,359,77,348,83,333,85,313,85,-53,83,-78,76,-96,66,-107,52,-113,35,-115,26,-115,26,-128,428,20,413,20,405,-7,394,-30,379,-48,357,-59,328,-63,121,-63,289,153,144,349,304,349,339,346,364,336,381,318,392,292,400,256,415,256,415,382,41,382,225,126,29,-128,401,-128,310,110,310,143,32,143,32,110,319,218,319,251,24,251,24,218,16383,16383,319,54,319,86,188,86,188,191,155,191,155,86,24,86,24,54,155,54,155,-43,188,-43,188,54,203,339,201,349,196,358,189,365,180,369,171,371,
+76,-96,66,-107,474,-128,474,-128,66,-107,52,-113,474,-128,52,-113,35,-115,77,348,83,333,210,382,210,382,83,333,177,365,210,382,177,365,195,368,210,382,195,368,210,368,85,313,85,-53,151,-96,85,313,151,-96,151,300,85,313,151,300,152,325,85,313,152,325,157,344,85,313,157,344,165,357,85,313,165,357,177,365,85,313,177,365,83,333,210,382,26,382,36,368,210,382,36,368,54,366,210,382,54,366,67,359,210,382,67,359,77,348,434,-106,423,-94,350,-96,350,-96,423,-94,418,-77,350,-96,418,-77,350,300,349,322,350,300,433,358,349,322,433,358,474,382,474,382,433,358,447,365,474,382,447,365,465,368,474,382,465,368,474,368,416,-54,416,304,350,300,350,300,416,304,418,327,350,300,418,327,424,345,474,382,290,382,306,368,474,382,306,368,324,364,474,382,324,364,337,355,474,382,337,355,344,341,474,382,344,341,349,322,474,-128,474,-115,451,-112,474,-128,451,-112,434,-106,474,-128,434,-106,350,-96,474,-128,350,-96,151,-96,474,-128,151,-96,76,-96,83,-78,76,-96,151,-96,83,-78,151,-96,85,-53,26,-115,26,-128,474,-128,26,-115,474,-128,35,-115,350,300,418,-77,416,-54,306,368,290,382,290,368,433,358,350,300,424,345,36,368,26,382,26,368,
+428,20,413,20,405,-7,394,-30,379,-48,357,-59,328,-63,121,-63,289,153,144,349,304,349,339,346,364,336,381,318,392,292,400,256,415,256,415,382,41,382,225,126,29,-128,401,-128,310,110,310,143,32,143,32,110,319,218,319,251,24,251,24,218,16383,16383,319,54,319,86,188,86,188,191,155,191,155,86,24,86,24,54,155,54,155,-43,188,-43,188,54,203,339,
+415,382,41,382,144,349,415,382,144,349,304,349,415,382,304,349,339,346,415,382,339,346,364,336,415,382,364,336,381,318,415,382,381,318,392,292,415,382,392,292,400,256,415,382,400,256,415,256,225,126,29,-128,121,-63,225,126,121,-63,289,153,225,126,289,153,144,349,225,126,144,349,41,382,394,-30,379,-48,401,-128,401,-128,379,-48,357,-59,401,-128,357,-59,328,-63,405,-7,394,-30,401,-128,405,-7,401,-128,428,20,405,-7,428,20,413,20,121,-63,29,-128,401,-128,121,-63,401,-128,328,-63,
+310,110,310,143,32,143,32,110,319,218,319,251,24,251,24,218,
+310,110,310,143,32,143,310,110,32,143,32,110,
+319,218,319,251,24,251,24,218,16383,16383,319,54,319,86,188,86,188,191,155,191,155,86,24,86,24,54,155,54,155,-43,188,-43,188,54,203,339,201,349,196,358,189,365,180,369,171,371,161,369,153,365,146,358,141,350,139,339,140,328,145,319,151,313,160,308,171,307,181,309,
+24,251,24,218,319,218,24,251,319,218,319,251,188,191,155,191,188,-43,188,-43,155,191,155,86,188,-43,155,86,155,54,155,54,155,86,24,86,155,54,24,86,24,54,188,54,319,54,188,86,188,86,319,54,319,86,188,-43,155,54,155,-43,
+203,339,201,349,196,358,189,365,180,369,171,371,161,369,153,365,146,358,141,350,139,339,140,328,145,319,151,313,160,308,171,307,181,309,190,313,197,320,201,329,203,339,16383,16383,318,110,318,143,188,143,188,273,155,273,155,143,24,143,24,110,155,110,155,-20,188,-20,188,110,239,355,203,355,23,-110,59,-110,201,46,44,205,12,205,171,46,228,169,227,175,225,181,221,185,216,189,210,190,208,190,206,189,204,189,202,188,200,186,191,180,182,170,170,158,156,145,137,133,138,153,142,172,146,190,150,204,151,215,150,222,147,227,143,231,138,234,132,235,
+171,371,171,307,180,369,180,369,171,307,181,309,180,369,181,309,189,365,189,365,181,309,190,313,189,365,190,313,196,358,196,358,190,313,197,320,196,358,197,320,201,349,201,349,197,320,201,329,201,349,201,329,203,339,139,339,140,328,141,350,141,350,140,328,145,319,141,350,145,319,146,358,146,358,145,319,151,313,146,358,151,313,153,365,153,365,151,313,160,308,153,365,160,308,161,369,161,369,160,308,171,307,161,369,171,307,171,371,188,273,155,273,188,-20,188,-20,155,273,155,143,188,-20,155,143,155,110,155,110,155,143,24,143,155,110,24,143,24,110,188,110,318,110,188,143,188,143,318,110,318,143,188,-20,155,110,155,-20,
+239,355,203,355,23,-110,59,-110,201,46,44,205,12,205,171,46,
+239,355,203,355,23,-110,239,355,23,-110,59,-110,
+201,46,44,205,12,205,171,46,228,169,227,175,225,181,221,185,
+201,46,44,205,12,205,201,46,12,205,171,46,
+228,169,227,175,225,181,221,185,216,189,210,190,208,190,206,189,204,189,202,188,200,186,191,180,182,170,170,158,156,145,137,133,138,153,142,172,146,190,150,204,151,215,150,222,147,227,143,231,138,234,132,235,127,234,121,231,117,227,114,222,113,215,114,204,118,189,122,172,126,153,127,132,111,143,96,155,72,179,62,186,63,186,60,188,58,189,56,189,54,190,51,190,45,189,40,185,37,181,34,175,33,169,34,165,35,162,37,159,40,156,44,153,55,149,70,144,87,139,105,133,122,125,105,117,88,111,71,106,56,102,46,98,42,95,39,91,37,87,36,82,35,78,36,73,38,69,42,65,47,63,54,62,56,62,59,63,61,64,67,66,75,72,85,83,98,95,112,108,127,118,126,98,122,80,118,63,114,49,113,37,114,31,117,26,121,21,127,18,132,17,138,18,143,21,147,26,150,31,151,37,150,49,146,63,142,80,138,98,137,118,157,104,173,89,185,75,196,65,208,61,215,62,220,65,224,70,227,75,228,81,227,85,226,88,224,91,221,95,217,97,207,101,193,105,177,109,159,116,140,125,161,135,179,142,195,146,208,149,218,153,221,155,224,158,226,162,228,165,228,169,155,126,152,147,142,166,128,180,110,190,89,194,67,190,48,181,33,167,24,148,20,127,23,105,33,86,47,72,66,62,88,59,109,62,128,72,142,86,152,105,155,126,16383,16383,122,126,120,115,116,105,108,98,99,93,88,92,77,93,67,98,60,106,55,115,53,127,55,138,59,147,67,154,77,159,89,161,99,159,108,154,116,147,120,137,122,126,155,126,152,147,142,166,128,180,110,190,89,194,67,190,48,181,33,167,24,148,20,127,23,105,33,86,47,72,66,62,88,59,109,62,128,72,142,86,152,105,155,126,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,149,381,156,391,162,399,169,404,177,407,185,408,195,407,202,404,208,399,212,392,213,382,211,369,204,359,195,351,183,345,171,340,171,335,184,335,189,334,193,333,196,333,206,328,213,323,219,315,222,306,223,296,222,284,217,274,210,266,201,261,190,259,186,260,182,260,178,262,173,264,168,267,164,270,161,272,152,275,146,273,144,271,142,268,142,265,143,260,146,255,152,251,160,249,171,248,193,250,214,257,231,269,242,286,
+146,63,142,80,143,21,143,21,142,80,138,98,143,21,138,98,138,18,138,18,138,98,137,118,137,133,138,234,132,17,132,17,138,234,132,235,132,17,132,235,127,118,127,118,132,235,127,132,127,118,127,132,122,125,122,125,127,132,111,143,138,153,142,172,143,231,143,231,142,172,146,190,143,231,146,190,147,227,147,227,146,190,150,204,147,227,150,204,150,222,150,222,150,204,151,215,138,234,137,133,138,153,138,234,138,153,143,231,127,118,126,98,127,18,127,118,127,18,132,17,113,37,114,31,114,49,114,49,114,31,117,26,114,49,117,26,118,63,118,63,117,26,121,21,118,63,121,21,122,80,122,80,121,21,127,18,122,80,127,18,126,98,137,118,157,104,140,125,140,125,157,104,159,116,159,116,157,104,173,89,159,116,173,89,177,109,177,109,173,89,185,75,177,109,185,75,193,105,193,105,185,75,196,65,193,105,196,65,207,101,207,101,196,65,208,61,207,101,208,61,217,97,217,97,208,61,215,62,217,97,215,62,220,65,221,155,224,158,225,181,225,181,224,158,226,162,225,181,226,162,227,175,227,175,226,162,228,165,227,175,228,165,228,169,221,185,216,189,218,153,221,185,218,153,221,155,221,185,221,155,225,181,216,189,210,190,218,153,218,153,210,190,208,190,218,153,208,190,208,149,208,149,208,190,206,189,208,149,206,189,204,189,204,189,202,188,208,149,208,149,202,188,200,186,208,149,200,186,195,146,195,146,200,186,191,180,195,146,191,180,182,170,156,145,140,125,161,135,156,145,161,135,170,158,170,158,161,135,179,142,170,158,179,142,182,170,182,170,179,142,195,146,137,133,137,118,140,125,137,133,140,125,156,145,137,118,137,133,132,17,137,118,132,17,138,18,228,81,227,85,227,75,227,75,227,85,226,88,227,75,226,88,224,70,224,70,226,88,224,91,224,70,224,91,221,95,221,95,217,97,220,65,221,95,220,65,224,70,150,49,146,63,147,26,150,49,147,26,150,31,150,49,150,31,151,37,127,132,132,235,127,234,127,132,127,234,126,153,126,153,127,234,122,172,122,172,127,234,121,231,122,172,121,231,118,189,118,189,121,231,117,227,118,189,117,227,114,204,114,204,117,227,114,222,114,204,114,222,113,215,75,72,85,83,88,111,88,111,85,83,98,95,88,111,98,95,105,117,105,117,98,95,112,108,105,117,112,108,122,125,122,125,112,108,127,118,71,106,56,102,59,63,71,106,59,63,61,64,71,106,61,64,64,65,71,106,64,65,67,66,71,106,67,66,75,72,71,106,75,72,88,111,56,102,46,98,47,63,56,102,47,63,54,62,56,102,54,62,56,62,56,102,56,62,59,63,42,65,47,63,46,98,42,65,46,98,42,95,42,65,42,95,39,91,42,65,39,91,38,69,37,87,36,82,36,73,37,87,36,73,38,69,37,87,38,69,39,91,122,125,111,143,105,133,105,133,111,143,96,155,105,133,96,155,87,139,87,139,96,155,83,168,87,139,83,168,72,179,70,144,87,139,72,179,70,144,72,179,62,186,70,144,62,186,60,188,70,144,60,188,58,189,70,144,58,189,56,189,70,144,56,189,55,149,55,149,56,189,54,190,55,149,54,190,51,190,55,149,51,190,45,189,55,149,45,189,44,153,40,185,37,181,37,159,40,185,37,159,40,156,40,185,40,156,44,153,40,185,44,153,45,189,33,169,34,165,34,175,34,175,34,165,35,162,34,175,35,162,37,181,37,181,35,162,37,159,36,73,36,82,35,78,146,63,143,21,147,26,
+155,126,152,147,142,166,128,180,110,190,89,194,67,190,48,181,33,167,24,148,20,127,23,105,33,86,47,72,66,62,88,59,109,62,128,72,142,86,152,105,155,126,16383,16383,122,126,120,115,116,105,108,98,99,93,88,92,77,93,67,98,60,106,55,115,53,127,55,138,59,147,67,154,77,159,89,161,99,159,108,154,116,147,120,137,122,126,155,126,152,147,142,166,128,180,110,190,89,194,67,190,48,181,33,167,24,148,20,127,23,105,33,86,47,72,66,62,88,59,109,62,128,72,142,86,152,105,155,126,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,149,381,156,391,162,399,
+60,106,66,62,67,98,67,98,66,62,88,59,67,98,88,59,77,93,77,93,88,59,88,92,99,93,88,92,88,59,99,93,88,59,109,62,55,138,59,147,67,190,67,190,59,147,67,154,67,190,67,154,89,194,89,194,67,154,77,159,89,194,77,159,89,161,89,161,99,159,110,190,110,190,99,159,108,154,110,190,108,154,116,147,20,127,23,105,24,148,24,148,23,105,33,86,24,148,33,86,33,167,33,167,33,86,47,72,33,167,47,72,48,181,48,181,47,72,53,127,55,138,67,190,48,181,55,138,48,181,53,127,155,126,152,147,152,105,152,105,152,147,142,166,152,105,142,166,142,86,142,86,142,166,128,180,142,86,128,180,128,72,128,72,128,180,122,126,128,72,122,126,120,115,128,72,120,115,116,105,128,180,110,190,116,147,128,180,116,147,120,137,128,180,120,137,122,126,110,190,89,194,89,161,109,62,128,72,116,105,109,62,116,105,108,98,109,62,108,98,99,93,55,115,53,127,47,72,55,115,47,72,66,62,55,115,66,62,60,106,
+155,126,152,147,142,166,128,180,110,190,89,194,67,190,48,181,33,167,24,148,20,127,23,105,33,86,47,72,66,62,88,59,109,62,128,72,142,86,152,105,155,126,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,149,381,156,391,
+20,127,23,105,24,148,24,148,23,105,33,86,24,148,33,86,33,167,33,167,33,86,47,72,33,167,47,72,48,181,48,181,47,72,66,62,48,181,66,62,67,190,67,190,66,62,88,59,67,190,88,59,89,194,89,194,88,59,109,62,89,194,109,62,110,190,110,190,109,62,128,72,110,190,128,72,128,180,128,180,128,72,142,86,128,180,142,86,142,166,142,166,142,86,152,105,142,166,152,105,152,147,152,147,152,105,155,126,
+482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,149,381,156,391,162,399,169,404,177,407,185,408,195,407,202,404,208,399,212,392,213,382,211,369,204,359,195,351,183,345,171,340,171,335,184,335,189,334,
+76,159,83,163,134,222,134,222,83,163,89,165,134,222,89,165,94,165,94,165,102,164,134,222,134,222,102,164,108,161,134,222,108,161,114,155,143,222,134,222,227,-128,227,-128,134,222,126,136,120,147,126,136,134,222,120,147,134,222,114,155,134,222,56,160,62,150,134,222,62,150,69,155,134,222,69,155,76,159,143,222,227,-128,246,-45,246,-45,227,-128,243,-128,246,-45,243,-128,248,-45,248,-45,243,-128,482,487,248,-45,482,487,454,487,
+149,381,156,391,162,399,169,404,177,407,185,408,195,407,202,404,208,399,212,392,213,382,211,369,204,359,195,351,183,345,171,340,171,335,184,335,189,334,193,333,196,333,206,328,213,323,219,315,222,306,223,296,222,284,217,274,210,266,201,261,190,259,186,260,182,260,178,262,173,264,168,267,164,270,161,272,152,275,146,273,144,271,142,268,142,265,143,260,146,255,152,251,160,249,171,248,193,250,214,257,231,269,242,286,247,307,245,320,240,331,233,340,223,347,210,352,218,358,224,365,229,373,232,381,233,388,231,400,226,410,218,417,206,421,193,423,178,421,166,416,156,407,149,396,143,382,16383,16383,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,252,291,252,312,225,312,225,421,210,421,131,312,131,291,201,291,201,249,225,249,225,291,16383,16383,201,312,142,312,201,395,16383,16383,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,321,42,304,45,287,54,270,70,253,92,235,121,235,123,245,137,258,150,275,162,296,170,321,173,321,215,294,211,272,201,254,185,239,165,225,142,199,174,177,195,156,207,137,213,116,215,95,212,70,201,46,180,28,147,21,100,26,63,39,35,59,15,83,4,108,0,135,3,159,12,180,27,198,47,213,73,232,47,250,27,271,12,294,3,321,0,16383,16383,202,90,193,78,180,66,164,54,144,45,120,42,96,47,76,59,62,78,53,101,50,126,53,144,60,161,71,174,
+158,273,160,249,161,272,161,272,160,249,171,248,161,272,171,248,164,270,164,270,171,248,168,267,173,264,168,267,171,248,173,264,171,248,193,250,149,381,156,391,156,407,156,407,156,391,162,399,156,407,162,399,166,416,166,416,162,399,169,404,166,416,169,404,178,421,178,421,169,404,177,407,178,421,177,407,185,408,185,408,195,407,193,423,193,423,195,407,206,421,149,396,143,382,149,381,149,396,149,381,156,407,184,335,189,334,195,351,195,351,189,334,193,333,195,351,193,333,196,333,196,333,206,328,204,359,204,359,206,328,211,369,183,345,171,340,178,335,183,345,178,335,184,335,183,345,184,335,195,351,204,359,195,351,196,333,210,352,218,358,211,369,211,369,218,358,213,382,218,417,213,382,218,358,218,417,218,358,226,410,226,410,218,358,224,365,226,410,224,365,229,373,195,407,202,404,206,421,206,421,202,404,208,399,206,421,208,399,218,417,218,417,208,399,212,392,218,417,212,392,213,382,231,400,226,410,229,373,231,400,229,373,232,381,231,400,232,381,233,388,210,352,211,369,206,328,210,352,206,328,213,323,210,352,213,323,223,347,242,286,247,307,245,320,242,286,245,320,240,331,242,286,240,331,233,340,242,286,233,340,231,269,223,296,231,269,233,340,223,296,233,340,223,347,223,347,213,323,219,315,223,347,219,315,222,306,223,347,222,306,223,296,210,266,214,257,217,274,217,274,214,257,231,269,217,274,231,269,222,284,222,284,231,269,223,296,190,259,193,250,201,261,201,261,193,250,214,257,201,261,214,257,210,266,193,423,178,421,185,408,186,260,182,260,193,250,186,260,193,250,190,259,178,262,173,264,193,250,178,262,193,250,182,260,155,274,152,275,152,251,155,274,152,251,160,249,155,274,160,249,158,273,149,274,146,273,146,255,149,274,146,255,152,251,149,274,152,251,152,275,144,271,142,268,143,260,144,271,143,260,146,255,144,271,146,255,146,273,76,159,83,163,134,222,134,222,83,163,89,165,134,222,89,165,94,165,94,165,102,164,134,222,134,222,102,164,108,161,134,222,108,161,114,155,143,222,134,222,227,-128,227,-128,134,222,126,136,120,147,126,136,134,222,120,147,134,222,114,155,134,222,56,160,62,150,134,222,62,150,69,155,134,222,69,155,76,159,143,222,227,-128,246,-45,246,-45,227,-128,243,-128,246,-45,243,-128,248,-45,248,-45,243,-128,482,487,248,-45,482,487,454,487,143,260,142,268,142,265,178,335,171,340,171,335,
+252,291,252,312,225,312,225,421,210,421,131,312,131,291,201,291,201,249,225,249,225,291,16383,16383,201,312,142,312,201,395,16383,16383,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,321,42,304,45,287,54,270,70,253,92,235,121,235,123,245,137,258,150,275,162,296,170,321,173,321,215,294,211,272,201,254,185,239,165,225,142,199,174,177,195,156,207,137,213,116,215,95,212,70,201,46,180,28,147,21,100,26,63,39,35,59,15,83,4,108,0,135,3,159,12,
+131,291,201,291,131,312,131,312,201,291,142,312,131,312,142,312,210,421,210,421,142,312,201,395,210,421,201,395,225,249,225,249,201,395,201,312,225,249,201,312,201,291,201,291,201,312,142,312,210,421,225,249,225,421,225,312,225,291,252,291,225,312,252,291,252,312,76,159,83,163,134,222,134,222,83,163,89,165,134,222,89,165,94,165,94,165,102,164,134,222,134,222,102,164,108,161,134,222,108,161,114,155,143,222,134,222,227,-128,227,-128,134,222,126,136,120,147,126,136,134,222,120,147,134,222,114,155,134,222,56,160,62,150,134,222,62,150,69,155,134,222,69,155,76,159,143,222,227,-128,246,-45,246,-45,227,-128,243,-128,246,-45,243,-128,248,-45,248,-45,243,-128,482,487,248,-45,482,487,454,487,225,249,201,291,201,249,
+321,42,304,45,287,54,270,70,253,92,235,121,235,123,245,137,258,150,275,162,296,170,321,173,321,215,294,211,272,201,254,185,239,165,225,142,199,174,177,195,156,207,137,213,116,215,95,212,70,201,46,180,28,147,21,100,26,63,39,35,59,15,83,4,108,0,135,3,159,12,180,27,198,47,213,73,232,47,250,27,271,12,294,3,321,0,16383,16383,202,90,193,78,180,66,164,54,144,45,120,42,96,47,76,59,62,78,53,101,50,126,53,144,60,161,71,174,85,182,100,185,121,181,140,169,160,150,181,124,202,92,427,111,422,148,408,177,387,198,363,210,336,215,309,211,287,201,269,185,253,165,239,142,213,174,191,195,171,207,151,213,131,215,110,212,84,201,60,180,42,147,35,100,40,63,54,35,73,15,97,4,123,0,150,3,174,12,195,27,213,47,228,73,246,47,264,27,284,12,305,3,328,0,363,7,390,25,410,51,423,81,427,111,16383,16383,249,123,259,136,270,149,285,161,304,170,328,173,352,169,371,157,385,138,394,115,397,89,394,70,387,54,377,41,363,33,347,30,327,33,308,45,290,63,270,89,249,121,16383,16383,217,90,
+213,73,232,47,213,73,213,73,232,47,225,142,213,73,225,142,202,92,202,92,199,174,181,124,181,124,199,174,177,195,181,124,177,195,160,150,160,150,177,195,156,207,160,150,156,207,140,169,140,169,156,207,137,213,140,169,137,213,121,181,121,181,137,213,116,215,121,181,116,215,100,185,53,144,60,161,70,201,70,201,60,161,71,174,70,201,71,174,95,212,95,212,71,174,85,182,95,212,85,182,100,185,21,100,26,63,28,147,28,147,26,63,39,35,28,147,39,35,46,180,46,180,39,35,59,15,46,180,59,15,50,126,50,126,53,144,46,180,46,180,53,144,70,201,202,90,193,78,198,47,198,47,193,78,180,66,198,47,180,66,180,27,180,27,180,66,164,54,180,27,164,54,159,12,159,12,164,54,144,45,159,12,144,45,135,3,135,3,144,45,120,42,135,3,120,42,108,0,108,0,120,42,96,47,108,0,96,47,83,4,83,4,96,47,76,59,83,4,76,59,62,78,59,15,83,4,62,78,59,15,62,78,53,101,59,15,53,101,50,126,287,54,270,70,271,12,271,12,270,70,253,92,271,12,253,92,250,27,250,27,253,92,235,121,250,27,235,121,232,47,321,173,321,215,296,170,296,170,321,215,294,211,296,170,294,211,275,162,275,162,294,211,272,201,275,162,272,201,258,150,258,150,272,201,254,185,258,150,254,185,245,137,245,137,254,185,239,165,245,137,239,165,235,123,235,123,239,165,225,142,235,123,225,142,232,47,235,123,232,47,235,121,304,45,287,54,294,3,304,45,294,3,321,0,304,45,321,0,321,42,199,174,202,92,225,142,213,73,202,92,202,90,213,73,202,90,198,47,100,185,116,215,95,212,287,54,271,12,294,3,
+427,111,422,148,408,177,387,198,363,210,336,215,309,211,287,201,269,185,253,165,239,142,213,174,191,195,171,207,151,213,131,215,110,212,84,201,60,180,42,147,35,100,40,63,54,35,73,15,97,4,123,0,150,3,174,12,195,27,213,47,228,73,246,47,264,27,284,12,305,3,328,0,363,7,390,25,410,51,423,81,427,111,16383,16383,249,123,259,136,270,149,285,161,304,170,328,173,352,169,371,157,385,138,394,115,397,89,394,70,387,54,377,41,363,33,347,30,327,33,308,45,290,63,270,89,249,121,16383,16383,217,90,207,78,195,66,179,54,159,45,134,42,110,47,91,59,77,78,68,101,65,126,67,144,74,161,85,174,99,182,115,185,135,181,155,169,175,150,195,124,217,92,317,0,317,33,58,33,58,292,25,292,25,0,321,0,321,33,91,33,310,252,285,273,12,0,321,0,321,33,271,33,265,61,257,88,247,113,233,138,218,160,310,252,284,273,196,185,186,195,174,205,169,209,148,182,168,166,172,161,11,0,239,0,239,-18,238,-24,238,-30,270,-35,272,-21,272,0,16383,16383,90,33,194,137,207,118,217,98,226,77,233,56,237,33,326,40,281,59,284,72,286,86,288,99,290,127,289,140,288,154,286,168,280,196,326,216,314,246,269,228,266,234,263,241,257,253,253,259,225,243,228,237,231,232,233,226,236,220,238,215,28,127,239,40,237,34,234,29,232,23,229,17,225,12,254,-5,258,1,261,8,265,14,268,21,270,27,314,9,16383,16383,114,127,249,184,
+228,73,246,47,228,73,228,73,246,47,239,142,228,73,239,142,217,92,217,92,213,174,195,124,195,124,213,174,191,195,195,124,191,195,175,150,175,150,191,195,171,207,175,150,171,207,155,169,155,169,171,207,151,213,155,169,151,213,135,181,135,181,151,213,131,215,135,181,131,215,115,185,67,144,74,161,84,201,84,201,74,161,85,174,84,201,85,174,110,212,110,212,85,174,99,182,110,212,99,182,115,185,35,100,40,63,42,147,42,147,40,63,54,35,42,147,54,35,60,180,60,180,54,35,73,15,60,180,73,15,65,126,65,126,67,144,60,180,60,180,67,144,84,201,217,90,207,78,213,47,213,47,207,78,195,66,213,47,195,66,195,27,195,27,195,66,179,54,195,27,179,54,174,12,174,12,179,54,159,45,174,12,159,45,150,3,150,3,159,45,134,42,150,3,134,42,123,0,123,0,134,42,110,47,123,0,110,47,97,4,97,4,110,47,91,59,97,4,91,59,77,78,73,15,97,4,77,78,73,15,77,78,68,101,73,15,68,101,65,126,336,215,328,173,352,169,336,215,352,169,363,210,363,210,352,169,371,157,363,210,371,157,387,198,387,198,371,157,385,138,387,198,385,138,394,115,270,149,285,161,287,201,287,201,285,161,304,170,287,201,304,170,309,211,309,211,304,170,328,173,309,211,328,173,336,215,239,142,249,123,253,165,253,165,249,123,259,136,253,165,259,136,269,185,269,185,259,136,270,149,269,185,270,149,287,201,264,27,249,121,246,47,246,47,249,121,249,123,246,47,249,123,239,142,249,121,264,27,270,89,270,89,264,27,284,12,270,89,284,12,290,63,290,63,284,12,305,3,290,63,305,3,308,45,308,45,305,3,328,0,308,45,328,0,327,33,327,33,328,0,347,30,363,33,347,30,363,7,363,33,363,7,390,25,387,198,394,115,408,177,408,177,394,115,397,89,410,51,397,89,394,70,410,51,394,70,390,25,390,25,394,70,387,54,390,25,387,54,377,41,422,148,408,177,410,51,422,148,410,51,423,81,422,148,423,81,427,111,347,30,328,0,363,7,213,174,217,92,239,142,228,73,217,92,217,90,228,73,217,90,213,47,115,185,131,215,110,212,363,33,390,25,377,41,397,89,410,51,408,177,
+317,0,317,33,58,33,58,292,25,292,25,0,321,0,321,33,91,33,310,252,285,273,12,0,
+58,33,58,292,25,292,58,33,25,292,25,0,58,33,25,0,317,0,58,33,317,0,317,33,
+321,0,321,33,91,33,310,252,285,273,12,0,321,0,321,33,271,33,265,61,257,88,247,113,
+91,33,310,252,285,273,91,33,285,273,12,0,91,33,12,0,321,0,91,33,321,0,321,33,
+321,0,321,33,271,33,265,61,257,88,247,113,233,138,218,160,310,252,284,273,196,185,186,195,174,205,169,209,148,182,168,166,172,161,11,0,239,0,239,-18,238,-24,238,-30,270,-35,272,-21,272,0,16383,16383,90,33,194,137,207,118,217,98,226,77,233,56,237,33,326,40,281,59,284,72,286,86,288,99,290,127,289,140,288,154,286,168,280,196,326,216,314,246,269,228,266,234,263,241,257,253,253,259,225,243,228,237,231,232,233,226,236,220,238,215,28,127,239,40,237,34,234,29,232,23,229,17,225,12,254,-5,258,1,261,8,
+90,33,194,137,172,161,172,161,174,205,169,209,172,161,169,209,168,166,168,166,169,209,163,170,169,209,148,182,153,178,169,209,153,178,158,174,169,209,158,174,163,170,194,137,207,118,196,185,196,185,207,118,218,160,196,185,218,160,284,273,284,273,218,160,310,252,207,118,217,98,218,160,218,160,217,98,226,77,218,160,226,77,233,138,233,138,226,77,233,56,233,138,233,56,237,33,194,137,196,185,191,190,194,137,191,190,186,195,194,137,186,195,180,200,194,137,180,200,174,205,194,137,174,205,172,161,233,138,237,33,247,113,239,0,237,33,90,33,239,0,90,33,11,0,11,0,90,33,172,161,265,61,257,88,270,-35,270,-35,257,88,247,113,270,-35,247,113,239,0,239,0,247,113,237,33,272,0,321,0,321,33,272,0,321,33,271,33,272,0,271,33,271,-28,272,0,271,-28,272,-21,272,0,272,-21,272,-14,272,0,272,-14,272,-6,271,33,265,61,270,-35,271,33,270,-35,271,-28,270,-35,239,0,239,-5,270,-35,239,-5,239,-12,270,-35,239,-12,239,-18,270,-35,239,-18,238,-24,270,-35,238,-24,238,-30,
+326,40,281,59,284,72,286,86,288,99,290,127,289,140,288,154,286,168,280,196,326,216,314,246,269,228,266,234,263,241,257,253,253,259,225,243,228,237,231,232,233,226,236,220,238,215,28,127,239,40,237,34,234,29,232,23,229,17,225,12,254,-5,258,1,261,8,265,14,268,21,270,27,314,9,16383,16383,114,127,249,184,252,172,254,161,255,149,257,127,256,115,254,93,252,82,249,71,83,-93,83,345,50,345,50,-93,190,152,179,178,118,147,118,345,84,345,84,130,12,93,23,66,84,98,84,-93,118,-93,118,114,197,-93,197,345,164,345,164,-93,16383,16383,98,-93,98,345,65,345,65,-93,293,181,281,207,219,175,219,345,185,345,185,158,119,125,119,345,86,345,86,108,12,70,23,44,86,75,86,-93,119,-93,119,93,185,126,185,-93,219,-93,219,143,295,-14,157,268,152,268,
+256,115,258,1,257,127,257,127,258,1,260,247,260,247,258,1,261,8,260,247,261,8,263,241,263,241,261,8,265,14,263,241,265,14,266,234,266,234,265,14,268,21,266,234,268,21,269,228,269,228,268,21,270,27,269,228,270,27,280,196,280,196,270,27,281,59,280,196,281,59,283,182,283,182,281,59,284,72,283,182,284,72,286,168,286,168,284,72,286,86,286,168,286,86,288,154,288,154,286,86,288,99,288,154,288,99,289,140,289,140,288,99,289,113,289,140,289,113,290,127,314,9,326,40,281,59,314,9,281,59,270,27,314,246,269,228,280,196,314,246,280,196,326,216,255,149,256,138,257,253,257,253,256,138,257,127,257,253,257,127,260,247,249,184,252,172,253,259,253,259,252,172,254,161,253,259,254,161,257,253,257,253,254,161,255,149,253,259,225,243,228,237,253,259,228,237,231,232,253,259,231,232,233,226,253,259,233,226,236,220,253,259,236,220,238,215,253,259,238,215,249,184,255,104,254,93,254,-5,255,104,254,-5,258,1,255,104,258,1,256,115,254,-5,254,93,252,82,254,-5,252,82,249,71,254,-5,249,71,239,40,254,-5,239,40,237,34,254,-5,237,34,234,29,254,-5,234,29,232,23,254,-5,232,23,229,17,254,-5,229,17,225,12,238,215,28,127,114,127,114,127,28,127,239,40,114,127,239,40,249,71,238,215,114,127,249,184,
+83,-93,83,345,50,345,50,-93,190,152,179,178,118,147,118,345,
+83,-93,83,345,50,345,83,-93,50,345,50,-93,
+190,152,179,178,118,147,118,345,84,345,84,130,12,93,23,66,84,98,84,-93,118,-93,118,114,197,-93,197,345,164,345,164,-93,16383,16383,98,-93,98,345,65,345,65,-93,293,181,281,207,219,175,
+84,130,12,93,23,66,84,130,23,66,84,98,84,130,84,98,118,-93,84,130,118,-93,84,345,84,345,118,-93,118,345,118,147,118,114,190,152,118,147,190,152,179,178,118,-93,84,98,84,-93,
+197,-93,197,345,164,345,164,-93,16383,16383,98,-93,98,345,65,345,65,-93,293,181,281,207,219,175,219,345,185,345,185,158,119,125,119,345,86,345,
+164,345,164,-93,197,-93,164,345,197,-93,197,345,65,345,65,-93,98,-93,65,345,98,-93,98,345,
+293,181,281,207,219,175,219,345,185,345,185,158,119,125,119,345,86,345,86,108,12,70,23,44,86,75,86,-93,119,-93,119,93,185,126,185,-93,219,-93,219,143,295,-14,157,268,152,268,16,-14,47,-14,155,201,262,-14,295,268,263,268,156,52,48,268,16,268,153,-14,158,-14,286,-15,286,132,280,177,261,215,233,243,197,261,
+86,108,12,70,23,44,86,108,23,44,86,75,86,108,86,75,119,-93,86,108,119,-93,86,345,219,345,185,345,219,-93,219,-93,185,345,185,158,219,-93,185,158,185,126,185,126,185,158,119,125,185,126,119,125,119,93,119,-93,119,345,86,345,219,143,293,181,219,175,219,175,293,181,281,207,219,-93,185,126,185,-93,119,-93,86,75,86,-93,
+295,-14,157,268,152,268,16,-14,47,-14,155,201,262,-14,295,268,263,268,156,52,48,268,16,268,153,-14,158,-14,
+16,-14,47,-14,152,268,152,268,47,-14,155,201,152,268,155,201,157,268,157,268,155,201,262,-14,157,268,262,-14,295,-14,
+295,268,263,268,156,52,48,268,16,268,153,-14,158,-14,286,-15,286,132,280,177,261,215,233,243,197,261,155,268,
+295,268,263,268,158,-14,158,-14,263,268,156,52,158,-14,156,52,153,-14,153,-14,156,52,48,268,153,-14,48,268,16,268,
+286,-15,286,132,280,177,261,215,233,243,197,261,155,268,113,262,77,244,49,216,30,178,24,134,24,-15,57,-15,57,132,62,165,76,193,97,215,124,230,155,235,186,230,212,215,234,193,248,165,253,132,253,-15,286,268,253,268,253,120,248,87,234,59,212,37,186,23,155,17,124,23,97,37,76,60,62,88,57,121,57,268,24,268,24,118,30,74,49,37,77,9,113,-8,155,-15,197,-8,233,9,261,38,280,75,286,120,
+253,132,253,132,248,165,248,165,253,132,261,215,248,165,261,215,234,193,234,193,261,215,233,243,234,193,233,243,212,215,212,215,233,243,197,261,212,215,197,261,186,230,186,230,197,261,155,235,124,230,155,235,155,268,124,230,155,268,113,262,62,165,76,193,77,244,77,244,76,193,97,215,77,244,97,215,113,262,113,262,97,215,124,230,49,216,30,178,57,-15,49,216,57,-15,57,132,49,216,57,132,62,165,49,216,62,165,77,244,24,134,24,-15,57,-15,24,134,57,-15,30,178,197,261,155,268,155,235,286,-15,286,132,280,177,286,-15,280,177,261,215,286,-15,261,215,253,132,286,-15,253,132,253,-15,
+286,268,253,268,253,120,248,87,234,59,212,37,186,23,155,17,124,23,97,37,76,60,62,88,57,121,57,268,24,268,24,118,30,74,49,37,77,9,113,-8,155,-15,197,-8,233,9,261,38,280,75,286,120,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,18,-143,22,-150,28,-155,
+253,120,248,87,261,38,261,38,248,87,234,59,261,38,234,59,233,9,233,9,234,59,212,37,233,9,212,37,197,-8,197,-8,212,37,186,23,197,-8,186,23,155,-15,155,-15,186,23,155,17,286,268,253,268,261,38,286,268,261,38,280,75,286,268,280,75,286,120,76,60,77,9,97,37,97,37,77,9,113,-8,97,37,113,-8,124,23,124,23,113,-8,155,-15,124,23,155,-15,155,17,62,88,57,121,49,37,62,88,49,37,77,9,62,88,77,9,76,60,57,268,24,268,30,74,57,268,30,74,49,37,57,268,49,37,57,121,30,74,24,268,24,118,253,120,261,38,253,268,
+102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,18,-143,22,-150,28,-155,37,-158,49,-159,78,-153,102,-135,119,-111,131,-84,140,-58,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,318,396,314,402,307,407,298,411,287,412,255,404,231,385,213,359,201,330,193,303,223,-61,215,-89,207,-112,198,-129,188,-140,175,-144,173,-143,172,-143,170,-142,170,-140,171,-137,173,-135,175,-132,178,-127,179,-120,178,-116,175,-112,172,-109,168,-108,163,-107,155,-109,148,-113,142,-119,139,-127,137,-136,138,-143,141,-150,146,-155,154,-158,165,-159,195,-153,219,-135,238,-111,252,-84,261,-58,352,308,360,337,368,362,378,380,389,393,402,397,404,397,406,396,408,394,408,392,407,390,405,387,402,384,400,379,399,372,400,368,402,364,410,360,415,360,423,361,430,366,435,372,439,380,440,390,439,396,436,402,431,407,424,411,413,412,381,404,355,385,336,359,
+49,-140,49,-137,51,-109,51,-109,49,-137,52,-135,51,-109,52,-135,54,-112,54,-112,52,-135,54,-132,54,-112,54,-132,57,-116,57,-116,54,-132,57,-127,57,-116,57,-127,57,-120,18,-127,18,-143,21,-119,21,-119,18,-143,22,-150,21,-119,22,-150,27,-113,27,-113,22,-150,28,-155,27,-113,28,-155,34,-109,34,-109,28,-155,37,-158,34,-109,37,-158,42,-107,42,-107,37,-158,49,-159,42,-107,49,-159,46,-108,46,-108,49,-159,49,-140,86,-112,77,-129,78,-153,78,-153,77,-129,67,-140,78,-153,67,-140,54,-144,54,-144,52,-143,78,-153,78,-153,52,-143,50,-143,78,-153,50,-143,49,-159,49,-159,50,-143,49,-142,49,-159,49,-142,49,-141,285,396,287,412,283,397,283,397,287,412,281,397,268,393,281,397,287,412,268,393,287,412,255,404,289,360,294,360,298,411,298,411,294,360,302,361,298,411,302,361,307,407,307,407,302,361,309,366,307,407,309,366,314,402,314,402,309,366,315,372,314,402,315,372,318,396,318,396,315,372,318,380,318,396,318,380,320,390,279,379,279,368,281,384,281,384,279,368,281,364,281,384,281,364,284,387,284,387,281,364,285,362,284,387,285,362,286,390,286,390,285,362,289,360,286,390,289,360,287,392,287,392,289,360,298,411,287,412,285,396,286,395,287,412,286,395,287,394,287,412,287,394,287,392,287,412,287,392,298,411,255,404,231,385,231,308,255,404,231,308,239,337,255,404,239,337,247,362,255,404,247,362,257,380,255,404,257,380,268,393,231,308,231,385,213,359,231,308,213,359,201,330,231,308,201,330,193,303,231,308,193,303,140,-58,94,-89,102,-135,102,-61,102,-61,102,-135,119,-111,102,-61,119,-111,193,303,193,303,119,-111,131,-84,193,303,131,-84,140,-58,86,-112,78,-153,102,-135,86,-112,102,-135,94,-89,49,-140,49,-159,49,-141,279,368,279,379,278,372,18,-143,18,-127,16,-136,46,-108,49,-140,51,-109,
+223,-61,215,-89,207,-112,198,-129,188,-140,175,-144,173,-143,172,-143,170,-142,170,-140,171,-137,173,-135,175,-132,178,-127,179,-120,178,-116,175,-112,172,-109,168,-108,163,-107,155,-109,148,-113,142,-119,139,-127,137,-136,138,-143,141,-150,146,-155,154,-158,165,-159,195,-153,219,-135,238,-111,252,-84,261,-58,352,308,360,337,368,362,378,380,389,393,402,397,404,397,406,396,408,394,408,392,407,390,405,387,402,384,400,379,399,372,400,368,402,364,410,360,415,360,423,361,430,366,435,372,439,380,440,390,439,396,436,402,431,407,424,411,413,412,381,404,355,385,336,359,323,330,314,303,16383,16383,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,98,-135,117,-111,131,-84,140,-58,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,359,201,330,193,303,344,-61,336,-89,328,-112,319,-129,309,-140,296,-144,294,-143,293,-143,291,-141,291,-140,292,-137,297,-132,299,-127,300,-120,299,-116,296,-112,293,-109,288,-108,284,-107,276,-109,269,-113,263,-119,259,-127,258,-136,259,-143,262,-150,267,-155,275,-158,286,-159,316,-153,341,-135,359,-111,373,-84,382,-58,473,308,481,337,489,362,499,380,510,393,523,397,525,397,527,396,529,394,529,392,528,390,526,387,523,384,521,379,520,372,521,368,523,364,531,360,536,360,544,361,551,366,556,372,560,380,561,390,560,396,558,402,552,407,545,411,534,412,502,404,476,385,457,359,443,330,435,303,16383,16383,223,-61,215,-89,207,-112,198,-129,187,-140,175,-144,173,-143,171,-143,169,-141,169,-140,170,-137,175,-132,177,-127,178,-120,177,-116,175,-112,171,-109,167,-108,162,-107,154,-109,147,-113,142,-119,138,-127,137,-136,138,-143,141,-150,146,-155,154,-158,164,-159,194,-153,219,-135,238,-111,251,-84,260,-58,352,308,359,337,368,362,377,380,388,393,402,397,404,397,405,396,407,395,407,392,406,390,402,384,399,379,398,372,399,368,402,364,405,362,409,360,414,360,422,361,429,366,435,372,438,380,440,390,439,396,436,402,431,407,423,411,412,412,380,404,355,385,336,359,322,330,314,303,
+49,-137,51,-109,49,-140,49,-140,46,-108,44,-159,44,-159,46,-108,42,-107,44,-159,42,-107,34,-109,51,-109,52,-135,54,-112,54,-112,52,-135,54,-132,54,-112,54,-132,57,-116,57,-116,54,-132,57,-127,57,-116,57,-127,57,-120,94,-89,86,-112,98,-135,98,-135,86,-112,77,-129,98,-135,77,-129,74,-153,74,-153,77,-129,67,-140,74,-153,67,-140,54,-144,54,-144,52,-143,74,-153,74,-153,52,-143,50,-143,74,-153,50,-143,44,-159,44,-159,50,-143,49,-142,44,-159,49,-142,49,-141,171,-137,172,-109,170,-140,170,-140,168,-108,165,-159,165,-159,168,-108,163,-107,165,-159,163,-107,155,-109,172,-109,173,-135,175,-112,175,-112,173,-135,175,-132,175,-112,175,-132,178,-116,178,-116,175,-132,178,-127,178,-116,178,-127,179,-120,215,-89,207,-112,219,-135,219,-135,207,-112,198,-129,219,-135,198,-129,195,-153,195,-153,198,-129,188,-140,195,-153,188,-140,175,-144,175,-144,173,-143,195,-153,195,-153,173,-143,172,-143,195,-153,172,-143,165,-159,165,-159,172,-143,170,-142,165,-159,170,-142,170,-141,285,396,292,412,283,397,283,397,292,412,281,397,268,393,281,397,292,412,268,393,292,412,260,404,302,361,302,411,294,360,294,360,302,411,292,412,294,360,292,412,289,360,289,360,292,412,287,392,289,360,287,392,286,390,289,360,286,390,285,362,285,362,286,390,284,387,285,362,284,387,281,364,281,364,284,387,281,384,281,364,281,384,279,368,279,368,281,384,279,379,279,368,279,379,278,372,320,390,319,396,318,380,318,380,319,396,316,402,318,380,316,402,315,372,315,372,316,402,310,407,315,372,310,407,309,366,309,366,310,407,302,411,309,366,302,411,302,361,292,412,285,396,286,395,292,412,286,395,287,394,292,412,287,394,287,392,260,404,234,385,239,337,260,404,239,337,247,362,260,404,247,362,257,380,260,404,257,380,268,393,231,308,239,337,234,385,231,308,234,385,215,359,231,308,215,359,201,330,231,308,201,330,193,303,231,308,193,303,140,-58,94,-89,98,-135,102,-61,102,-61,98,-135,117,-111,102,-61,117,-111,193,303,193,303,117,-111,131,-84,193,303,131,-84,140,-58,49,-140,44,-159,49,-141,16,-136,17,-143,18,-127,18,-127,17,-143,20,-150,18,-127,20,-150,21,-119,21,-119,20,-150,25,-155,21,-119,25,-155,27,-113,27,-113,25,-155,33,-158,27,-113,33,-158,34,-109,34,-109,33,-158,44,-159,406,396,413,412,404,397,404,397,413,412,402,397,389,393,402,397,413,412,389,393,413,412,381,404,423,361,424,411,415,360,415,360,424,411,413,412,415,360,413,412,410,360,410,360,413,412,408,392,410,360,408,392,407,390,410,360,407,390,406,362,406,362,407,390,405,387,406,362,405,387,402,364,402,364,405,387,402,384,402,364,402,384,400,379,400,379,399,372,400,368,400,379,400,368,402,364,440,390,439,396,439,380,439,380,439,396,436,402,439,380,436,402,435,372,435,372,436,402,431,407,435,372,431,407,430,366,430,366,431,407,424,411,430,366,424,411,423,361,413,412,406,396,407,395,413,412,407,395,408,394,413,412,408,394,408,392,381,404,355,385,360,337,381,404,360,337,368,362,381,404,368,362,378,380,381,404,378,380,389,393,352,308,360,337,355,385,352,308,355,385,336,359,352,308,336,359,323,330,352,308,323,330,314,303,352,308,314,303,261,-58,215,-89,219,-135,223,-61,223,-61,219,-135,238,-111,223,-61,238,-111,314,303,314,303,238,-111,252,-84,314,303,252,-84,261,-58,170,-140,165,-159,170,-141,137,-136,138,-143,139,-127,139,-127,138,-143,141,-150,139,-127,141,-150,142,-119,142,-119,141,-150,146,-155,142,-119,146,-155,148,-113,148,-113,146,-155,154,-158,148,-113,154,-158,155,-109,155,-109,154,-158,165,-159,168,-108,170,-140,172,-109,172,-109,171,-137,173,-135,46,-108,49,-140,51,-109,51,-109,49,-137,52,-135,
+344,-61,336,-89,328,-112,319,-129,309,-140,296,-144,294,-143,293,-143,291,-141,291,-140,292,-137,297,-132,299,-127,300,-120,299,-116,296,-112,293,-109,288,-108,284,-107,276,-109,269,-113,263,-119,259,-127,258,-136,259,-143,262,-150,267,-155,275,-158,286,-159,316,-153,341,-135,359,-111,373,-84,382,-58,473,308,481,337,489,362,499,380,510,393,523,397,525,397,527,396,529,394,529,392,528,390,526,387,523,384,521,379,520,372,521,368,523,364,531,360,536,360,544,361,551,366,556,372,560,380,561,390,560,396,558,402,552,407,545,411,534,412,502,404,476,385,457,359,443,330,435,303,16383,16383,223,-61,215,-89,207,-112,198,-129,187,-140,175,-144,173,-143,171,-143,169,-141,169,-140,170,-137,175,-132,177,-127,178,-120,177,-116,175,-112,171,-109,167,-108,162,-107,154,-109,147,-113,142,-119,138,-127,137,-136,138,-143,141,-150,146,-155,154,-158,164,-159,194,-153,219,-135,238,-111,251,-84,260,-58,352,308,359,337,368,362,377,380,388,393,402,397,404,397,405,396,407,395,407,392,406,390,402,384,399,379,398,372,399,368,402,364,405,362,409,360,414,360,422,361,429,366,435,372,438,380,440,390,439,396,436,402,431,407,423,411,412,412,380,404,355,385,336,359,322,330,314,303,16383,16383,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,98,-135,117,-111,131,-84,140,-58,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,359,201,330,193,303,176,238,167,238,131,232,101,216,76,192,60,161,55,126,58,99,67,74,81,53,100,35,123,22,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,18,-143,22,-150,28,-155,37,-158,49,-159,78,-153,102,-135,119,-111,131,-84,140,-58,157,13,167,13,202,19,233,35,258,59,274,90,280,126,276,152,267,177,253,199,234,216,211,229,231,308,239,337,247,362,257,381,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,318,396,314,402,307,407,298,411,287,412,255,404,231,385,213,358,201,330,193,303,16383,16383,162,32,206,210,224,199,239,185,251,167,258,147,261,126,256,96,243,70,222,50,197,37,167,32,16383,16383,172,219,127,41,109,52,95,66,83,84,76,104,74,126,78,155,92,181,112,201,137,214,167,219,296,231,284,234,271,236,258,237,244,238,214,238,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,358,201,330,193,303,175,233,135,222,101,204,76,182,61,155,55,126,58,104,67,84,82,65,102,48,126,35,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,99,-135,117,-111,131,-84,140,-58,160,22,172,19,200,15,230,13,
+49,-137,51,-109,49,-140,49,-140,46,-108,44,-159,44,-159,46,-108,42,-107,44,-159,42,-107,34,-109,51,-109,52,-135,54,-112,54,-112,52,-135,54,-132,54,-112,54,-132,57,-116,57,-116,54,-132,57,-127,57,-116,57,-127,57,-120,94,-89,86,-112,98,-135,98,-135,86,-112,77,-129,98,-135,77,-129,74,-153,74,-153,77,-129,67,-140,74,-153,67,-140,54,-144,54,-144,52,-143,74,-153,74,-153,52,-143,50,-143,74,-153,50,-143,44,-159,44,-159,50,-143,49,-142,44,-159,49,-142,49,-141,170,-137,171,-109,169,-140,169,-140,167,-108,164,-159,164,-159,167,-108,162,-107,164,-159,162,-107,154,-109,171,-109,172,-135,175,-112,175,-112,172,-135,175,-132,175,-112,175,-132,177,-116,177,-116,175,-132,177,-127,177,-116,177,-127,178,-120,215,-89,207,-112,219,-135,219,-135,207,-112,198,-129,219,-135,198,-129,194,-153,194,-153,198,-129,187,-140,194,-153,187,-140,175,-144,175,-144,173,-143,194,-153,194,-153,173,-143,171,-143,194,-153,171,-143,164,-159,164,-159,171,-143,170,-142,164,-159,170,-142,169,-141,285,396,292,412,283,397,283,397,292,412,281,397,268,393,281,397,292,412,268,393,292,412,260,404,302,361,302,411,294,360,294,360,302,411,292,412,294,360,292,412,289,360,289,360,292,412,287,392,289,360,287,392,286,390,289,360,286,390,285,362,285,362,286,390,284,387,285,362,284,387,281,364,281,364,284,387,281,384,281,364,281,384,279,368,279,368,281,384,279,379,279,368,279,379,278,372,292,-137,293,-109,291,-140,291,-140,288,-108,286,-159,286,-159,288,-108,284,-107,286,-159,284,-107,276,-109,293,-109,294,-135,296,-112,296,-112,294,-135,297,-132,296,-112,297,-132,299,-116,299,-116,297,-132,299,-127,299,-116,299,-127,300,-120,320,390,319,396,318,380,318,380,319,396,316,402,318,380,316,402,315,372,315,372,316,402,310,407,315,372,310,407,309,366,309,366,310,407,302,411,309,366,302,411,302,361,292,412,285,396,286,395,292,412,286,395,287,394,292,412,287,394,287,392,260,404,234,385,239,337,260,404,239,337,247,362,260,404,247,362,257,380,260,404,257,380,268,393,231,308,239,337,234,385,231,308,234,385,215,359,231,308,215,359,201,330,231,308,201,330,193,303,231,308,193,303,140,-58,94,-89,98,-135,102,-61,102,-61,98,-135,117,-111,102,-61,117,-111,193,303,193,303,117,-111,131,-84,193,303,131,-84,140,-58,49,-140,44,-159,49,-141,16,-136,17,-143,18,-127,18,-127,17,-143,20,-150,18,-127,20,-150,21,-119,21,-119,20,-150,25,-155,21,-119,25,-155,27,-113,27,-113,25,-155,33,-158,27,-113,33,-158,34,-109,34,-109,33,-158,44,-159,336,-89,328,-112,341,-135,341,-135,328,-112,319,-129,341,-135,319,-129,316,-153,316,-153,319,-129,309,-140,316,-153,309,-140,296,-144,296,-144,294,-143,316,-153,316,-153,294,-143,293,-143,316,-153,293,-143,286,-159,286,-159,293,-143,292,-142,286,-159,292,-142,291,-141,405,396,412,412,404,397,404,397,412,412,402,397,388,393,402,397,412,412,388,393,412,412,380,404,422,361,423,411,414,360,414,360,423,411,412,412,414,360,412,412,409,360,409,360,412,412,407,392,409,360,407,392,406,390,409,360,406,390,405,362,405,362,406,390,404,387,405,362,404,387,402,364,402,364,404,387,402,384,402,364,402,384,399,379,399,379,398,372,399,368,399,379,399,368,402,364,440,390,439,396,438,380,438,380,439,396,436,402,438,380,436,402,435,372,435,372,436,402,431,407,435,372,431,407,429,366,429,366,431,407,423,411,429,366,423,411,422,361,412,412,405,396,407,395,412,412,407,395,407,394,412,412,407,394,407,392,380,404,355,385,359,337,380,404,359,337,368,362,380,404,368,362,377,380,380,404,377,380,388,393,352,308,359,337,355,385,352,308,355,385,336,359,352,308,336,359,322,330,352,308,322,330,314,303,352,308,314,303,260,-58,215,-89,219,-135,223,-61,223,-61,219,-135,238,-111,223,-61,238,-111,314,303,314,303,238,-111,251,-84,314,303,251,-84,260,-58,169,-140,164,-159,169,-141,137,-136,138,-143,138,-127,138,-127,138,-143,141,-150,138,-127,141,-150,142,-119,142,-119,141,-150,146,-155,142,-119,146,-155,147,-113,147,-113,146,-155,154,-158,147,-113,154,-158,154,-109,154,-109,154,-158,164,-159,435,303,344,-61,359,-111,435,303,359,-111,373,-84,435,303,373,-84,382,-58,435,303,382,-58,473,308,435,303,473,308,443,330,344,-61,336,-89,341,-135,344,-61,341,-135,359,-111,291,-140,286,-159,291,-141,258,-136,259,-143,259,-127,259,-127,259,-143,262,-150,259,-127,262,-150,263,-119,263,-119,262,-150,267,-155,263,-119,267,-155,269,-113,269,-113,267,-155,275,-158,269,-113,275,-158,276,-109,276,-109,275,-158,286,-159,527,396,534,412,525,397,525,397,534,412,523,397,510,393,523,397,534,412,510,393,534,412,502,404,544,361,545,411,536,360,536,360,545,411,534,412,536,360,534,412,531,360,531,360,534,412,529,392,531,360,529,392,528,390,531,360,528,390,527,362,527,362,528,390,526,387,527,362,526,387,523,364,523,364,526,387,523,384,523,364,523,384,521,379,521,379,520,372,521,368,521,379,521,368,523,364,561,390,560,396,560,380,560,380,560,396,558,402,560,380,558,402,556,372,556,372,558,402,552,407,556,372,552,407,551,366,551,366,552,407,545,411,551,366,545,411,544,361,534,412,527,396,528,395,534,412,528,395,529,394,534,412,529,394,529,392,502,404,476,385,481,337,502,404,481,337,489,362,502,404,489,362,499,380,502,404,499,380,510,393,473,308,481,337,476,385,473,308,476,385,457,359,473,308,457,359,443,330,288,-108,291,-140,293,-109,293,-109,292,-137,294,-135,167,-108,169,-140,171,-109,171,-109,170,-137,172,-135,46,-108,49,-140,51,-109,51,-109,49,-137,52,-135,
+176,238,167,238,131,232,101,216,76,192,60,161,55,126,58,99,67,74,81,53,100,35,123,22,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,18,-143,22,-150,28,-155,37,-158,49,-159,78,-153,102,-135,119,-111,131,-84,140,-58,157,13,167,13,202,19,233,35,258,59,274,90,280,126,276,152,267,177,253,199,234,216,211,229,231,308,239,337,247,362,257,381,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,318,396,314,402,307,407,298,411,287,412,255,404,231,385,213,358,201,330,193,303,16383,16383,162,32,206,210,224,199,239,185,251,167,258,147,261,126,256,96,243,70,222,50,197,37,167,32,16383,16383,172,219,127,41,109,52,95,66,83,84,76,104,74,126,78,155,92,181,112,201,137,214,167,219,296,231,284,234,271,236,258,237,244,238,214,238,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,358,201,330,193,303,175,233,135,222,101,204,76,182,61,155,55,126,58,104,67,84,82,65,102,48,126,35,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,99,-135,117,-111,131,-84,140,-58,160,22,172,19,200,15,230,13,235,13,237,14,242,14,223,-61,216,-89,208,-112,199,-129,188,-140,175,-144,173,-143,172,-143,170,-142,170,-140,171,-137,173,-135,175,-132,178,-127,179,-120,178,-116,175,-112,172,-109,168,-108,163,-107,155,-109,148,-113,142,-119,139,-127,137,-136,138,-143,
+49,-140,49,-137,51,-109,51,-109,49,-137,52,-135,51,-109,52,-135,54,-112,54,-112,52,-135,54,-132,54,-112,54,-132,57,-116,57,-116,54,-132,57,-127,57,-116,57,-127,57,-120,18,-127,18,-143,21,-119,21,-119,18,-143,22,-150,21,-119,22,-150,27,-113,27,-113,22,-150,28,-155,27,-113,28,-155,34,-109,34,-109,28,-155,37,-158,34,-109,37,-158,42,-107,42,-107,37,-158,49,-159,42,-107,49,-159,46,-108,46,-108,49,-159,49,-140,86,-112,77,-129,78,-153,78,-153,77,-129,67,-140,78,-153,67,-140,54,-144,54,-144,52,-143,78,-153,78,-153,52,-143,50,-143,78,-153,50,-143,49,-159,49,-159,50,-143,49,-142,49,-159,49,-142,49,-141,95,66,100,35,109,52,109,52,100,35,123,22,109,52,123,22,127,41,127,41,123,22,131,-84,127,41,131,-84,172,219,172,219,131,-84,140,-58,172,219,140,-58,157,13,83,84,76,104,81,53,83,84,81,53,100,35,83,84,100,35,95,66,76,104,74,126,81,53,81,53,74,126,67,74,67,74,74,126,76,192,76,192,74,126,78,155,201,330,193,303,206,210,206,210,193,303,176,238,206,210,176,238,172,219,172,219,176,238,167,238,172,219,167,238,167,219,167,219,167,238,137,214,78,155,92,181,101,216,101,216,92,181,112,201,101,216,112,201,131,232,131,232,112,201,137,214,131,232,137,214,167,238,60,161,55,126,58,99,60,161,58,99,67,74,60,161,67,74,76,192,289,360,294,360,298,411,298,411,294,360,302,361,298,411,302,361,307,407,307,407,302,361,309,366,307,407,309,366,314,402,314,402,309,366,315,372,314,402,315,372,318,396,318,396,315,372,318,380,318,396,318,380,320,390,279,379,279,368,281,384,281,384,279,368,281,364,281,384,281,364,284,387,284,387,281,364,285,362,284,387,285,362,286,390,286,390,285,362,289,360,286,390,289,360,287,392,287,392,289,360,298,411,287,412,255,404,268,393,287,412,268,393,281,397,287,412,281,397,283,397,287,412,283,397,285,396,287,412,285,396,286,395,287,412,286,395,287,394,287,412,287,394,287,392,287,412,287,392,298,411,255,404,231,385,231,308,255,404,231,308,239,337,255,404,239,337,247,362,255,404,247,362,257,381,255,404,257,381,268,393,213,358,201,330,206,210,213,358,206,210,211,229,213,358,211,229,231,308,213,358,231,308,231,385,162,32,206,210,172,219,162,32,172,219,159,13,162,32,159,13,161,13,162,32,161,13,163,13,162,32,163,13,167,32,94,-89,102,-135,102,-61,102,-61,102,-135,119,-111,102,-61,119,-111,123,22,123,22,119,-111,131,-84,86,-112,78,-153,102,-135,86,-112,102,-135,94,-89,49,-140,49,-159,49,-141,258,59,274,90,261,126,261,126,267,177,258,147,258,147,267,177,253,199,258,147,253,199,251,167,251,167,253,199,239,185,234,216,211,229,224,199,234,216,224,199,239,185,234,216,239,185,253,199,274,90,280,126,276,152,274,90,276,152,267,177,274,90,267,177,261,126,258,59,261,126,256,96,258,59,256,96,243,70,258,59,243,70,233,35,163,13,165,13,167,32,167,32,165,13,167,13,167,32,167,13,197,37,197,37,167,13,202,19,197,37,202,19,222,50,222,50,202,19,233,35,222,50,233,35,243,70,224,199,211,229,206,210,279,368,279,379,278,372,18,-143,18,-127,16,-136,172,219,157,13,159,13,76,192,78,155,101,216,46,-108,49,-140,51,-109,
+296,231,284,234,271,236,258,237,244,238,214,238,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,358,201,330,193,303,175,233,135,222,101,204,76,182,61,155,55,126,58,104,67,84,82,65,102,48,126,35,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,99,-135,117,-111,131,-84,140,-58,160,22,172,19,200,15,230,13,235,13,237,14,242,14,223,-61,216,-89,208,-112,199,-129,188,-140,175,-144,173,-143,172,-143,170,-142,170,-140,171,-137,173,-135,175,-132,178,-127,179,-120,178,-116,175,-112,172,-109,168,-108,163,-107,155,-109,148,-113,142,-119,139,-127,137,-136,138,-143,141,-150,146,-155,154,-158,165,-159,195,-153,220,-135,239,-111,252,-84,261,-58,280,18,321,29,356,47,382,70,398,96,404,126,401,149,391,170,376,189,355,206,330,219,352,308,360,337,368,362,378,380,389,393,402,397,404,397,406,396,408,394,408,392,407,390,405,387,402,384,400,379,399,372,400,368,402,364,410,360,415,360,423,361,430,366,435,372,439,380,440,390,439,396,436,402,431,407,424,411,413,412,381,404,355,385,336,359,323,330,314,303,16383,16383,325,200,345,188,362,175,374,160,382,143,385,126,380,103,367,82,345,64,318,50,285,39,16383,16383,247,33,235,33,232,32,228,32,214,33,201,34,188,36,176,38,165,41,209,219,241,219,267,217,291,211,16383,16383,131,54,111,65,96,78,84,93,77,109,74,126,79,149,91,170,112,188,138,203,171,213,415,225,385,231,368,234,351,236,334,237,352,308,360,337,368,362,377,381,388,393,402,397,404,397,405,396,407,395,407,392,406,390,402,384,399,379,398,372,399,368,402,364,405,362,409,360,414,360,422,361,429,366,435,372,438,380,440,390,439,396,436,402,431,407,423,411,412,412,380,404,355,385,336,359,322,330,314,303,297,238,257,238,227,236,213,234,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,359,201,330,193,303,174,227,132,214,99,197,74,177,59,153,54,126,57,103,66,82,80,64,101,49,127,37,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,99,-135,117,-111,131,-84,140,-58,161,26,175,23,191,20,207,18,224,16,242,15,223,-61,215,-89,207,-112,198,-129,187,-140,175,-144,173,-143,171,-143,169,-141,169,-140,170,-137,175,-132,177,-127,178,-120,177,-116,175,-112,171,-109,167,-108,162,-107,154,-109,147,-113,142,-119,138,-127,137,-136,138,-143,141,-150,146,-155,154,-158,164,-159,194,-153,219,-135,238,-111,251,-84,260,-58,278,13,289,13,305,14,320,14,335,15,349,16,363,18,344,-61,336,-89,328,-112,319,-129,309,-140,296,-144,294,-143,292,-143,290,-141,290,-140,291,-137,296,-132,298,-127,299,-120,298,-116,296,-112,292,-109,288,-108,283,-107,275,-109,268,-113,262,-119,259,-127,257,-136,258,-143,261,-150,267,-155,275,-158,285,-159,316,-153,340,-135,359,-111,372,-84,381,-58,401,24,444,36,478,53,503,73,519,98,524,126,521,148,
+49,-137,51,-109,49,-140,49,-140,46,-108,44,-159,44,-159,46,-108,42,-107,44,-159,42,-107,34,-109,51,-109,52,-135,54,-112,54,-112,52,-135,54,-132,54,-112,54,-132,57,-116,57,-116,54,-132,57,-127,57,-116,57,-127,57,-120,94,-89,86,-112,99,-135,99,-135,86,-112,77,-129,99,-135,77,-129,74,-153,74,-153,77,-129,67,-140,74,-153,67,-140,54,-144,54,-144,52,-143,74,-153,74,-153,52,-143,50,-143,74,-153,50,-143,44,-159,44,-159,50,-143,49,-142,44,-159,49,-142,49,-141,96,78,102,48,111,65,111,65,102,48,126,35,111,65,126,35,131,54,131,54,126,35,131,-84,131,54,131,-84,171,213,171,213,131,-84,140,-58,171,213,140,-58,160,22,84,93,77,109,82,65,84,93,82,65,102,48,84,93,102,48,96,78,77,109,74,126,82,65,82,65,74,126,67,84,67,84,74,126,76,182,76,182,74,126,79,149,171,-137,172,-109,170,-140,170,-140,168,-108,165,-159,165,-159,168,-108,163,-107,165,-159,163,-107,155,-109,172,-109,173,-135,175,-112,175,-112,173,-135,175,-132,175,-112,175,-132,178,-116,178,-116,175,-132,178,-127,178,-116,178,-127,179,-120,216,-89,208,-112,220,-135,220,-135,208,-112,199,-129,220,-135,199,-129,195,-153,195,-153,199,-129,188,-140,195,-153,188,-140,175,-144,175,-144,173,-143,195,-153,195,-153,173,-143,172,-143,195,-153,172,-143,165,-159,165,-159,172,-143,170,-142,165,-159,170,-142,170,-141,201,330,193,303,209,219,209,219,193,303,175,233,209,219,175,233,171,213,171,213,175,233,138,203,138,203,175,233,135,222,138,203,135,222,112,188,112,188,135,222,101,204,112,188,101,204,91,170,91,170,101,204,79,149,61,155,55,126,58,104,61,155,58,104,67,84,61,155,67,84,76,182,285,396,292,412,283,397,283,397,292,412,281,397,268,393,281,397,292,412,268,393,292,412,260,404,302,361,302,411,294,360,294,360,302,411,292,412,294,360,292,412,289,360,289,360,292,412,287,392,289,360,287,392,286,390,289,360,286,390,285,362,285,362,286,390,284,387,285,362,284,387,281,364,281,364,284,387,281,384,281,364,281,384,279,368,279,368,281,384,279,379,279,368,279,379,278,372,320,390,319,396,318,380,318,380,319,396,316,402,318,380,316,402,315,372,315,372,316,402,310,407,315,372,310,407,309,366,309,366,310,407,302,411,309,366,302,411,302,361,292,412,285,396,286,395,292,412,286,395,287,394,292,412,287,394,287,392,260,404,234,385,239,337,260,404,239,337,247,362,260,404,247,362,257,380,260,404,257,380,268,393,239,337,234,385,231,308,231,308,234,385,215,358,231,308,215,358,214,238,214,238,215,358,212,219,214,238,212,219,216,219,215,358,201,330,209,219,215,358,209,219,212,219,176,38,165,41,172,19,171,213,165,41,209,219,160,22,172,19,165,41,160,22,165,41,171,213,94,-89,99,-135,102,-61,102,-61,99,-135,117,-111,102,-61,117,-111,126,35,126,35,117,-111,131,-84,49,-140,44,-159,49,-141,16,-136,17,-143,18,-127,18,-127,17,-143,20,-150,18,-127,20,-150,21,-119,21,-119,20,-150,25,-155,21,-119,25,-155,27,-113,27,-113,25,-155,33,-158,27,-113,33,-158,34,-109,34,-109,33,-158,44,-159,296,231,284,234,291,211,291,211,325,200,296,231,296,231,325,200,314,303,406,396,413,412,404,397,404,397,413,412,402,397,389,393,402,397,413,412,389,393,413,412,381,404,423,361,424,411,415,360,415,360,424,411,413,412,415,360,413,412,410,360,410,360,413,412,408,392,410,360,408,392,407,390,410,360,407,390,406,362,406,362,407,390,405,387,406,362,405,387,402,364,402,364,405,387,402,384,402,364,402,384,400,379,400,379,399,372,400,368,400,379,400,368,402,364,440,390,439,396,439,380,439,380,439,396,436,402,439,380,436,402,435,372,435,372,436,402,431,407,435,372,431,407,430,366,430,366,431,407,424,411,430,366,424,411,423,361,413,412,406,396,407,395,413,412,407,395,408,394,413,412,408,394,408,392,381,404,355,385,360,337,381,404,360,337,368,362,381,404,368,362,378,380,381,404,378,380,389,393,336,359,330,219,352,308,336,359,352,308,355,385,355,385,352,308,360,337,336,359,325,200,330,219,330,219,325,200,345,188,330,219,345,188,355,206,355,206,345,188,362,175,355,206,362,175,376,189,376,189,362,175,374,160,376,189,374,160,382,143,323,330,314,303,325,200,323,330,325,200,336,359,291,211,247,33,252,-84,291,211,252,-84,261,-58,291,211,261,-58,280,18,291,211,280,18,285,39,291,211,285,39,325,200,243,33,239,33,239,14,243,33,239,14,242,14,243,33,242,14,252,-84,243,33,252,-84,247,33,216,-89,220,-135,223,-61,223,-61,220,-135,239,-111,223,-61,239,-111,242,14,242,14,239,-111,252,-84,170,-140,165,-159,170,-141,137,-136,138,-143,139,-127,139,-127,138,-143,141,-150,139,-127,141,-150,142,-119,142,-119,141,-150,146,-155,142,-119,146,-155,148,-113,148,-113,146,-155,154,-158,148,-113,154,-158,155,-109,155,-109,154,-158,165,-159,404,126,401,149,398,96,398,96,401,149,391,170,398,96,391,170,385,126,385,126,382,70,398,96,391,170,376,189,382,143,391,170,382,143,385,126,385,126,380,103,382,70,382,70,380,103,367,82,382,70,367,82,356,47,356,47,367,82,345,64,356,47,345,64,321,29,321,29,345,64,318,50,321,29,318,50,285,39,280,18,321,29,285,39,176,38,186,17,188,36,188,36,186,17,200,15,188,36,200,15,201,34,201,34,200,15,215,14,201,34,215,14,214,33,214,33,215,14,228,32,232,32,228,32,230,13,232,32,230,13,232,13,291,211,284,234,279,214,279,214,284,234,271,236,279,214,271,236,267,217,267,217,271,236,258,237,267,217,258,237,254,218,254,218,258,237,244,238,254,218,244,238,241,219,241,219,244,238,230,238,241,219,230,238,228,219,232,13,235,13,235,33,235,33,235,13,237,14,235,33,237,14,239,33,239,33,237,14,239,14,230,238,214,238,216,219,230,238,216,219,220,219,230,238,220,219,224,219,230,238,224,219,228,219,228,32,215,14,230,13,232,32,232,13,235,33,176,38,172,19,186,17,76,182,79,149,101,204,168,-108,170,-140,172,-109,172,-109,171,-137,173,-135,46,-108,49,-140,51,-109,51,-109,49,-137,52,-135,
+319,60,319,93,170,93,200,160,319,160,319,193,214,193,274,331,247,331,187,193,24,193,24,160,172,160,143,93,24,93,24,60,128,60,69,-77,95,-77,156,60,319,206,319,239,24,239,24,206,16383,16383,319,110,319,143,24,143,24,110,16383,16383,319,14,319,47,24,47,24,14,319,14,319,47,150,47,177,110,319,110,319,143,
+128,60,69,-77,95,-77,128,60,95,-77,156,60,128,60,156,60,143,93,128,60,143,93,24,93,128,60,24,93,24,60,172,160,143,93,156,60,172,160,156,60,170,93,172,160,170,93,200,160,172,160,200,160,187,193,172,160,187,193,24,193,172,160,24,193,24,160,214,193,274,331,247,331,214,193,247,331,200,160,214,193,200,160,319,160,214,193,319,160,319,193,170,93,156,60,319,60,170,93,319,60,319,93,187,193,200,160,247,331,
+319,206,319,239,24,239,24,206,16383,16383,319,110,319,143,24,143,24,110,16383,16383,319,14,319,47,24,47,24,14,319,14,319,47,150,47,177,110,319,110,319,143,192,143,219,206,319,206,319,239,233,239,274,331,247,331,207,239,
+24,239,24,206,319,206,24,239,319,206,319,239,24,143,24,110,319,110,24,143,319,110,319,143,24,47,24,14,319,14,24,47,319,14,319,47,
+319,14,319,47,150,47,177,110,319,110,319,143,192,143,219,206,319,206,319,239,233,239,274,331,247,331,207,239,24,239,24,206,193,206,165,143,24,143,24,110,151,110,123,47,24,47,24,14,108,14,69,-77,95,-77,136,14,319,239,319,272,24,272,24,239,16383,16383,319,153,319,186,24,186,24,153,16383,16383,319,67,319,100,24,100,24,67,16383,16383,319,-18,319,14,24,14,24,-18,315,26,315,57,99,165,315,272,315,305,32,167,32,162,16383,16383,315,-50,
+108,14,69,-77,95,-77,108,14,95,-77,136,14,108,14,136,14,123,47,108,14,123,47,24,47,108,14,24,47,24,14,151,110,123,47,136,14,151,110,136,14,150,47,151,110,150,47,177,110,151,110,177,110,165,143,151,110,165,143,24,143,151,110,24,143,24,110,193,206,165,143,177,110,193,206,177,110,192,143,193,206,192,143,219,206,193,206,219,206,207,239,193,206,207,239,24,239,193,206,24,239,24,206,233,239,274,331,247,331,233,239,247,331,219,206,233,239,219,206,319,206,233,239,319,206,319,239,192,143,177,110,319,110,192,143,319,110,319,143,150,47,136,14,319,14,150,47,319,14,319,47,207,239,219,206,247,331,
+319,239,319,272,24,272,24,239,16383,16383,319,153,319,186,24,186,24,153,16383,16383,319,67,319,100,24,100,24,67,16383,16383,319,-18,319,14,24,14,24,-18,315,26,315,57,99,165,315,272,315,305,32,167,32,162,16383,16383,315,-50,315,-17,32,-17,32,-50,315,162,315,167,32,305,32,272,248,165,32,57,32,26,
+24,272,24,239,319,239,24,272,319,239,319,272,24,186,24,153,319,153,24,186,319,153,319,186,24,100,24,67,319,67,24,100,319,67,319,100,24,14,24,-18,319,-18,24,14,319,-18,319,14,
+315,26,315,57,99,165,315,272,315,305,32,167,32,162,16383,16383,315,-50,315,-17,32,-17,32,-50,315,162,315,167,32,305,32,272,248,165,32,57,32,26,16383,16383,315,-50,315,-17,32,-17,32,-50,
+99,165,315,272,315,305,99,165,315,305,32,167,99,165,32,167,315,26,99,165,315,26,315,57,32,-17,32,-50,315,-50,32,-17,315,-50,315,-17,315,26,32,167,32,162,
+315,162,315,167,32,305,32,272,248,165,32,57,32,26,16383,16383,315,-50,315,-17,32,-17,32,-50,311,80,311,112,95,219,311,326,311,359,28,222,28,217,16383,16383,311,-5,311,27,28,27,28,-5,
+248,165,32,57,315,162,248,165,315,162,315,167,248,165,315,167,32,305,248,165,32,305,32,272,32,-17,32,-50,315,-50,32,-17,315,-50,315,-17,315,162,32,57,32,26,
+311,80,311,112,95,219,311,326,311,359,28,222,28,217,16383,16383,311,-5,311,27,28,27,28,-5,16383,16383,311,-104,311,-72,28,-72,28,-104,311,217,311,222,28,359,28,326,244,219,28,112,28,80,16383,16383,311,-5,311,27,28,27,28,-5,16383,16383,311,-104,311,-72,28,-72,28,-104,
+95,219,311,326,311,359,95,219,311,359,28,222,95,219,28,222,311,80,95,219,311,80,311,112,28,27,28,-5,311,-5,28,27,311,-5,311,27,28,-72,28,-104,311,-104,28,-72,311,-104,311,-72,311,80,28,222,28,217,
+311,217,311,222,28,359,28,326,244,219,28,112,28,80,16383,16383,311,-5,311,27,28,27,28,-5,16383,16383,311,-104,311,-72,28,-72,28,-104,310,94,310,126,94,233,310,340,310,373,28,235,28,230,16383,16383,310,-91,310,-58,158,-58,200,8,310,8,310,41,221,41,245,79,215,79,
+244,219,28,112,311,217,244,219,311,217,311,222,244,219,311,222,28,359,244,219,28,359,28,326,28,27,28,-5,311,-5,28,27,311,-5,311,27,28,-72,28,-104,311,-104,28,-72,311,-104,311,-72,311,217,28,112,28,80,
+310,94,310,126,94,233,310,340,310,373,28,235,28,230,16383,16383,310,-91,310,-58,158,-58,200,8,310,8,310,41,221,41,245,79,215,79,191,41,28,41,28,8,171,8,128,-58,28,-58,28,-91,108,-91,84,-129,114,-129,138,-91,310,230,310,235,28,373,28,340,244,233,28,126,28,94,16383,16383,310,-91,310,-58,165,-58,207,8,310,8,310,41,228,41,252,79,222,79,198,41,28,41,28,8,177,8,135,-58,28,-58,28,-91,114,-91,91,-129,121,-129,145,-91,
+94,233,310,340,310,373,94,233,310,373,28,235,94,233,28,235,310,94,94,233,310,94,310,126,28,41,171,8,191,41,191,41,171,8,200,8,191,41,200,8,215,79,215,79,200,8,221,41,215,79,221,41,245,79,221,41,200,8,310,8,221,41,310,8,310,41,108,-91,114,-129,128,-58,128,-58,114,-129,138,-91,128,-58,138,-91,171,8,171,8,138,-91,158,-58,171,8,158,-58,200,8,28,-58,28,-91,108,-91,28,-58,108,-91,128,-58,158,-58,138,-91,310,-91,158,-58,310,-91,310,-58,114,-129,108,-91,84,-129,171,8,28,41,28,8,310,94,28,235,28,230,
+310,230,310,235,28,373,28,340,244,233,28,126,28,94,16383,16383,310,-91,310,-58,165,-58,207,8,310,8,310,41,228,41,252,79,222,79,198,41,28,41,28,8,177,8,135,-58,28,-58,28,-91,114,-91,91,-129,121,-129,145,-91,454,-12,454,18,238,127,454,233,454,266,171,129,171,124,16383,16383,295,-12,295,18,79,127,295,233,295,266,12,129,12,124,454,124,454,129,171,266,171,233,387,127,171,18,171,-12,16383,16383,295,124,295,129,12,266,12,233,228,127,
+244,233,28,126,310,230,244,233,310,230,310,235,244,233,310,235,28,373,244,233,28,373,28,340,28,41,177,8,198,41,198,41,177,8,207,8,198,41,207,8,222,79,222,79,207,8,228,41,222,79,228,41,252,79,228,41,207,8,310,8,228,41,310,8,310,41,114,-91,121,-129,135,-58,135,-58,121,-129,145,-91,135,-58,145,-91,177,8,177,8,145,-91,165,-58,177,8,165,-58,207,8,28,-58,28,-91,114,-91,28,-58,114,-91,135,-58,165,-58,145,-91,310,-91,165,-58,310,-91,310,-58,121,-129,114,-91,91,-129,177,8,28,41,28,8,310,230,28,126,28,94,
+454,-12,454,18,238,127,454,233,454,266,171,129,171,124,16383,16383,295,-12,295,18,79,127,295,233,295,266,12,129,12,124,454,124,454,129,171,266,171,233,387,127,171,18,171,-12,16383,16383,295,124,295,129,12,266,12,233,228,127,12,18,12,-12,
+238,127,454,233,454,266,238,127,454,266,171,129,238,127,171,129,454,-12,238,127,454,-12,454,18,79,127,295,233,295,266,79,127,295,266,12,129,79,127,12,129,295,-12,79,127,295,-12,295,18,295,-12,12,129,12,124,454,-12,171,129,171,124,
+454,124,454,129,171,266,171,233,387,127,171,18,171,-12,16383,16383,295,124,295,129,12,266,12,233,228,127,12,18,12,-12,190,-102,179,-89,167,-74,154,-59,130,-25,149,4,165,35,176,66,183,97,185,127,183,156,176,187,164,218,149,248,130,278,
+387,127,171,18,454,124,387,127,454,124,454,129,387,127,454,129,171,266,387,127,171,266,171,233,228,127,12,18,295,124,228,127,295,124,295,129,228,127,295,129,12,266,228,127,12,266,12,233,295,124,12,18,12,-12,454,124,171,18,171,-12,
+190,-102,179,-89,167,-74,154,-59,130,-25,149,4,165,35,176,66,183,97,185,127,183,156,176,187,164,218,149,248,130,278,142,296,154,312,167,328,179,342,190,355,190,365,174,353,158,340,143,326,130,312,117,296,103,312,89,326,74,340,59,353,42,365,42,357,66,329,78,313,91,296,103,278,84,249,68,218,57,187,50,156,47,127,50,97,57,66,68,35,84,4,103,-25,91,-42,78,-58,66,-74,42,-102,42,-111,59,-99,89,-73,117,-43,143,-73,158,-86,174,-99,190,-111,16383,16383,152,127,151,98,146,70,138,45,128,20,116,-2,104,20,95,45,87,71,82,98,80,127,82,155,87,182,95,208,105,233,117,256,128,233,138,208,146,182,151,155,152,127,319,22,300,49,273,71,242,87,207,96,174,100,198,155,227,162,255,173,281,188,303,208,319,232,319,249,302,230,283,215,261,204,237,195,213,190,254,286,228,286,184,186,171,186,138,188,105,195,75,206,47,224,24,249,24,232,43,204,69,182,101,166,135,156,170,153,146,98,116,92,88,81,61,65,40,46,24,22,24,4,40,22,60,38,82,49,106,58,131,64,89,-32,116,-32,159,66,161,67,171,67,204,65,237,58,268,46,295,28,319,4,310,-12,310,18,171,88,214,185,310,233,310,266,232,228,277,331,250,331,198,211,28,128,28,123,137,71,71,-77,99,-77,158,60,16383,16383,179,168,148,99,94,126,310,123,310,128,203,181,268,331,241,331,
+130,278,142,296,143,326,143,326,142,296,154,312,143,326,154,312,158,340,158,340,154,312,167,328,158,340,167,328,174,353,174,353,167,328,179,342,174,353,179,342,190,365,190,365,179,342,190,355,117,296,103,312,105,233,117,296,105,233,117,256,117,256,128,233,130,312,130,312,128,233,130,278,130,312,130,278,143,326,116,-2,117,-43,128,20,128,20,117,-43,130,-58,128,20,130,-58,130,-25,130,-25,130,-58,143,-73,130,-25,138,45,128,20,183,97,183,156,176,66,176,66,183,156,176,187,176,66,176,187,165,35,165,35,176,187,164,218,165,35,164,218,152,127,152,127,164,218,151,155,149,248,130,278,138,208,149,248,138,208,146,182,149,248,146,182,151,155,149,248,151,155,164,218,130,312,117,296,117,256,165,35,152,127,151,98,165,35,151,98,149,4,149,4,151,98,146,70,149,4,146,70,138,45,142,-42,143,-73,154,-59,154,-59,143,-73,158,-86,154,-59,158,-86,167,-74,167,-74,158,-86,174,-99,167,-74,174,-99,179,-89,179,-89,174,-99,190,-111,179,-89,190,-111,190,-102,105,233,103,312,103,278,103,278,103,312,91,296,91,296,103,312,89,326,91,296,89,326,78,313,78,313,89,326,74,340,78,313,74,340,66,329,66,329,74,340,59,353,66,329,59,353,54,343,54,343,59,353,42,365,54,343,42,365,42,357,103,-58,103,-25,91,-42,103,-58,91,-42,89,-73,89,-73,91,-42,78,-58,89,-73,78,-58,74,-86,74,-86,78,-58,66,-74,74,-86,66,-74,59,-99,59,-99,66,-74,54,-88,59,-99,54,-88,42,-102,104,20,95,45,103,-25,104,20,103,-25,103,-58,104,20,103,-58,117,-43,104,20,117,-43,116,-2,103,278,84,249,87,182,103,278,87,182,95,208,103,278,95,208,105,233,84,249,68,218,68,35,84,249,68,35,80,127,84,249,80,127,82,155,84,249,82,155,87,182,87,71,82,98,84,4,84,4,82,98,80,127,68,35,68,218,57,66,57,66,68,218,57,187,57,66,57,187,50,97,50,97,57,187,50,156,50,97,50,156,47,127,87,71,84,4,103,-25,87,71,103,-25,95,45,84,4,80,127,68,35,59,-99,42,-102,42,-111,130,-25,143,-73,142,-42,138,45,130,-25,149,4,183,156,183,97,185,127,130,278,128,233,138,208,
+319,22,300,49,273,71,242,87,207,96,174,100,198,155,227,162,255,173,281,188,303,208,319,232,319,249,302,230,283,215,261,204,237,195,213,190,254,286,228,286,184,186,171,186,138,188,105,195,75,206,47,224,24,249,24,232,43,204,69,182,101,166,135,156,170,153,146,98,116,92,88,81,61,65,40,46,24,22,24,4,40,22,60,38,82,49,106,58,131,64,89,-32,116,-32,159,66,161,67,171,67,204,65,237,58,268,46,295,28,319,4,310,-12,310,18,171,88,214,185,310,233,310,266,232,228,277,331,250,331,198,211,28,128,28,123,137,71,71,-77,99,-77,158,60,16383,16383,179,168,148,99,94,126,310,123,310,128,203,181,268,331,241,331,180,192,28,266,28,233,168,164,126,68,28,18,28,-12,108,26,63,-77,89,-77,142,42,16383,16383,244,126,161,84,190,153,310,-50,310,-17,129,-17,171,92,310,25,310,56,181,120,220,226,310,271,310,304,236,267,272,365,246,365,203,251,28,166,
+40,22,60,38,61,65,61,65,60,38,82,49,61,65,82,49,88,81,88,81,82,49,106,58,88,81,106,58,116,92,116,92,106,58,131,64,146,98,131,64,159,66,146,98,159,66,170,153,170,153,159,66,161,67,170,153,161,67,164,67,40,22,61,65,40,46,40,22,40,46,24,22,40,22,24,22,24,4,135,156,170,153,138,188,138,188,170,153,171,186,173,186,171,186,171,67,173,186,171,67,174,100,174,100,171,67,204,65,174,100,204,65,207,96,207,96,204,65,237,58,207,96,237,58,242,87,242,87,237,58,268,46,242,87,268,46,273,71,273,71,268,46,295,28,273,71,295,28,300,49,300,49,295,28,319,4,300,49,319,4,319,22,24,249,43,204,47,224,47,224,43,204,69,182,47,224,69,182,75,206,75,206,69,182,101,166,75,206,101,166,105,195,105,195,101,166,135,156,105,195,135,156,138,188,171,67,171,186,170,153,171,67,170,153,168,67,170,153,164,67,166,67,170,153,166,67,168,67,131,64,89,-32,116,-32,131,64,116,-32,159,66,319,249,302,230,303,208,303,208,302,230,283,215,303,208,283,215,281,188,281,188,283,215,261,204,281,188,261,204,255,173,255,173,261,204,237,195,255,173,237,195,227,162,227,162,237,195,213,190,227,162,213,190,198,155,228,286,184,186,198,155,228,286,198,155,213,190,228,286,213,190,254,286,198,155,184,186,181,186,198,155,181,186,179,186,198,155,179,186,176,186,198,155,176,186,174,100,176,186,173,186,174,100,43,204,24,249,24,232,319,249,303,208,319,232,116,92,131,64,146,98,
+310,-12,310,18,171,88,214,185,310,233,310,266,232,228,277,331,250,331,198,211,28,128,28,123,137,71,71,-77,99,-77,158,60,16383,16383,179,168,148,99,94,126,310,123,310,128,203,181,268,331,241,331,180,192,28,266,28,233,168,164,126,68,28,18,28,-12,108,26,63,-77,89,-77,142,42,16383,16383,244,126,161,84,190,153,
+198,211,28,128,94,126,94,126,28,128,137,71,94,126,137,71,148,99,148,99,137,71,158,60,148,99,158,60,179,168,179,168,158,60,171,88,179,168,171,88,214,185,94,126,179,168,198,211,198,211,179,168,214,185,198,211,214,185,250,331,250,331,214,185,232,228,250,331,232,228,277,331,137,71,71,-77,99,-77,137,71,99,-77,158,60,232,228,214,185,310,233,232,228,310,233,310,266,171,88,158,60,310,-12,171,88,310,-12,310,18,137,71,28,128,28,123,
+310,123,310,128,203,181,268,331,241,331,180,192,28,266,28,233,168,164,126,68,28,18,28,-12,108,26,63,-77,89,-77,142,42,16383,16383,244,126,161,84,190,153,310,-50,310,-17,129,-17,171,92,310,25,310,56,181,120,220,226,310,271,310,304,236,267,272,365,246,365,203,251,28,166,28,161,147,103,103,-17,28,-17,28,-50,
+108,26,63,-77,89,-77,108,26,89,-77,142,42,108,26,142,42,126,68,108,26,126,68,28,18,108,26,28,18,28,-12,168,164,126,68,142,42,168,164,142,42,161,84,168,164,161,84,190,153,168,164,190,153,180,192,168,164,180,192,28,266,168,164,28,266,28,233,203,181,268,331,241,331,203,181,241,331,190,153,203,181,190,153,244,126,203,181,244,126,310,128,310,123,310,128,244,126,310,123,244,126,161,84,310,123,161,84,142,42,180,192,190,153,241,331,
+320,0,320,33,190,33,190,331,157,331,157,33,26,33,26,0,313,126,309,150,298,171,281,188,260,199,235,203,211,199,189,188,
+190,331,157,331,190,33,190,33,157,331,157,33,190,33,157,33,320,0,320,0,157,33,26,33,320,0,26,33,26,0,190,33,320,0,320,33
+};
diff --git a/src/def_font.cpp b/src/def_font.cpp
deleted file mode 100644 (file)
index 4497e52..0000000
+++ /dev/null
@@ -1,1239 +0,0 @@
-const long mgl_numg=411, mgl_cur=243136;
-const float mgl_fact=35.7143;
-long mgl_gen_fnt[411][6] = {
-       {0x21,166,41,0,39,164},
-       {0x22,204,43,398,38,570},
-       {0x23,250,33,798,32,930},
-       {0x24,250,81,1122,80,1446},
-       {0x25,373,130,1926,129,2446},
-       {0x26,388,128,3220,127,3732},
-       {0x27,89,20,4494,19,4574},
-       {0x28,166,22,4688,20,4776},
-       {0x29,166,22,4896,21,4984},
-       {0x2a,250,154,5110,169,5726},
-       {0x2b,342,12,6740,8,6788},
-       {0x2c,125,34,6836,34,6972},
-       {0x2d,166,4,7176,2,7192},
-       {0x2e,125,21,7204,18,7288},
-       {0x2f,138,4,7396,2,7412},
-       {0x30,250,43,7424,41,7596},
-       {0x31,250,28,7842,27,7954},
-       {0x32,250,43,8116,41,8288},
-       {0x33,250,91,8534,90,8898},
-       {0x34,250,15,9438,12,9498},
-       {0x35,250,72,9570,77,9858},
-       {0x36,250,68,10320,66,10592},
-       {0x37,250,13,10988,11,11040},
-       {0x38,250,85,11106,83,11446},
-       {0x39,250,68,11944,67,12216},
-       {0x3a,138,43,12618,36,12790},
-       {0x3b,138,57,13006,52,13234},
-       {0x3c,342,7,13546,5,13574},
-       {0x3d,342,9,13604,4,13640},
-       {0x3e,342,7,13664,5,13692},
-       {0x3f,222,77,13722,73,14030},
-       {0x40,460,136,14468,136,15012},
-       {0x41,361,47,15828,50,16016},
-       {0x42,333,90,16316,90,16676},
-       {0x43,333,72,17216,72,17504},
-       {0x44,361,67,17936,68,18204},
-       {0x45,305,57,18612,54,18840},
-       {0x46,277,51,19164,47,19368},
-       {0x47,361,88,19650,86,20002},
-       {0x48,361,60,20518,56,20758},
-       {0x49,166,27,21094,26,21202},
-       {0x4a,186,45,21358,43,21538},
-       {0x4b,361,70,21796,69,22076},
-       {0x4c,305,37,22490,39,22638},
-       {0x4d,444,49,22872,47,23068},
-       {0x4e,361,47,23350,50,23538},
-       {0x4f,361,63,23838,60,24090},
-       {0x50,278,66,24450,69,24714},
-       {0x51,361,85,25128,83,25468},
-       {0x52,333,69,25966,69,26242},
-       {0x53,277,91,26656,94,27020},
-       {0x54,305,32,27584,30,27712},
-       {0x55,361,68,27892,68,28164},
-       {0x56,361,42,28572,41,28740},
-       {0x57,472,72,28986,75,29274},
-       {0x58,361,82,29724,80,30052},
-       {0x59,361,55,30532,54,30752},
-       {0x5a,305,32,31076,30,31204},
-       {0x5b,166,18,31384,16,31456},
-       {0x5c,138,4,31552,2,31568},
-       {0x5d,166,17,31580,16,31648},
-       {0x5e,234,7,31744,5,31772},
-       {0x5f,250,4,31802,2,31818},
-       {0x60,166,17,31830,16,31898},
-       {0x61,222,112,31994,115,32442},
-       {0x62,250,70,33132,71,33412},
-       {0x63,222,62,33838,60,34086},
-       {0x64,250,72,34446,79,34734},
-       {0x65,222,53,35208,53,35420},
-       {0x66,166,57,35738,53,35966},
-       {0x67,250,139,36284,149,36840},
-       {0x68,250,60,37734,67,37974},
-       {0x69,138,45,38376,44,38556},
-       {0x6a,138,71,38820,71,39104},
-       {0x6b,250,69,39530,72,39806},
-       {0x6c,138,30,40238,30,40358},
-       {0x6d,388,102,40538,108,40946},
-       {0x6e,250,66,41594,67,41858},
-       {0x6f,250,53,42260,50,42472},
-       {0x70,250,68,42772,72,43044},
-       {0x71,250,64,43476,68,43732},
-       {0x72,166,61,44140,61,44384},
-       {0x73,194,79,44750,86,45066},
-       {0x74,138,47,45582,49,45770},
-       {0x75,250,54,46064,56,46280},
-       {0x76,250,54,46616,53,46832},
-       {0x77,361,72,47150,81,47438},
-       {0x78,250,83,47924,89,48256},
-       {0x79,250,74,48790,79,49086},
-       {0x7a,222,27,49560,25,49668},
-       {0x7b,239,55,49818,54,50038},
-       {0x7c,99,4,50362,2,50378},
-       {0x7d,239,55,50390,55,50610},
-       {0x7e,270,41,50940,40,51104},
-       {0xa1,165,41,51344,39,51508},
-       {0xa2,250,81,51742,84,52066},
-       {0xa3,250,135,52570,148,53110},
-       {0xa4,250,73,53998,72,54290},
-       {0xa5,250,71,54722,69,55006},
-       {0xa6,99,9,55420,4,55456},
-       {0xa7,250,152,55480,156,56088},
-       {0xa8,166,43,57024,36,57196},
-       {0xa9,380,92,57412,87,57780},
-       {0xaa,137,95,58302,103,58682},
-       {0xab,250,69,59300,73,59576},
-       {0xac,300,6,60014,4,60038},
-       {0xad,166,4,60062,2,60078},
-       {0xae,380,106,60090,106,60514},
-       {0xaf,166,4,61150,2,61166},
-       {0xb0,199,43,61178,41,61350},
-       {0xb1,342,17,61596,10,61664},
-       {0xb2,150,41,61724,41,61888},
-       {0xb3,150,74,62134,75,62430},
-       {0xb4,166,16,62880,16,62944},
-       {0xb5,250,68,63040,67,63312},
-       {0xb6,295,48,63714,47,63906},
-       {0xb7,125,21,64188,18,64272},
-       {0xb8,166,40,64380,43,64540},
-       {0xb9,150,23,64798,26,64890},
-       {0xba,155,46,65046,45,65230},
-       {0xbb,250,73,65500,72,65792},
-       {0xbc,375,43,66224,40,66396},
-       {0xbd,375,74,66636,69,66932},
-       {0xbe,375,95,67346,89,67726},
-       {0xbf,222,86,68260,82,68604},
-       {0xc0,361,65,69096,66,69356},
-       {0xc1,361,65,69752,66,70012},
-       {0xc2,361,55,70408,55,70628},
-       {0xc3,361,89,70958,92,71314},
-       {0xc4,361,91,71866,86,72230},
-       {0xc5,361,91,72746,90,73110},
-       {0xc6,444,86,73650,85,73994},
-       {0xc7,333,108,74504,116,74936},
-       {0xc8,305,74,75632,70,75928},
-       {0xc9,305,74,76348,70,76644},
-       {0xca,305,65,77064,59,77324},
-       {0xcb,305,101,77678,90,78082},
-       {0xcc,166,45,78622,42,78802},
-       {0xcd,166,45,79054,42,79234},
-       {0xce,166,36,79486,31,79630},
-       {0xcf,166,72,79816,62,80104},
-       {0xd0,361,70,80476,69,80756},
-       {0xd1,361,88,81170,92,81522},
-       {0xd2,361,80,82074,76,82394},
-       {0xd3,361,81,82850,76,83174},
-       {0xd4,361,71,83630,65,83914},
-       {0xd5,361,104,84304,102,84720},
-       {0xd6,361,107,85332,96,85760},
-       {0xd7,319,12,86336,10,86384},
-       {0xd8,361,78,86444,80,86756},
-       {0xd9,361,87,87236,84,87584},
-       {0xda,361,87,88088,84,88436},
-       {0xdb,361,76,88940,73,89244},
-       {0xdc,361,112,89682,104,90130},
-       {0xdd,361,73,90754,70,91046},
-       {0xde,277,70,91466,75,91746},
-       {0xdf,250,98,92196,98,92588},
-       {0xe0,222,130,93176,131,93696},
-       {0xe1,222,129,94482,131,94998},
-       {0xe2,222,120,95784,120,96264},
-       {0xe3,222,155,96984,157,97604},
-       {0xe4,222,156,98546,151,99170},
-       {0xe5,222,156,100076,155,100700},
-       {0xe6,333,127,101630,132,102138},
-       {0xe7,222,97,102930,99,103318},
-       {0xe8,222,71,103912,69,104196},
-       {0xe9,222,72,104610,69,104898},
-       {0xea,222,61,105312,58,105556},
-       {0xeb,222,97,105904,89,106292},
-       {0xec,138,40,106826,42,106986},
-       {0xed,138,41,107238,42,107402},
-       {0xee,138,33,107654,31,107786},
-       {0xef,138,70,107972,62,108252},
-       {0xf0,250,74,108624,72,108920},
-       {0xf1,250,109,109352,109,109788},
-       {0xf2,250,71,110442,66,110726},
-       {0xf3,250,71,111122,66,111406},
-       {0xf4,250,61,111802,55,112046},
-       {0xf5,250,94,112376,92,112752},
-       {0xf6,250,97,113304,86,113692},
-       {0xf7,281,48,114208,38,114400},
-       {0xf8,250,73,114628,76,114920},
-       {0xf9,250,73,115376,72,115668},
-       {0xfa,250,73,116100,72,116392},
-       {0xfb,250,62,116824,61,117072},
-       {0xfc,250,98,117438,92,117830},
-       {0xfd,250,92,118382,95,118750},
-       {0xfe,250,71,119320,72,119604},
-       {0xff,250,118,120036,115,120508},
-       {0x300,0,15,121198,16,121258},
-       {0x301,0,16,121354,16,121418},
-       {0x302,0,7,121514,5,121542},
-       {0x303,0,40,121572,40,121732},
-       {0x304,0,4,121972,2,121988},
-       {0x305,0,4,122000,2,122016},
-       {0x306,0,22,122028,20,122116},
-       {0x307,0,21,122236,18,122320},
-       {0x308,0,43,122428,36,122600},
-       {0x309,0,44,122816,43,122992},
-       {0x30a,0,43,123250,40,123422},
-       {0x30b,0,36,123662,32,123806},
-       {0x30c,0,7,123998,5,124026},
-       {0x30d,0,4,124056,2,124072},
-       {0x30e,0,9,124084,4,124120},
-       {0x30f,0,36,124144,32,124288},
-       {0x391,361,45,124480,46,124660},
-       {0x392,333,71,124936,70,125220},
-       {0x393,293,35,125640,33,125780},
-       {0x394,361,8,125978,7,126010},
-       {0x395,305,56,126052,52,126276},
-       {0x396,305,32,126588,30,126716},
-       {0x397,361,60,126896,56,127136},
-       {0x398,361,105,127472,104,127892},
-       {0x399,166,27,128516,26,128624},
-       {0x39a,365,70,128780,69,129060},
-       {0x39b,351,41,129474,40,129638},
-       {0x39c,444,49,129878,47,130074},
-       {0x39d,361,47,130356,50,130544},
-       {0x39e,321,62,130844,54,131092},
-       {0x39f,361,63,131416,60,131668},
-       {0x3a0,361,52,132028,52,132236},
-       {0x3a1,278,66,132548,69,132812},
-       {0x3a2,0,0,133226,0,133226},
-       {0x3a3,311,24,133226,22,133322},
-       {0x3a4,305,32,133454,30,133582},
-       {0x3a5,361,55,133762,56,133982},
-       {0x3a6,381,76,134318,77,134622},
-       {0x3a7,361,82,135084,80,135412},
-       {0x3a8,372,81,135892,81,136216},
-       {0x3a9,372,62,136702,60,136950},
-       {0x3aa,166,71,137310,62,137594},
-       {0x3ab,361,99,137966,92,138362},
-       {0x3ac,271,84,138914,80,139250},
-       {0x3ad,219,111,139730,110,140174},
-       {0x3ae,256,71,140834,72,141118},
-       {0x3af,137,52,141550,54,141758},
-       {0x3b0,262,119,142082,110,142558},
-       {0x3b1,271,66,143218,64,143482},
-       {0x3b2,247,96,143866,99,144250},
-       {0x3b3,237,47,144844,48,145032},
-       {0x3b4,250,83,145320,80,145652},
-       {0x3b5,219,94,146132,94,146508},
-       {0x3b6,220,100,147072,101,147472},
-       {0x3b7,256,55,148078,56,148298},
-       {0x3b8,247,57,148634,56,148862},
-       {0x3b9,137,34,149198,38,149334},
-       {0x3ba,250,64,149562,66,149818},
-       {0x3bb,248,48,150214,47,150406},
-       {0x3bc,263,64,150688,63,150944},
-       {0x3bd,227,33,151322,35,151454},
-       {0x3be,220,137,151664,139,152212},
-       {0x3bf,252,43,153046,41,153218},
-       {0x3c0,250,67,153464,69,153732},
-       {0x3c1,247,55,154146,53,154366},
-       {0x3c2,220,79,154684,79,155000},
-       {0x3c3,273,45,155474,43,155654},
-       {0x3c4,238,46,155912,44,156096},
-       {0x3c5,262,58,156360,58,156592},
-       {0x3c6,311,73,156940,72,157232},
-       {0x3c7,250,52,157664,51,157872},
-       {0x3c8,347,54,158178,55,158394},
-       {0x3c9,312,91,158724,90,159088},
-       {0x3d1,276,96,159628,99,160012},
-       {0x3d5,311,63,160606,64,160858},
-       {0x3d6,381,95,161242,96,161622},
-       {0x3f0,275,77,162198,76,162506},
-       {0x3f1,250,63,162962,62,163214},
-       {0x3f5,219,51,163586,50,163790},
-       {0x410,356,47,164090,50,164278},
-       {0x411,305,63,164578,60,164830},
-       {0x412,325,92,165190,90,165558},
-       {0x413,285,38,166098,38,166250},
-       {0x414,332,71,166478,73,166762},
-       {0x415,314,56,167200,54,167424},
-       {0x416,510,145,167748,143,168328},
-       {0x417,287,90,169186,89,169546},
-       {0x418,361,58,170080,55,170312},
-       {0x419,361,107,170642,104,171070},
-       {0x41a,344,100,171694,99,172094},
-       {0x41b,341,64,172688,64,172944},
-       {0x41c,446,48,173328,47,173520},
-       {0x41d,362,60,173802,56,174042},
-       {0x41e,364,63,174378,60,174630},
-       {0x41f,362,52,174990,52,175198},
-       {0x420,285,65,175510,69,175770},
-       {0x421,338,71,176184,72,176468},
-       {0x422,309,32,176900,30,177028},
-       {0x423,355,75,177208,78,177508},
-       {0x424,384,76,177976,77,178280},
-       {0x425,358,82,178742,80,179070},
-       {0x426,357,59,179550,63,179786},
-       {0x427,328,64,180164,63,180420},
-       {0x428,497,71,180798,78,181082},
-       {0x429,497,81,181550,89,181874},
-       {0x42a,368,53,182408,50,182620},
-       {0x42b,441,80,182920,75,183240},
-       {0x42c,305,51,183690,48,183894},
-       {0x42d,325,76,184182,76,184486},
-       {0x42e,450,93,184942,89,185314},
-       {0x42f,318,64,185848,64,186104},
-       {0x430,224,113,186488,114,186940},
-       {0x431,253,79,187624,78,187940},
-       {0x432,237,84,188408,84,188744},
-       {0x433,196,34,189248,32,189384},
-       {0x434,231,59,189576,64,189812},
-       {0x435,233,49,190196,48,190392},
-       {0x436,360,144,190680,148,191256},
-       {0x437,194,85,192144,88,192484},
-       {0x438,262,56,193012,55,193236},
-       {0x439,262,106,193566,103,193990},
-       {0x43a,251,85,194608,87,194948},
-       {0x43b,249,63,195470,64,195722},
-       {0x43c,308,48,196106,48,196298},
-       {0x43d,262,58,196586,56,196818},
-       {0x43e,256,53,197154,50,197366},
-       {0x43f,262,52,197666,52,197874},
-       {0x440,249,71,198186,72,198470},
-       {0x441,228,63,198902,60,199154},
-       {0x442,217,40,199514,38,199674},
-       {0x443,245,69,199902,73,200178},
-       {0x444,338,134,200616,136,201152},
-       {0x445,244,77,201968,81,202276},
-       {0x446,262,57,202762,59,202990},
-       {0x447,256,62,203344,63,203592},
-       {0x448,383,76,203970,78,204274},
-       {0x449,383,82,204742,85,205070},
-       {0x44a,269,56,205580,54,205804},
-       {0x44b,334,77,206128,75,206436},
-       {0x44c,228,49,206886,48,207082},
-       {0x44d,222,54,207370,55,207586},
-       {0x44e,368,81,207916,79,208240},
-       {0x44f,235,59,208714,59,208950},
-       {0x210f,289,94,209304,101,209680},
-       {0x2111,381,130,210286,125,210806},
-       {0x2113,0,0,211556,0,211556},
-       {0x211c,436,132,211556,135,212084},
-       {0x2190,463,40,212894,44,213054},
-       {0x2191,255,39,213318,44,213474},
-       {0x2192,463,41,213738,44,213902},
-       {0x2193,255,38,214166,44,214318},
-       {0x2194,463,75,214582,86,214882},
-       {0x2195,255,74,215398,86,215694},
-       {0x2196,463,50,216210,66,216410},
-       {0x2197,463,50,216806,65,217006},
-       {0x2198,463,45,217396,63,217576},
-       {0x2199,463,49,217954,64,218150},
-       {0x2200,280,12,218534,11,218582},
-       {0x2201,231,48,218648,47,218840},
-       {0x2202,235,70,219122,72,219402},
-       {0x2203,280,12,219834,10,219882},
-       {0x2204,280,30,219942,30,220062},
-       {0x2205,381,70,220242,70,220522},
-       {0x2206,365,8,220942,7,220974},
-       {0x2207,365,8,221016,7,221048},
-       {0x2208,342,29,221090,27,221206},
-       {0x2209,342,52,221368,56,221576},
-       {0x220a,242,29,221912,27,222028},
-       {0x220b,342,30,222190,27,222310},
-       {0x220c,342,56,222472,55,222696},
-       {0x220d,242,29,223026,28,223142},
-       {0x220e,272,4,223310,2,223326},
-       {0x220f,500,49,223338,47,223534},
-       {0x2210,500,49,223816,47,224012},
-       {0x2211,457,22,224294,20,224382},
-       {0x2212,342,4,224502,2,224518},
-       {0x2213,342,17,224530,10,224598},
-       {0x2214,342,34,224658,26,224794},
-       {0x2215,261,4,224950,2,224966},
-       {0x2216,213,4,224978,2,224994},
-       {0x2217,261,135,225006,133,225546},
-       {0x2218,175,43,226344,40,226516},
-       {0x2219,175,21,226756,18,226840},
-       {0x221a,463,19,226948,18,227024},
-       {0x221b,463,93,227132,93,227504},
-       {0x221c,463,35,228062,30,228202},
-       {0x221d,342,65,228382,65,228642},
-       {0x221e,463,85,229032,85,229372},
-       {0x221f,342,6,229882,4,229906},
-       {0x2220,342,6,229930,4,229954},
-       {0x2221,342,33,229978,42,230110},
-       {0x2222,342,48,230362,52,230554},
-       {0x2223,132,4,230866,2,230882},
-       {0x2224,202,12,230894,8,230942},
-       {0x2225,261,9,230990,4,231026},
-       {0x2226,304,20,231050,14,231130},
-       {0x2227,310,7,231214,5,231242},
-       {0x2228,310,7,231272,5,231300},
-       {0x2229,310,26,231330,25,231434},
-       {0x222a,310,26,231584,24,231688},
-       {0x222b,229,67,231832,70,232100},
-       {0x222c,350,137,232520,140,233068},
-       {0x222d,471,205,233908,210,234728},
-       {0x222e,249,117,235988,126,236456},
-       {0x222f,370,209,237212,232,238048},
-       {0x2260,342,20,239440,18,239520},
-       {0x2261,342,14,239628,6,239684},
-       {0x2262,342,28,239720,26,239832},
-       {0x2263,342,19,239988,8,240064},
-       {0x2264,342,12,240112,7,240160},
-       {0x2265,342,12,240202,7,240250},
-       {0x2266,342,17,240292,9,240360},
-       {0x2267,342,17,240414,9,240482},
-       {0x2268,342,28,240536,23,240648},
-       {0x2269,342,28,240786,23,240898},
-       {0x226a,466,15,241036,10,241096},
-       {0x226b,466,15,241156,10,241216},
-       {0x226c,233,80,241276,84,241596},
-       {0x226d,342,55,242100,60,242320},
-       {0x226e,342,20,242680,19,242760},
-       {0x226f,342,20,242874,19,242954},
-       {0x27c2,346,8,243068,6,243100}
-};
-short mgl_buf_fnt[243136] = {
-88,88,94,88,117,278,117,282,118,286,118,297,117,311,113,322,108,331,101,336,92,338,81,336,74,331,69,323,66,312,65,300,65,289,66,284,66,278,16383,16383,118,21,116,30,113,37,107,43,100,47,92,49,83,47,76,43,70,37,66,30,65,22,66,13,70,6,75,0,82,-2,91,-3,100,-2,107,0,113,6,116,13,118,21,150,215,154,243,158,268,162,289,165,306,166,318,165,324,162,330,157,334,151,337,145,338,138,337,132,334,127,330,124,324,123,316,124,307,126,291,129,270,134,244,139,215,16383,16383,65,215,70,243,75,268,78,289,80,306,81,318,80,324,77,330,73,334,67,337,60,338,53,337,47,334,42,330,40,324,39,316,39,307,42,291,45,270,
-107,43,107,0,113,37,113,37,107,0,113,6,113,37,113,6,116,30,116,30,113,6,116,13,116,30,116,13,118,21,65,22,66,13,66,30,66,30,66,13,70,6,66,30,70,6,70,37,70,37,70,6,75,0,70,37,75,0,76,43,76,43,75,0,82,-2,76,43,82,-2,83,47,83,47,82,-2,91,-3,83,47,91,-3,92,49,92,49,91,-3,100,-2,92,49,100,-2,100,47,100,47,100,-2,107,0,100,47,107,0,107,43,118,297,117,311,117,278,118,297,117,278,117,282,118,297,117,282,118,286,118,297,118,286,118,290,118,297,118,290,118,294,117,278,117,311,113,322,117,278,113,322,108,331,117,278,108,331,101,336,117,278,101,336,94,88,92,338,81,336,88,88,92,338,88,88,94,88,92,338,94,88,101,336,66,284,66,278,69,323,69,323,66,278,88,88,69,323,88,88,74,331,74,331,88,88,81,336,66,312,65,300,65,297,66,312,65,297,65,293,66,312,65,293,65,289,66,312,65,289,66,284,66,312,66,284,69,323,
-150,215,154,243,158,268,162,289,165,306,166,318,165,324,162,330,157,334,151,337,145,338,138,337,132,334,127,330,124,324,123,316,124,307,126,291,129,270,134,244,139,215,16383,16383,65,215,70,243,75,268,78,289,80,306,81,318,80,324,77,330,73,334,67,337,60,338,53,337,47,334,42,330,40,324,39,316,39,307,42,291,45,270,50,244,55,215,248,203,248,230,200,230,214,331,185,331,171,230,104,230,119,331,90,331,75,230,17,230,17,203,71,203,60,136,3,136,3,108,56,108,40,0,69,0,85,108,152,108,137,0,166,0,181,108,235,108,235,136,185,136,195,203,16383,16383,166,203,156,136,89,136,100,203,132,319,154,314,172,304,186,291,197,273,205,250,213,250,213,305,202,314,189,321,
-123,316,124,307,124,324,124,324,124,307,126,291,124,324,126,291,127,330,127,330,126,291,129,270,127,330,129,270,132,334,132,334,129,270,134,244,132,334,134,244,138,337,138,337,134,244,139,215,138,337,139,215,145,338,145,338,139,215,150,215,145,338,150,215,151,337,151,337,150,215,154,243,151,337,154,243,157,334,157,334,154,243,158,268,157,334,158,268,162,330,162,330,158,268,162,289,162,330,162,289,165,324,165,324,162,289,165,306,165,324,165,306,166,318,39,316,39,307,40,324,40,324,39,307,42,291,40,324,42,291,42,330,42,330,42,291,45,270,42,330,45,270,47,334,47,334,45,270,50,244,47,334,50,244,53,337,53,337,50,244,55,215,53,337,55,215,60,338,60,338,55,215,65,215,60,338,65,215,67,337,67,337,65,215,70,243,67,337,70,243,73,334,73,334,70,243,75,268,73,334,75,268,77,330,77,330,75,268,78,289,77,330,78,289,80,324,80,324,78,289,80,306,80,324,80,306,81,318,
-248,203,248,230,200,230,214,331,185,331,171,230,104,230,119,331,90,331,75,230,17,230,17,203,71,203,60,136,3,136,3,108,56,108,40,0,69,0,85,108,152,108,137,0,166,0,181,108,235,108,235,136,185,136,195,203,16383,16383,166,203,156,136,89,136,100,203,132,319,154,314,172,304,186,291,197,273,205,250,213,250,213,305,202,314,189,321,173,326,155,330,132,332,132,363,115,363,115,332,88,328,64,319,44,304,31,283,26,257,29,234,38,214,54,196,79,177,115,155,115,14,90,17,69,27,52,42,38,63,30,90,22,90,
-90,331,75,230,85,108,85,108,75,230,71,203,85,108,71,203,69,0,69,0,71,203,60,136,69,0,60,136,56,108,56,108,60,136,3,136,56,108,3,136,3,108,17,230,17,203,71,203,17,230,71,203,75,230,90,331,85,108,89,136,90,331,89,136,100,203,90,331,100,203,104,230,90,331,104,230,119,331,185,331,171,230,181,108,181,108,171,230,166,203,181,108,166,203,166,0,166,0,166,203,156,136,166,0,156,136,152,108,152,108,156,136,89,136,152,108,89,136,85,108,104,230,100,203,166,203,104,230,166,203,171,230,200,230,214,331,195,203,195,203,214,331,185,331,195,203,185,331,185,136,185,136,185,331,181,108,185,136,181,108,235,108,200,230,195,203,248,203,200,230,248,203,248,230,185,136,235,108,235,136,166,0,152,108,137,0,69,0,56,108,40,0,
-132,319,154,314,172,304,186,291,197,273,205,250,213,250,213,305,202,314,189,321,173,326,155,330,132,332,132,363,115,363,115,332,88,328,64,319,44,304,31,283,26,257,29,234,38,214,54,196,79,177,115,155,115,14,90,17,69,27,52,42,38,63,30,90,22,90,22,26,38,16,54,9,71,4,91,1,115,0,115,-43,132,-43,132,0,164,6,191,17,211,32,224,54,229,85,228,96,227,105,225,115,222,123,219,130,210,141,199,152,185,164,163,178,132,195,16383,16383,115,204,93,219,79,232,69,243,64,254,63,266,65,281,71,293,81,304,96,313,115,319,16383,16383,132,147,156,132,172,118,182,105,188,90,189,74,187,55,181,40,170,28,154,20,132,14,343,107,341,127,335,143,325,155,312,163,295,165,267,159,241,143,220,120,206,91,200,60,203,38,212,18,225,4,242,-5,261,-8,286,-2,309,14,327,39,339,71,343,107,16383,16383,331,108,328,77,318,48,303,25,285,10,265,4,255,6,248,10,242,18,238,27,237,38,239,59,244,82,252,103,263,123,276,140,280,144,284,147,290,149,295,151,300,151,311,149,319,143,326,134,330,122,331,108,16383,16383,310,353,289,353,265,331,248,317,235,309,221,305,194,305,185,307,176,311,167,317,157,324,150,330,144,334,138,336,133,338,127,338,97,332,71,317,50,293,36,264,31,232,34,209,42,191,54,176,70,166,89,163,99,164,108,166,116,169,132,181,146,197,157,215,
-132,319,154,314,155,330,155,330,154,314,172,304,155,330,172,304,173,326,173,326,172,304,186,291,173,326,186,291,189,321,189,321,186,291,197,273,189,321,197,273,202,314,202,314,197,273,205,250,202,314,205,250,213,305,213,305,205,250,213,250,228,96,227,105,229,85,229,85,227,105,225,115,229,85,225,115,224,54,224,54,225,115,222,123,224,54,222,123,219,130,211,32,224,54,219,130,211,32,219,130,210,141,211,32,210,141,199,152,211,32,199,152,191,17,191,17,199,152,189,74,191,17,189,74,187,55,191,17,187,55,181,40,191,17,181,40,170,28,191,17,170,28,164,6,188,90,189,74,199,152,188,90,199,152,185,164,188,90,185,164,182,105,132,147,156,132,163,178,163,178,156,132,172,118,163,178,172,118,185,164,185,164,172,118,182,105,132,14,132,147,132,195,132,14,132,195,115,155,132,14,115,155,132,-43,132,332,132,363,115,155,132,332,115,155,132,195,132,332,132,195,132,319,132,332,132,319,155,330,115,0,115,155,115,14,115,0,115,14,91,1,91,1,115,14,90,17,91,1,90,17,71,4,71,4,90,17,69,27,71,4,69,27,54,9,54,9,69,27,52,42,54,9,52,42,38,63,38,16,54,9,38,63,38,16,38,63,30,90,38,16,30,90,22,90,38,16,22,90,22,26,132,363,115,363,115,319,115,319,115,363,115,332,115,319,115,155,132,363,71,293,81,304,88,328,88,328,81,304,96,313,88,328,96,313,115,332,115,332,96,313,115,319,64,319,44,304,54,196,64,319,54,196,63,266,64,319,63,266,65,281,64,319,65,281,71,293,64,319,71,293,88,328,63,266,54,196,64,254,64,254,54,196,79,177,64,254,79,177,69,243,69,243,79,177,79,232,26,257,29,234,31,283,31,283,29,234,38,214,31,283,38,214,44,304,44,304,38,214,54,196,79,232,79,177,93,219,93,219,79,177,115,155,93,219,115,155,115,204,115,204,115,155,115,319,164,6,170,28,154,20,164,6,154,20,132,14,164,6,132,14,132,0,132,-43,115,155,115,0,132,-43,115,0,115,-43,132,195,132,147,163,178,
-343,107,341,127,335,143,325,155,312,163,295,165,267,159,241,143,220,120,206,91,200,60,203,38,212,18,225,4,242,-5,261,-8,286,-2,309,14,327,39,339,71,343,107,16383,16383,331,108,328,77,318,48,303,25,285,10,265,4,255,6,248,10,242,18,238,27,237,38,239,59,244,82,252,103,263,123,276,140,280,144,284,147,290,149,295,151,300,151,311,149,319,143,326,134,330,122,331,108,16383,16383,310,353,289,353,265,331,248,317,235,309,221,305,194,305,185,307,176,311,167,317,157,324,150,330,144,334,138,336,133,338,127,338,97,332,71,317,50,293,36,264,31,232,34,209,42,191,54,176,70,166,89,163,99,164,108,166,116,169,132,181,146,197,157,215,165,234,171,255,172,276,172,289,171,294,171,299,179,296,187,294,194,292,201,292,209,291,223,292,236,295,247,301,258,309,269,320,72,-8,95,-8,16383,16383,161,285,157,251,148,222,133,198,115,182,94,176,85,178,77,183,71,190,67,200,66,211,67,228,70,245,75,262,82,278,90,293,95,302,101,309,107,314,115,319,126,325,135,316,140,312,144,310,148,307,153,305,157,301,159,297,160,292,161,285,368,55,359,45,350,38,342,33,332,30,321,29,304,31,288,36,274,46,259,58,246,75,260,96,273,115,284,134,296,152,309,173,316,184,323,192,332,198,342,201,355,203,355,213,248,213,248,203,261,201,270,197,276,193,279,187,280,179,278,165,273,150,264,133,251,113,234,89,218,107,205,126,192,146,180,167,168,192,199,207,221,222,235,238,243,256,246,276,242,298,233,315,218,328,199,335,177,338,153,335,132,325,116,309,105,288,101,263,101,250,103,237,106,223,111,207,118,189,99,177,72,158,50,138,34,116,24,92,21,69,25,42,36,20,53,5,77,-3,107,-6,130,-4,151,0,172,9,193,22,214,39,233,22,250,9,266,0,283,-4,300,-6,319,-3,336,3,352,14,365,30,375,50,16383,16383,219,278,217,261,211,246,200,233,183,220,161,208,152,225,146,239,143,253,141,266,141,281,142,294,148,306,156,315,167,320,180,322,193,320,204,314,212,304,217,292,219,278,16383,16383,202,52,185,40,170,31,155,25,142,21,129,20,109,23,92,31,79,45,70,64,67,87,69,106,75,124,86,140,103,155,126,171,142,141,156,115,170,92,202,52,50,215,56,244,
-326,134,330,122,335,143,335,143,330,122,331,108,339,71,331,108,328,77,339,71,328,77,327,39,327,39,328,77,318,48,327,39,318,48,309,14,309,14,318,48,303,25,309,14,303,25,286,-2,286,-2,303,25,285,10,286,-2,285,10,265,4,265,4,255,6,261,-8,261,-8,255,6,248,10,261,-8,248,10,242,18,242,-5,261,-8,242,18,242,-5,242,18,238,27,242,-5,238,27,237,38,242,-5,237,38,225,4,244,82,252,103,267,159,267,159,252,103,263,123,267,159,263,123,276,140,276,140,280,144,295,165,295,165,280,144,284,147,295,165,284,147,290,149,241,143,220,120,225,4,241,143,225,4,237,38,241,143,237,38,239,59,241,143,239,59,244,82,241,143,244,82,267,159,200,60,203,38,206,91,206,91,203,38,212,18,206,91,212,18,220,120,220,120,212,18,225,4,326,134,325,155,319,143,319,143,325,155,312,163,319,143,312,163,311,149,311,149,312,163,300,151,295,151,300,151,295,165,295,151,295,165,290,149,295,165,267,159,276,140,312,163,295,165,300,151,339,71,343,107,341,127,339,71,341,127,335,143,339,71,335,143,331,108,265,4,261,-8,286,-2,67,228,70,245,71,317,71,317,70,245,75,262,71,317,75,262,97,332,97,332,75,262,82,278,97,332,82,278,90,293,90,293,95,302,97,332,97,332,95,302,101,309,97,332,101,309,127,338,127,338,101,309,107,314,127,338,107,314,115,319,77,183,89,163,85,178,85,178,89,163,94,176,115,182,94,176,99,164,115,182,99,164,108,166,71,190,67,200,70,166,71,190,70,166,89,163,71,190,89,163,77,183,67,200,66,211,70,166,70,166,66,211,54,176,54,176,66,211,71,317,71,317,66,211,67,228,148,307,153,305,150,330,148,307,150,330,144,310,144,310,150,330,144,334,144,310,144,334,140,312,140,312,144,334,138,336,140,312,138,336,135,316,135,316,138,336,133,338,135,316,133,338,131,320,131,320,133,338,127,338,131,320,127,338,126,325,247,301,248,317,236,295,236,295,248,317,235,309,236,295,235,309,223,292,223,292,235,309,221,305,223,292,221,305,209,291,209,291,221,305,205,305,194,305,185,307,187,294,194,305,187,294,194,292,194,305,194,292,201,292,194,305,201,292,205,305,176,311,171,299,179,296,176,311,179,296,185,307,185,307,179,296,187,294,167,317,157,324,157,301,167,317,157,301,159,297,167,317,159,297,160,292,167,317,160,292,161,285,167,317,161,285,165,234,167,317,165,234,171,255,167,317,171,255,171,299,167,317,171,299,176,311,124,175,132,181,133,198,133,198,132,181,146,197,133,198,146,197,148,222,148,222,146,197,157,215,148,222,157,215,157,251,157,251,157,215,165,234,157,251,165,234,161,285,310,353,289,353,269,320,269,320,289,353,265,331,269,320,265,331,258,309,258,309,265,331,248,317,258,309,248,317,247,301,269,320,72,-8,95,-8,269,320,95,-8,310,353,172,276,172,281,172,285,172,276,172,285,172,289,172,276,172,289,171,294,172,276,171,294,171,299,172,276,171,299,171,255,116,169,124,175,133,198,116,169,133,198,115,182,116,169,115,182,108,166,157,324,150,330,153,305,157,324,153,305,157,301,31,232,34,209,36,264,36,264,34,209,42,191,36,264,42,191,50,293,50,293,42,191,54,176,50,293,54,176,71,317,94,176,89,163,99,164,127,338,115,319,126,325,209,291,205,305,201,292,325,155,326,134,335,143,
-368,55,359,45,350,38,342,33,332,30,321,29,304,31,288,36,274,46,259,58,246,75,260,96,273,115,284,134,296,152,309,173,316,184,323,192,332,198,342,201,355,203,355,213,248,213,248,203,261,201,270,197,276,193,279,187,280,179,278,165,273,150,264,133,251,113,234,89,218,107,205,126,192,146,180,167,168,192,199,207,221,222,235,238,243,256,246,276,242,298,233,315,218,328,199,335,177,338,153,335,132,325,116,309,105,288,101,263,101,250,103,237,106,223,111,207,118,189,99,177,72,158,50,138,34,116,24,92,21,69,25,42,36,20,53,5,77,-3,107,-6,130,-4,151,0,172,9,193,22,214,39,233,22,250,9,266,0,283,-4,300,-6,319,-3,336,3,352,14,365,30,375,50,16383,16383,219,278,217,261,211,246,200,233,183,220,161,208,152,225,146,239,143,253,141,266,141,281,142,294,148,306,156,315,167,320,180,322,193,320,204,314,212,304,217,292,219,278,16383,16383,202,52,185,40,170,31,155,25,142,21,129,20,109,23,92,31,79,45,70,64,67,87,69,106,75,124,86,140,103,155,126,171,142,141,156,115,170,92,202,52,50,215,56,244,60,269,64,290,66,306,66,324,63,330,59,334,53,337,46,338,39,337,33,334,28,330,25,324,24,317,25,306,27,289,31,268,35,243,40,215,152,-79,116,-44,92,-8,77,31,69,76,67,127,69,180,77,223,92,261,116,295,152,330,147,338,104,307,69,270,44,227,29,179,24,126,29,75,44,27,69,-17,103,-56,146,-88,15,330,51,295,76,259,90,219,97,174,99,122,97,69,90,26,75,-11,51,-45,15,-79,19,-88,62,-56,97,-19,122,23,137,71,142,123,137,174,121,222,96,267,63,306,21,338,134,235,147,243,158,248,178,254,190,256,200,258,207,261,212,265,215,270,216,277,215,284,213,289,209,293,204,295,198,296,190,294,183,288,174,281,166,272,159,264,154,259,144,251,130,243,130,262,131,270,133,278,135,287,140,302,142,307,143,312,144,316,144,320,143,326,140,331,136,335,131,337,126,338,120,337,115,335,111,331,109,326,108,321,108,317,110,307,111,301,113,295,115,285,118,276,121,249,121,243,110,249,101,255,93,262,85,270,76,280,70,286,65,290,60,293,56,295,51,296,46,295,41,292,38,288,36,283,
-153,335,132,325,142,294,142,294,132,325,141,281,142,141,141,281,132,325,142,141,132,325,126,171,118,189,103,155,126,171,118,189,126,171,132,325,118,189,132,325,116,309,118,189,116,309,111,207,99,177,72,158,75,124,99,177,75,124,86,140,99,177,86,140,103,155,99,177,103,155,118,189,72,158,50,138,53,5,72,158,53,5,67,87,72,158,67,87,69,106,72,158,69,106,75,124,79,45,70,64,77,-3,77,-3,70,64,67,87,53,5,50,138,36,20,36,20,50,138,34,116,36,20,34,116,25,42,25,42,34,116,24,92,25,42,24,92,21,69,101,250,103,237,105,288,105,288,103,237,106,223,105,288,106,223,116,309,116,309,106,223,111,207,185,40,170,31,172,9,172,9,170,31,155,25,172,9,155,25,151,0,151,0,155,25,142,21,151,0,142,21,130,-4,130,-4,142,21,129,20,109,23,92,31,107,-6,109,23,107,-6,130,-4,109,23,130,-4,129,20,79,45,77,-3,107,-6,79,45,107,-6,92,31,246,75,251,113,234,89,246,75,234,89,250,9,250,9,234,89,233,22,233,22,234,89,218,107,233,22,218,107,214,39,214,39,218,107,205,126,214,39,205,126,202,52,202,52,205,126,192,146,202,52,192,146,186,72,186,72,192,146,180,167,186,72,180,167,170,92,170,92,180,167,168,192,170,92,168,192,161,208,156,115,170,92,161,208,156,115,161,208,152,225,156,115,152,225,146,239,156,115,146,239,143,253,156,115,143,253,142,141,141,266,141,281,142,141,141,266,142,141,143,253,142,294,148,306,153,335,153,335,148,306,156,315,153,335,156,315,177,338,177,338,156,315,167,320,177,338,167,320,180,322,180,322,193,320,199,335,199,335,193,320,204,314,199,335,204,314,218,328,218,328,204,314,212,304,218,328,212,304,217,292,217,261,221,222,219,278,219,278,221,222,233,315,233,315,221,222,235,238,233,315,235,238,242,298,242,298,235,238,243,256,242,298,243,256,246,276,218,328,217,292,219,278,218,328,219,278,233,315,199,335,177,338,180,322,183,220,168,192,199,207,183,220,199,207,200,233,200,233,199,207,221,222,200,233,221,222,211,246,211,246,221,222,217,261,183,220,161,208,168,192,193,22,214,39,202,52,193,22,202,52,185,40,193,22,185,40,172,9,246,75,250,9,259,58,259,58,250,9,266,0,259,58,266,0,274,46,274,46,266,0,283,-4,274,46,283,-4,288,36,288,36,283,-4,300,-6,288,36,300,-6,304,31,304,31,300,-6,319,-3,304,31,319,-3,321,29,321,29,319,-3,336,3,321,29,336,3,332,30,270,197,276,193,355,213,355,213,276,193,279,187,355,213,279,187,280,179,280,179,284,134,296,152,280,179,296,152,309,173,309,173,316,184,280,179,280,179,316,184,323,192,280,179,323,192,332,198,342,201,355,203,355,213,342,201,355,213,332,198,332,198,355,213,280,179,261,201,270,197,355,213,261,201,355,213,248,213,261,201,248,213,248,203,280,179,278,165,284,134,284,134,278,165,273,150,284,134,273,150,273,115,273,115,273,150,264,133,273,115,264,133,260,96,260,96,264,133,251,113,260,96,251,113,246,75,375,50,368,55,365,30,365,30,368,55,359,45,365,30,359,45,352,14,352,14,359,45,350,38,352,14,350,38,342,33,342,33,332,30,336,3,342,33,336,3,352,14,77,-3,67,87,53,5,101,250,105,288,101,263,
-50,215,56,244,60,269,64,290,66,306,66,324,63,330,59,334,53,337,46,338,39,337,33,334,28,330,25,324,24,317,25,306,27,289,31,268,35,243,40,215,152,-79,116,-44,92,-8,77,31,69,76,67,127,69,180,77,223,92,261,116,295,152,330,147,338,104,307,69,270,44,227,29,179,24,126,29,75,44,27,69,-17,
-24,317,25,306,25,324,25,324,25,306,27,289,25,324,27,289,28,330,28,330,27,289,31,268,28,330,31,268,33,334,33,334,31,268,35,243,33,334,35,243,39,337,39,337,35,243,40,215,39,337,40,215,46,338,46,338,40,215,50,215,46,338,50,215,53,337,53,337,50,215,56,244,53,337,56,244,59,334,59,334,56,244,60,269,59,334,60,269,63,330,63,330,60,269,64,290,63,330,64,290,66,324,66,324,64,290,66,306,66,324,66,306,66,318,
-152,-79,116,-44,92,-8,77,31,69,76,67,127,69,180,77,223,92,261,116,295,152,330,147,338,104,307,69,270,44,227,29,179,24,126,29,75,44,27,69,-17,103,-56,146,-88,15,330,51,295,76,259,90,219,97,174,99,122,97,69,90,26,75,-11,51,-45,15,-79,19,-88,62,-56,97,-19,122,23,137,71,142,123,137,174,121,222,96,267,63,306,21,338,
-24,126,29,75,29,179,29,179,29,75,44,27,29,179,44,27,44,227,44,227,44,27,69,-17,44,227,69,-17,67,127,67,127,69,270,44,227,116,295,152,330,147,338,116,295,147,338,104,307,116,295,104,307,92,261,67,127,69,180,69,270,69,270,69,180,77,223,69,270,77,223,104,307,104,307,77,223,92,261,116,-44,92,-8,103,-56,116,-44,103,-56,146,-88,116,-44,146,-88,152,-79,77,31,69,76,69,-17,77,31,69,-17,103,-56,77,31,103,-56,92,-8,67,127,69,-17,69,76,
-15,330,51,295,76,259,90,219,97,174,99,122,97,69,90,26,75,-11,51,-45,15,-79,19,-88,62,-56,97,-19,122,23,137,71,142,123,137,174,121,222,96,267,63,306,21,338,134,235,147,243,158,248,178,254,190,256,200,258,207,261,212,265,215,270,216,277,215,284,213,289,209,293,204,295,198,296,190,294,183,288,174,281,166,272,159,264,154,259,144,251,
-97,174,99,122,99,122,122,23,99,122,97,69,122,23,97,69,97,-19,97,-19,97,69,90,26,97,-19,90,26,75,-11,97,174,99,122,121,222,121,222,99,122,122,23,121,222,122,23,137,174,137,174,122,23,137,71,137,174,137,71,142,123,96,267,63,306,76,259,96,267,76,259,90,219,96,267,90,219,97,174,96,267,97,174,121,222,51,295,76,259,63,306,51,295,63,306,21,338,51,295,21,338,15,330,15,-79,19,-88,51,-45,51,-45,19,-88,62,-56,51,-45,62,-56,75,-11,75,-11,62,-56,97,-19,
-134,235,147,243,158,248,178,254,190,256,200,258,207,261,212,265,215,270,216,277,215,284,213,289,209,293,204,295,198,296,190,294,183,288,174,281,166,272,159,264,154,259,144,251,130,243,130,262,131,270,133,278,135,287,140,302,142,307,143,312,144,316,144,320,143,326,140,331,136,335,131,337,126,338,120,337,115,335,111,331,109,326,108,321,108,317,110,307,111,301,113,295,115,285,118,276,121,249,121,243,110,249,101,255,93,262,85,270,76,280,70,286,65,290,60,293,56,295,51,296,46,295,41,292,38,288,36,283,35,277,36,270,40,265,46,261,56,257,69,254,78,252,87,249,97,246,106,242,117,235,106,229,97,224,88,221,78,218,65,215,53,213,45,210,39,205,35,200,34,193,35,187,37,182,41,178,46,176,52,175,57,176,61,177,65,179,74,188,81,196,92,207,94,210,97,212,105,218,112,222,121,228,121,224,120,212,119,201,118,192,115,183,113,174,111,169,109,163,108,159,107,154,107,151,108,145,110,140,114,136,119,133,124,132,130,133,136,136,140,141,143,146,145,152,144,154,144,157,143,161,141,164,140,169,136,179,130,212,130,228,134,225,140,221,147,217,153,212,161,205,169,196,175,188,182,182,187,178,193,175,199,175,205,176,210,178,216,188,217,194,215,201,212,206,206,210,198,213,186,215,176,218,165,220,147,228,138,233,318,110,318,143,188,143,188,273,155,273,155,143,24,143,24,110,155,110,155,-20,188,-20,188,110,41,-69,60,-58,76,-44,88,-27,95,-10,98,7,96,22,90,34,81,43,70,49,57,51,47,49,39,46,33,40,29,32,27,22,29,13,32,6,38,1,46,-1,56,-2,60,-2,63,-1,66,-1,68,0,73,0,75,-1,78,-4,78,-6,76,-16,71,-27,63,-38,51,-49,36,-60,142,97,142,128,20,128,20,97,90,22,89,30,85,38,79,44,71,49,63,50,54,49,46,45,40,39,37,31,35,22,37,13,40,6,46,0,54,-3,63,-5,71,-3,79,0,85,6,89,13,90,22,143,338,110,338,-3,-6,30,-6,238,165,232,222,218,270,194,307,164,330,127,338,84,329,52,304,29,266,16,220,12,168,16,118,27,71,48,31,80,3,125,-6,168,2,200,29,222,67,234,114,238,165,16383,16383,190,162,187,108,179,65,166,33,148,13,125,6,102,13,84,33,71,65,63,109,60,165,63,220,71,265,84,298,101,318,124,325,148,318,166,298,179,265,187,219,190,162,197,0,197,7,178,8,164,12,155,18,151,27,150,38,150,336,145,338,55,292,55,286,69,291,74,293,84,295,88,296,92,296,97,295,101,293,104,288,106,281,107,272,107,47,105,33,100,22,92,14,78,10,59,7,59,0,237,69,230,71,221,57,212,48,203,42,193,39,182,38,65,38,
-69,254,69,254,78,252,69,254,78,252,70,286,69,254,70,286,65,290,69,254,65,290,60,293,69,254,60,293,56,295,69,254,56,295,56,257,51,296,46,295,46,261,51,296,46,261,56,257,51,296,56,257,56,295,36,283,36,270,38,288,38,288,36,270,40,265,38,288,40,265,41,292,41,292,40,265,46,261,41,292,46,261,46,295,81,196,86,201,88,221,88,221,86,201,89,204,88,221,89,204,97,224,97,224,89,204,92,207,97,224,92,207,94,210,94,210,97,212,97,224,97,224,97,212,106,229,78,218,65,215,69,183,78,218,69,183,74,188,78,218,74,188,81,196,78,218,81,196,88,221,110,140,114,136,111,169,111,169,114,136,113,174,115,183,113,174,114,136,115,183,114,136,119,133,144,157,143,161,143,146,144,157,143,146,145,152,144,157,145,152,144,154,141,164,140,169,140,141,141,164,140,141,143,146,141,164,143,146,143,161,136,179,134,190,136,136,136,179,136,136,140,141,136,179,140,141,140,169,134,190,132,201,136,136,136,136,132,201,130,212,136,136,130,212,130,133,130,133,130,212,130,224,126,338,120,337,120,258,126,338,120,258,121,249,126,338,121,249,121,228,126,338,121,228,124,132,126,338,124,132,130,133,126,338,130,133,130,224,126,338,130,224,130,243,126,338,130,243,130,255,126,338,130,255,131,337,121,243,121,228,121,249,120,337,115,335,115,285,120,337,115,285,118,276,120,337,118,276,119,267,120,337,119,267,120,258,113,295,115,285,115,335,113,295,115,335,111,331,113,295,111,331,111,301,204,295,198,296,200,258,200,258,198,296,190,294,200,258,190,294,190,256,190,256,190,294,183,288,190,256,183,288,178,254,178,254,183,288,174,281,178,254,174,281,168,251,168,251,174,281,166,272,168,251,166,272,159,264,159,264,154,259,158,248,158,248,154,259,149,255,158,248,149,255,147,243,147,243,149,255,144,251,147,243,144,251,137,247,130,243,130,228,134,225,130,243,134,225,134,235,130,243,134,235,137,247,137,247,134,235,147,243,176,218,165,220,169,196,176,218,169,196,175,188,176,218,175,188,182,182,176,218,182,182,186,215,199,175,205,176,206,210,206,210,205,176,210,178,206,210,210,178,212,206,212,206,210,178,213,183,212,206,213,183,215,201,215,201,213,183,216,188,215,201,216,188,217,194,198,213,186,215,187,178,198,213,187,178,193,175,198,213,193,175,199,175,198,213,199,175,206,210,216,277,215,284,215,270,215,270,215,284,213,289,215,270,213,289,212,265,212,265,213,289,209,293,212,265,209,293,207,261,207,261,209,293,204,295,207,261,204,295,200,258,159,264,158,248,168,251,161,205,169,196,165,220,161,205,165,220,156,224,161,205,156,224,153,212,147,228,138,233,140,221,147,228,140,221,147,217,147,228,147,217,153,212,147,228,153,212,156,224,143,326,140,331,142,307,143,326,142,307,143,312,143,326,143,312,144,316,143,326,144,316,144,320,133,278,135,287,136,335,136,335,135,287,138,296,136,335,138,296,140,331,140,331,138,296,140,302,140,331,140,302,142,307,131,337,130,255,130,262,131,337,130,262,131,270,131,337,131,270,133,278,131,337,133,278,136,335,134,235,134,225,140,221,134,235,140,221,138,233,124,132,121,228,121,224,124,132,121,224,120,212,124,132,120,212,119,201,124,132,119,201,119,133,118,192,115,183,119,133,118,192,119,133,119,201,101,215,105,218,106,229,106,229,105,218,112,222,106,229,112,222,117,235,117,235,112,222,121,228,117,235,121,228,121,243,76,280,78,252,85,270,85,270,78,252,87,249,85,270,87,249,93,262,93,262,87,249,97,246,93,262,97,246,101,255,101,255,97,246,106,242,101,255,106,242,110,249,110,249,106,242,117,235,110,249,117,235,121,243,108,317,109,312,109,326,109,326,109,312,110,307,109,326,110,307,111,331,111,331,110,307,111,301,111,169,109,163,110,140,110,140,109,163,108,159,110,140,108,159,108,145,108,145,108,159,107,154,108,145,107,154,107,151,65,215,53,213,57,176,65,215,57,176,61,177,65,215,61,177,65,179,65,215,65,179,69,183,34,193,35,187,35,200,35,200,35,187,37,182,35,200,37,182,39,205,39,205,37,182,41,178,39,205,41,178,45,210,45,210,41,178,46,176,45,210,46,176,53,213,53,213,46,176,52,175,53,213,52,175,57,176,70,286,78,252,76,280,106,229,97,212,101,215,108,317,109,326,108,321,187,178,186,215,182,182,36,270,36,283,35,277,
-318,110,318,143,188,143,188,273,155,273,155,143,24,143,24,110,155,110,155,-20,188,-20,188,110,41,-69,60,-58,76,-44,88,-27,95,-10,98,7,96,22,90,34,81,43,70,49,57,51,47,49,
-188,273,155,273,188,-20,188,-20,155,273,155,143,188,-20,155,143,155,110,155,110,155,143,24,143,155,110,24,143,24,110,188,110,318,110,188,143,188,143,318,110,318,143,188,-20,155,110,155,-20,
-41,-69,60,-58,76,-44,88,-27,95,-10,98,7,96,22,90,34,81,43,70,49,57,51,47,49,39,46,33,40,29,32,27,22,29,13,32,6,38,1,46,-1,56,-2,60,-2,63,-1,66,-1,68,0,73,0,75,-1,78,-4,78,-6,76,-16,71,-27,63,-38,51,-49,36,-60,142,97,142,128,20,128,20,97,90,22,89,30,85,38,79,44,71,49,63,50,54,49,46,45,40,39,37,31,35,22,37,13,40,6,46,0,54,-3,63,-5,71,-3,79,0,85,6,89,13,90,22,143,338,110,338,-3,-6,30,-6,238,165,232,222,218,270,194,307,164,330,
-63,-1,66,-1,70,49,70,49,66,-1,68,0,70,49,68,0,71,0,71,0,73,0,81,43,81,43,73,0,75,-1,81,43,75,-1,77,-3,27,22,29,13,29,32,29,32,29,13,32,6,29,32,32,6,33,40,33,40,32,6,38,1,33,40,38,1,39,46,39,46,38,1,46,-1,39,46,46,-1,47,49,47,49,46,-1,56,-2,47,49,56,-2,57,51,57,51,56,-2,60,-2,57,51,60,-2,70,49,70,49,60,-2,63,-1,98,7,96,22,95,-10,95,-10,96,22,90,34,95,-10,90,34,88,-27,88,-27,90,34,81,43,88,-27,81,43,78,-6,78,-6,76,-16,88,-27,88,-27,76,-16,76,-44,81,43,77,-3,78,-4,81,43,78,-4,78,-6,81,43,70,49,71,0,36,-60,41,-69,51,-49,51,-49,41,-69,60,-58,51,-49,60,-58,63,-38,63,-38,60,-58,76,-44,63,-38,76,-44,71,-27,71,-27,76,-44,76,-16,
-142,97,142,128,20,128,20,97,90,22,89,30,85,38,79,44,
-142,97,142,128,20,128,142,97,20,128,20,97,
-90,22,89,30,85,38,79,44,71,49,63,50,54,49,46,45,40,39,37,31,35,22,37,13,40,6,46,0,54,-3,63,-5,71,-3,79,0,85,6,89,13,90,22,143,338,110,338,-3,-6,30,-6,238,165,232,222,218,270,194,307,164,330,127,338,84,329,52,304,29,266,16,220,12,168,16,118,27,71,48,31,80,3,125,-6,168,2,
-35,22,37,13,37,31,37,31,37,13,40,6,37,31,40,6,40,39,40,39,40,6,46,0,40,39,46,0,46,45,46,45,46,0,54,-3,46,45,54,-3,54,49,54,49,54,-3,62,-5,54,49,62,-5,63,50,63,50,62,-5,71,-3,63,50,71,-3,71,49,71,49,71,-3,79,0,71,49,79,0,79,44,79,44,79,0,85,6,79,44,85,6,85,38,85,38,85,6,89,13,85,38,89,13,89,30,89,30,89,13,90,22,
-143,338,110,338,-3,-6,30,-6,238,165,232,222,218,270,194,307,
-143,338,110,338,-3,-6,143,338,-3,-6,30,-6,
-238,165,232,222,218,270,194,307,164,330,127,338,84,329,52,304,29,266,16,220,12,168,16,118,27,71,48,31,80,3,125,-6,168,2,200,29,222,67,234,114,238,165,16383,16383,190,162,187,108,179,65,166,33,148,13,125,6,102,13,84,33,71,65,63,109,60,165,63,220,71,265,84,298,101,318,124,325,148,318,166,298,179,265,187,219,190,162,197,0,197,7,178,8,164,12,155,18,151,27,150,38,150,336,145,338,55,292,55,286,69,291,74,293,84,295,88,296,92,296,97,295,101,293,104,288,106,281,107,272,107,47,105,33,100,22,92,14,78,10,59,7,59,0,237,69,230,71,221,57,212,48,203,42,193,39,182,38,65,38,147,126,171,153,189,179,202,203,209,226,211,250,207,278,
-101,318,124,325,124,325,127,338,124,325,148,318,127,338,148,318,164,330,164,330,148,318,166,298,164,330,166,298,194,307,194,307,166,298,179,265,194,307,179,265,187,219,166,33,168,2,179,65,179,65,168,2,200,29,179,65,200,29,187,108,187,108,200,29,190,162,194,307,190,162,200,29,194,307,200,29,218,270,218,270,200,29,222,67,218,270,222,67,232,222,232,222,222,67,234,114,232,222,234,114,238,165,125,6,125,-6,148,13,148,13,125,-6,168,2,148,13,168,2,166,33,71,265,84,298,84,329,84,329,84,298,101,318,84,329,101,318,127,338,127,338,101,318,124,325,12,168,16,118,16,220,16,220,16,118,27,71,16,220,27,71,29,266,29,266,27,71,48,31,29,266,48,31,52,304,52,304,48,31,63,109,52,304,63,109,60,165,60,165,63,220,52,304,52,304,63,220,71,265,52,304,71,265,84,329,102,13,84,33,80,3,102,13,80,3,125,-6,102,13,125,-6,125,6,80,3,84,33,71,65,80,3,71,65,63,109,80,3,63,109,48,31,194,307,187,219,190,162,
-197,0,197,7,178,8,164,12,155,18,151,27,150,38,150,336,145,338,55,292,55,286,69,291,74,293,84,295,88,296,92,296,97,295,101,293,104,288,106,281,107,272,107,47,105,33,100,22,92,14,78,10,59,7,59,0,237,69,230,71,221,57,212,48,203,42,193,39,182,38,65,38,147,126,171,153,189,179,202,203,209,226,211,250,207,278,195,302,176,321,150,334,119,338,86,333,59,320,39,299,24,271,15,238,26,236,38,262,50,280,63,292,
-100,22,92,14,197,0,197,0,92,14,78,10,197,0,78,10,59,7,79,294,84,295,145,338,145,338,84,295,88,296,145,338,88,296,92,296,92,296,97,295,145,338,145,338,97,295,101,293,145,338,101,293,104,288,164,12,155,18,107,47,107,47,155,18,151,27,107,47,151,27,107,272,106,281,107,272,145,338,106,281,145,338,104,288,145,338,55,292,69,291,145,338,69,291,74,293,145,338,74,293,79,294,150,38,150,336,145,338,150,38,145,338,107,272,150,38,107,272,151,27,197,0,197,7,178,8,197,0,178,8,164,12,197,0,164,12,105,33,197,0,105,33,100,22,197,0,59,7,59,0,105,33,164,12,107,47,69,291,55,292,55,286,
-237,69,230,71,221,57,212,48,203,42,193,39,182,38,65,38,147,126,171,153,189,179,202,203,209,226,211,250,207,278,195,302,176,321,150,334,119,338,86,333,59,320,39,299,24,271,15,238,26,236,38,262,50,280,63,292,79,299,99,301,123,298,142,289,156,275,165,255,169,230,166,205,159,181,146,155,128,129,103,100,15,6,15,0,210,0,31,255,43,275,57,290,71,300,87,306,105,308,123,306,138,300,149,290,157,275,159,257,157,240,152,224,143,211,132,199,118,190,112,186,105,183,96,179,87,176,76,172,76,165,92,165,104,164,113,163,121,162,127,160,146,152,161,141,171,127,178,109,180,88,176,63,167,42,153,26,135,15,114,11,106,11,99,13,90,15,82,20,71,26,64,31,
-26,236,38,262,39,299,39,299,38,262,50,280,39,299,50,280,59,320,59,320,50,280,63,292,59,320,63,292,86,333,86,333,63,292,79,299,86,333,79,299,99,301,99,301,123,298,119,338,119,338,123,298,150,334,24,271,15,238,26,236,24,271,26,236,39,299,166,205,171,153,169,230,169,230,171,153,176,321,176,321,171,153,189,179,176,321,189,179,195,302,195,302,189,179,202,203,195,302,202,203,207,278,207,278,202,203,209,226,207,278,209,226,211,250,176,321,150,334,156,275,176,321,156,275,165,255,176,321,165,255,169,230,150,334,123,298,142,289,150,334,142,289,156,275,159,181,146,155,147,126,159,181,147,126,171,153,159,181,171,153,166,205,15,0,210,0,15,6,15,6,210,0,65,38,15,6,65,38,103,100,103,100,65,38,147,126,103,100,147,126,128,129,128,129,147,126,146,155,119,338,86,333,99,301,212,48,203,42,210,0,210,0,203,42,193,39,210,0,193,39,182,38,210,0,182,38,65,38,237,69,230,71,221,57,237,69,221,57,212,48,237,69,212,48,210,0,
-31,255,43,275,57,290,71,300,87,306,105,308,123,306,138,300,149,290,157,275,159,257,157,240,152,224,143,211,132,199,118,190,112,186,105,183,96,179,87,176,76,172,76,165,92,165,104,164,113,163,121,162,127,160,146,152,161,141,171,127,178,109,180,88,176,63,167,42,153,26,135,15,114,11,106,11,99,13,90,15,82,20,71,26,64,31,57,35,51,38,41,40,34,39,29,36,25,32,22,27,21,22,23,12,30,4,41,-1,57,-5,76,-6,103,-4,130,0,154,9,175,22,193,40,200,52,207,65,211,79,214,94,215,109,214,125,212,139,207,152,201,164,194,174,187,180,181,185,173,190,164,195,152,200,170,213,183,226,192,241,197,255,199,270,195,292,184,311,168,326,146,335,121,338,92,334,68,323,48,306,33,284,22,257,237,84,237,116,185,116,185,338,163,338,6,116,6,84,146,84,146,0,185,0,185,84,16383,16383,146,116,26,116,146,287,219,340,214,344,210,339,206,335,202,333,197,331,87,331,32,213,32,208,34,206,38,206,65,204,89,199,110,191,129,182,145,171,156,159,166,146,172,131,177,114,178,96,174,71,164,48,149,29,131,16,110,12,104,12,98,14,90,17,83,21,75,27,66,34,58,39,51,41,45,43,38,43,30,42,24,40,19,36,17,31,16,24,19,13,27,5,40,-1,58,-5,79,-6,99,-5,117,-2,134,1,149,8,164,17,182,33,196,51,206,71,211,95,213,122,213,137,211,150,207,162,202,174,195,185,178,205,159,220,137,232,108,241,70,249,90,291,188,291,192,292,198,294,200,296,201,298,223,342,185,337,152,329,123,317,
-22,257,31,255,33,284,33,284,31,255,43,275,33,284,43,275,48,306,48,306,43,275,57,290,48,306,57,290,68,323,68,323,57,290,71,300,68,323,71,300,92,334,92,334,71,300,87,306,92,334,87,306,105,308,105,308,123,306,121,338,121,338,123,306,146,335,123,306,138,300,146,335,146,335,138,300,149,290,146,335,149,290,168,326,168,326,149,290,157,275,168,326,157,275,159,257,159,257,157,240,170,213,170,213,157,240,152,200,170,213,183,226,184,311,184,311,183,226,192,241,184,311,192,241,195,292,195,292,192,241,197,255,195,292,197,255,199,270,170,213,184,311,168,326,170,213,168,326,159,257,152,200,157,240,152,224,152,200,152,224,146,152,152,200,146,152,161,141,152,200,161,141,164,195,164,195,171,127,173,190,173,190,171,127,178,109,173,190,178,109,181,185,181,185,178,109,180,88,193,40,180,88,176,63,193,40,176,63,175,22,175,22,176,63,167,42,175,22,167,42,154,9,154,9,167,42,153,26,154,9,153,26,135,15,132,199,127,160,146,152,132,199,146,152,143,211,143,211,146,152,152,224,215,109,214,125,214,94,214,94,214,125,212,139,214,94,212,139,211,79,211,79,212,139,207,152,211,79,207,152,207,65,207,65,207,152,201,164,207,65,201,164,200,52,200,52,201,164,194,174,200,52,194,174,193,40,193,40,194,174,187,180,193,40,187,180,181,185,103,-4,130,0,106,11,106,11,130,0,114,11,135,15,114,11,130,0,135,15,130,0,154,9,87,176,76,172,92,165,87,176,92,165,96,179,96,179,92,165,104,164,96,179,104,164,105,183,105,183,104,164,113,163,105,183,113,163,112,186,112,186,113,163,118,190,132,199,118,190,121,162,132,199,121,162,127,160,121,338,92,334,105,308,118,190,113,163,121,162,103,-4,106,11,99,13,103,-4,99,13,90,15,103,-4,90,15,82,20,103,-4,82,20,76,-6,76,-6,82,20,71,26,76,-6,71,26,64,31,76,-6,64,31,57,35,76,-6,57,35,57,-5,57,35,51,38,57,-5,57,-5,51,38,46,39,57,-5,46,39,41,-1,41,-1,46,39,41,40,41,-1,41,40,34,39,30,4,41,-1,34,39,30,4,34,39,29,36,30,4,29,36,25,32,30,4,25,32,23,12,22,27,21,22,23,12,22,27,23,12,25,32,92,165,76,172,76,165,180,88,193,40,181,185,164,195,161,141,171,127,
-237,84,237,116,185,116,185,338,163,338,6,116,6,84,146,84,146,0,185,0,185,84,16383,16383,146,116,26,116,146,287,219,340,214,344,210,339,206,335,202,333,197,331,87,331,32,213,32,208,34,206,38,206,65,204,89,199,110,191,129,182,
-6,84,146,84,6,116,6,116,146,84,26,116,6,116,26,116,163,338,163,338,26,116,146,287,163,338,146,287,185,0,185,0,146,287,146,116,185,0,146,116,146,84,146,84,146,116,26,116,163,338,185,0,185,338,185,116,185,84,237,84,185,116,237,84,237,116,185,0,146,84,146,0,
-219,340,214,344,210,339,206,335,202,333,197,331,87,331,32,213,32,208,34,206,38,206,65,204,89,199,110,191,129,182,145,171,156,159,166,146,172,131,177,114,178,96,174,71,164,48,149,29,131,16,110,12,104,12,98,14,90,17,83,21,75,27,66,34,58,39,51,41,45,43,38,43,30,42,24,40,19,36,17,31,16,24,19,13,27,5,40,-1,58,-5,79,-6,99,-5,117,-2,134,1,149,8,164,17,182,33,196,51,206,71,211,95,213,122,213,137,211,150,207,162,202,174,195,185,178,205,159,220,137,232,108,241,70,249,90,291,188,291,192,292,198,294,200,296,201,298,223,342,185,337,152,329,123,317,97,300,71,277,52,254,37,229,26,201,19,171,17,140,18,118,21,98,26,78,33,60,41,44,53,26,68,12,86,1,106,-4,129,-6,148,-5,166,0,182,7,196,17,209,30,218,43,225,57,230,73,233,91,234,109,230,145,217,174,198,196,172,209,140,214,127,213,115,211,103,207,90,201,76,191,89,234,111,270,142,300,180,321,224,334,16383,16383,189,94,187,65,180,41,169,23,154,11,134,7,109,13,89,30,75,56,66,91,64,133,67,157,76,173,89,184,105,189,122,191,146,187,165,175,179,156,187,128,189,94,224,323,224,331,40,331,10,257,
-211,95,213,122,213,137,211,95,213,137,211,150,211,95,211,150,207,162,211,95,207,162,206,71,178,205,178,96,182,33,178,205,182,33,195,185,195,185,182,33,196,51,195,185,196,51,202,174,202,174,196,51,206,71,202,174,206,71,207,162,149,8,164,17,164,48,164,48,164,17,182,33,164,48,182,33,174,71,174,71,182,33,178,96,110,12,117,-2,131,16,131,16,117,-2,134,1,131,16,134,1,149,29,149,29,134,1,149,8,149,29,149,8,164,48,202,333,197,331,198,294,202,333,198,294,200,296,202,333,200,296,201,298,202,333,201,298,219,340,202,333,219,340,206,335,190,331,192,292,197,331,197,331,192,292,195,293,197,331,195,293,198,294,210,339,206,335,219,340,210,339,219,340,214,344,87,331,70,249,90,291,87,331,90,291,190,331,190,331,90,291,188,291,190,331,188,291,192,292,38,206,65,204,70,249,70,249,65,204,89,199,70,249,89,199,108,241,108,241,89,199,110,191,108,241,110,191,137,232,137,232,110,191,129,182,137,232,129,182,145,171,145,171,156,159,159,220,159,220,156,159,166,146,159,220,166,146,178,205,178,205,166,146,172,131,178,205,172,131,177,114,87,331,32,213,33,207,87,331,33,207,34,206,87,331,34,206,36,206,87,331,36,206,38,206,87,331,38,206,70,249,32,213,32,212,33,207,33,207,32,212,32,208,32,208,32,212,32,211,79,-6,99,-5,83,21,79,-6,83,21,75,27,79,-6,75,27,66,34,79,-6,66,34,58,39,79,-6,58,39,58,-5,58,39,51,41,58,-5,58,-5,51,41,45,43,58,-5,45,43,40,-1,40,-1,45,43,38,43,40,-1,38,43,30,42,27,5,40,-1,30,42,27,5,30,42,24,40,27,5,24,40,19,36,27,5,19,36,19,13,17,31,16,24,19,13,17,31,19,13,19,36,104,12,98,14,99,-5,104,12,99,-5,117,-2,104,12,117,-2,110,12,159,220,137,232,145,171,90,17,83,21,99,-5,90,17,99,-5,98,14,178,205,177,114,178,96,32,208,32,211,32,210,
-223,342,185,337,152,329,123,317,97,300,71,277,52,254,37,229,26,201,19,171,17,140,18,118,21,98,26,78,33,60,41,44,53,26,68,12,86,1,106,-4,129,-6,148,-5,166,0,182,7,196,17,209,30,218,43,225,57,230,73,233,91,234,109,230,145,217,174,198,196,172,209,140,214,127,213,115,211,103,207,90,201,76,191,89,234,111,270,142,300,180,321,224,334,16383,16383,189,94,187,65,180,41,169,23,154,11,134,7,109,13,89,30,75,56,66,91,64,133,67,157,76,173,89,184,105,189,122,191,146,187,165,175,179,156,187,128,189,94,224,323,224,331,40,331,10,257,19,253,30,270,40,282,51,289,62,293,78,294,185,294,86,-3,118,-3,223,78,220,100,213,121,199,141,177,162,145,185,171,200,190,215,203,229,210,246,212,267,208,289,197,309,179,324,156,334,128,338,97,335,70,324,49,308,36,287,31,260,33,242,38,225,49,208,67,189,93,166,66,145,47,127,35,111,30,94,28,75,32,48,45,25,66,8,92,-2,124,-6,157,-2,185,8,205,26,218,49,223,78,16383,16383,177,267,176,249,171,234,162,220,149,207,131,195,107,210,90,225,77,240,70,257,68,275,71,292,78,305,
-140,214,127,213,146,187,146,187,127,213,122,191,105,189,122,191,115,211,105,189,115,211,103,207,64,133,67,157,71,277,71,277,67,157,76,173,71,277,76,173,76,191,76,191,76,173,89,184,76,191,89,184,90,201,90,201,89,184,105,189,90,201,105,189,103,207,127,213,115,211,122,191,187,65,180,41,182,7,182,7,180,41,169,23,182,7,169,23,166,0,166,0,169,23,154,11,166,0,154,11,148,-5,148,-5,154,11,134,7,148,-5,134,7,129,-6,129,-6,134,7,109,13,129,-6,109,13,106,-4,106,-4,109,13,89,30,106,-4,89,30,86,1,86,1,89,30,75,56,86,1,75,56,68,12,68,12,75,56,66,91,68,12,66,91,64,133,53,26,68,12,64,133,64,133,71,277,53,26,53,26,71,277,52,254,53,26,52,254,41,44,41,44,52,254,37,229,41,44,37,229,33,60,33,60,37,229,26,78,218,43,225,57,230,145,230,145,225,57,230,73,230,145,230,73,234,109,234,109,230,73,233,91,189,94,196,17,198,196,198,196,196,17,209,30,198,196,209,30,217,174,217,174,209,30,218,43,217,174,218,43,230,145,146,187,165,175,172,209,172,209,165,175,179,156,172,209,179,156,198,196,198,196,179,156,187,128,198,196,187,128,189,94,187,65,182,7,196,17,187,65,196,17,189,94,76,191,89,234,97,300,97,300,89,234,111,270,97,300,111,270,123,317,123,317,111,270,142,300,123,317,142,300,152,329,152,329,142,300,180,321,152,329,180,321,185,337,185,337,180,321,224,334,185,337,224,334,223,342,97,300,71,277,76,191,17,140,18,118,19,171,19,171,18,118,21,98,19,171,21,98,26,201,26,201,21,98,26,78,26,201,26,78,37,229,140,214,146,187,172,209,
-224,323,224,331,40,331,10,257,19,253,30,270,40,282,51,289,62,293,78,294,185,294,86,-3,118,-3,223,78,220,100,213,121,199,141,177,162,145,185,171,200,190,215,203,229,210,246,212,267,208,289,197,309,
-118,-3,224,323,185,294,185,294,224,323,224,331,185,294,224,331,78,294,62,293,78,294,224,331,62,293,224,331,40,331,40,331,10,257,19,253,40,331,19,253,30,270,40,331,30,270,40,282,40,331,40,282,51,289,40,331,51,289,62,293,118,-3,185,294,86,-3,
-223,78,220,100,213,121,199,141,177,162,145,185,171,200,190,215,203,229,210,246,212,267,208,289,197,309,179,324,156,334,128,338,97,335,70,324,49,308,36,287,31,260,33,242,38,225,49,208,67,189,93,166,66,145,47,127,35,111,30,94,28,75,32,48,45,25,66,8,92,-2,124,-6,157,-2,185,8,205,26,218,49,223,78,16383,16383,177,267,176,249,171,234,162,220,149,207,131,195,107,210,90,225,77,240,70,257,68,275,71,292,78,305,89,316,104,322,123,324,142,322,157,314,168,302,175,286,177,267,16383,16383,136,136,154,122,167,109,177,95,183,79,185,62,182,44,175,29,163,17,148,10,129,7,108,10,91,19,77,34,69,54,66,79,67,97,71,113,79,128,90,142,106,156,30,-10,65,-4,95,3,121,13,145,28,170,49,191,72,208,100,220,130,227,163,229,197,228,221,224,244,217,265,209,284,198,300,185,313,171,324,155,332,138,337,119,338,85,332,57,316,35,291,20,258,15,220,19,186,31,158,50,137,75,123,105,118,122,119,138,122,153,128,167,136,180,147,164,101,140,63,109,33,71,12,28,0,16383,16383,181,177,177,163,167,153,153,146,137,141,123,140,102,144,85,157,72,177,64,204,61,237,62,253,64,269,68,284,73,297,79,307,84,313,91,318,98,321,106,323,115,324,139,319,157,304,170,278,178,243,181,197,96,201,95,210,91,218,85,224,77,228,69,229,60,228,52,224,46,218,42,211,41,201,42,193,46,185,52,179,60,176,69,174,77,176,
-167,109,177,162,154,122,154,122,177,162,145,185,154,122,145,185,136,136,136,136,145,185,149,207,136,136,149,207,131,195,131,195,107,210,136,136,136,136,107,210,106,156,90,142,106,156,93,166,66,8,69,54,66,79,66,79,67,97,66,145,66,145,67,97,71,113,66,145,71,113,93,166,93,166,71,113,79,128,93,166,79,128,90,142,30,94,32,48,35,111,35,111,32,48,45,25,35,111,45,25,47,127,47,127,45,25,66,8,47,127,66,8,66,145,66,145,66,8,66,79,107,210,90,225,93,166,107,210,93,166,106,156,90,225,77,240,93,166,93,166,77,240,70,257,93,166,70,257,67,189,67,189,70,257,68,275,70,324,68,275,71,292,70,324,71,292,78,305,128,338,123,324,142,322,128,338,142,322,156,334,156,334,142,322,157,314,156,334,157,314,179,324,179,324,157,314,168,302,179,324,168,302,175,286,182,44,175,29,185,8,185,8,175,29,163,17,185,8,163,17,157,-2,157,-2,163,17,148,10,157,-2,148,10,129,7,129,7,108,10,124,-6,124,-6,108,10,92,-2,92,-2,108,10,91,19,92,-2,91,19,77,34,92,-2,77,34,69,54,92,-2,69,54,66,8,78,305,89,316,97,335,97,335,89,316,104,322,97,335,104,322,128,338,128,338,104,322,123,324,49,308,36,287,38,225,49,308,38,225,49,208,49,308,49,208,67,189,49,308,67,189,68,275,49,308,68,275,70,324,36,287,31,260,33,242,36,287,33,242,38,225,171,200,190,215,176,249,176,249,190,215,177,267,179,324,177,267,190,215,179,324,190,215,197,309,197,309,190,215,203,229,197,309,203,229,208,289,208,289,203,229,210,246,208,289,210,246,212,267,171,200,176,249,171,234,171,200,171,234,162,220,171,200,162,220,149,207,171,200,149,207,145,185,223,78,220,100,218,49,218,49,220,100,213,121,218,49,213,121,205,26,205,26,213,121,199,141,205,26,199,141,185,62,185,62,199,141,183,79,177,95,183,79,199,141,177,95,199,141,177,162,177,95,177,162,167,109,185,62,185,8,205,26,129,7,124,-6,157,-2,182,44,185,8,185,62,179,324,175,286,177,267,70,324,78,305,97,335,32,48,30,94,28,75,
-30,-10,65,-4,95,3,121,13,145,28,170,49,191,72,208,100,220,130,227,163,229,197,228,221,224,244,217,265,209,284,198,300,185,313,171,324,155,332,138,337,119,338,85,332,57,316,35,291,20,258,15,220,19,186,31,158,50,137,75,123,105,118,122,119,138,122,153,128,167,136,180,147,164,101,140,63,109,33,71,12,28,0,16383,16383,181,177,177,163,167,153,153,146,137,141,123,140,102,144,85,157,72,177,64,204,61,237,62,253,64,269,68,284,73,297,79,307,84,313,91,318,98,321,106,323,115,324,139,319,157,304,170,278,178,243,181,197,96,201,95,210,91,218,85,224,77,228,69,229,60,228,52,224,46,218,42,211,41,201,42,193,46,185,52,179,60,176,69,174,77,176,85,179,91,185,95,193,96,201,16383,16383,96,22,95,31,91,38,85,45,77,49,69,50,60,49,52,45,46,39,42,31,41,22,42,13,46,6,52,0,60,-3,69,-5,77,-3,85,0,91,6,95,13,96,22,95,201,94,210,90,218,84,224,77,228,68,229,59,228,51,224,45,218,42,211,40,201,42,193,46,185,52,179,59,176,68,174,77,176,84,179,90,185,94,193,95,201,16383,16383,54,-69,73,-58,88,-44,
-62,253,64,269,57,316,57,316,64,269,68,284,57,316,68,284,85,332,85,332,68,284,73,297,85,332,73,297,79,307,79,307,84,313,85,332,85,332,84,313,91,318,85,332,91,318,119,338,119,338,91,318,98,321,119,338,98,321,106,323,119,338,106,323,115,324,115,324,139,319,119,338,119,338,139,319,138,337,123,140,105,118,122,119,123,140,122,119,138,122,123,140,102,144,105,118,85,157,72,177,75,123,85,157,75,123,105,118,85,157,105,118,102,144,61,237,62,253,57,316,61,237,57,316,50,137,61,237,50,137,64,204,64,204,50,137,75,123,64,204,75,123,72,177,15,220,19,186,20,258,20,258,19,186,31,158,20,258,31,158,35,291,35,291,31,158,50,137,35,291,50,137,57,316,137,141,123,140,138,122,137,141,138,122,153,146,153,146,138,122,153,128,153,146,153,128,167,153,167,153,153,128,167,136,167,153,167,136,177,163,177,163,167,136,180,147,177,163,180,147,181,177,181,177,180,147,191,72,181,177,191,72,181,197,178,243,181,197,185,313,178,243,185,313,171,324,138,337,139,319,155,332,155,332,139,319,157,304,155,332,157,304,171,324,171,324,157,304,170,278,171,324,170,278,178,243,229,197,228,221,227,163,227,163,228,221,224,244,227,163,224,244,220,130,220,130,224,244,217,265,220,130,217,265,209,284,220,130,209,284,208,100,208,100,209,284,198,300,208,100,198,300,191,72,191,72,198,300,185,313,191,72,185,313,181,197,30,-10,65,-4,71,12,71,12,65,-4,95,3,71,12,95,3,109,33,109,33,95,3,121,13,109,33,121,13,140,63,140,63,121,13,145,28,140,63,145,28,164,101,164,101,145,28,170,49,164,101,170,49,180,147,180,147,170,49,191,72,71,12,28,0,30,-10,
-96,201,95,210,91,218,85,224,77,228,69,229,60,228,52,224,46,218,42,211,41,201,42,193,46,185,52,179,60,176,69,174,77,176,85,179,91,185,95,193,96,201,16383,16383,96,22,95,31,91,38,85,45,77,49,69,50,60,49,52,45,46,39,42,31,41,22,42,13,46,6,52,0,60,-3,69,-5,77,-3,85,0,91,6,95,13,96,22,95,201,94,210,90,218,84,224,77,228,68,229,59,228,51,224,45,218,42,211,40,201,42,193,46,185,52,179,59,176,68,174,77,176,84,179,90,185,94,193,95,201,16383,16383,54,-69,73,-58,88,-44,100,-28,107,-11,109,7,107,22,102,34,93,43,82,49,70,51,60,49,52,46,46,40,42,32,40,23,41,14,45,7,51,2,59,-1,69,-2,
-42,211,42,193,46,218,46,218,42,193,46,185,46,218,46,185,52,224,52,224,46,185,52,179,52,224,52,179,60,228,60,228,52,179,60,176,60,228,60,176,69,229,69,229,60,176,69,174,69,229,69,174,77,228,77,228,69,174,77,176,77,228,77,176,85,224,85,224,77,176,85,179,85,224,85,179,91,218,91,218,85,179,91,185,91,218,91,185,95,210,95,210,91,185,95,193,95,210,95,193,96,201,42,31,42,13,46,39,46,39,42,13,46,6,46,39,46,6,52,45,52,45,46,6,52,0,52,45,52,0,60,49,60,49,52,0,60,-3,60,49,60,-3,69,50,69,50,60,-3,69,-5,69,50,69,-5,77,49,77,49,69,-5,77,-3,77,49,77,-3,85,45,85,45,77,-3,85,0,85,45,85,0,91,38,91,38,85,0,91,6,91,38,91,6,95,31,95,31,91,6,95,13,95,31,95,13,96,22,42,13,42,31,41,22,42,193,42,211,41,201,
-95,201,94,210,90,218,84,224,77,228,68,229,59,228,51,224,45,218,42,211,40,201,42,193,46,185,52,179,59,176,68,174,77,176,84,179,90,185,94,193,95,201,16383,16383,54,-69,73,-58,88,-44,100,-28,107,-11,109,7,107,22,102,34,93,43,82,49,70,51,60,49,52,46,46,40,42,32,40,23,41,14,45,7,51,2,59,-1,69,-2,72,-2,75,-1,78,-1,81,0,85,0,87,-2,89,-3,90,-5,90,-7,88,-17,83,-28,75,-38,63,-49,49,-60,310,-11,310,20,94,127,310,234,310,267,28,129,28,124,319,160,319,193,24,193,24,160,16383,16383,319,60,319,93,24,93,24,60,310,124,310,129,28,267,28,234,244,127,28,20,28,-11,122,82,126,101,131,118,137,133,145,147,155,161,176,187,191,208,201,226,206,242,207,259,202,286,189,308,169,324,144,335,116,338,89,335,66,325,49,310,38,290,34,267,35,255,38,246,44,239,50,235,58,233,65,234,71,237,75,242,78,248,79,255,77,264,72,270,66,276,
-42,211,42,193,45,218,45,218,42,193,46,185,45,218,46,185,51,224,51,224,46,185,52,179,51,224,52,179,59,228,59,228,52,179,59,176,59,228,59,176,68,229,68,229,59,176,68,174,68,229,68,174,77,228,77,228,68,174,77,176,77,228,77,176,84,224,84,224,77,176,84,179,84,224,84,179,90,218,90,218,84,179,90,185,90,218,90,185,94,210,94,210,90,185,94,193,94,210,94,193,95,201,75,-1,78,-1,82,49,82,49,78,-1,81,0,82,49,81,0,83,0,83,0,85,0,93,43,93,43,85,0,87,-2,93,43,87,-2,89,-3,40,23,41,14,42,32,42,32,41,14,45,7,42,32,45,7,46,40,46,40,45,7,51,2,46,40,51,2,52,46,52,46,51,2,59,-1,52,46,59,-1,60,49,60,49,59,-1,69,-2,60,49,69,-2,70,51,70,51,69,-2,72,-2,70,51,72,-2,82,49,82,49,72,-2,75,-1,109,7,107,22,107,-11,107,-11,107,22,102,34,107,-11,102,34,100,-28,100,-28,102,34,93,43,100,-28,93,43,90,-7,90,-7,88,-44,100,-28,93,43,89,-3,90,-5,93,43,90,-5,90,-7,93,43,82,49,83,0,88,-44,90,-7,88,-17,88,-44,88,-17,83,-28,88,-44,83,-28,75,-38,88,-44,75,-38,73,-58,63,-49,49,-60,54,-69,63,-49,54,-69,73,-58,63,-49,73,-58,75,-38,42,193,42,211,40,201,
-310,-11,310,20,94,127,310,234,310,267,28,129,28,124,319,160,319,193,24,193,24,160,16383,16383,319,60,319,93,
-94,127,310,234,310,267,94,127,310,267,28,129,94,127,28,129,310,-11,94,127,310,-11,310,20,310,-11,28,129,28,124,
-319,160,319,193,24,193,24,160,16383,16383,319,60,319,93,24,93,24,60,310,124,310,129,28,267,28,234,244,127,28,20,28,-11,122,82,126,101,
-24,193,24,160,319,160,24,193,319,160,319,193,24,93,24,60,319,60,24,93,319,60,319,93,
-310,124,310,129,28,267,28,234,244,127,28,20,28,-11,122,82,126,101,131,118,137,133,145,147,155,161,176,187,
-310,124,310,129,28,267,310,124,28,267,28,234,310,124,28,234,244,127,310,124,244,127,28,20,310,124,28,20,28,-11,
-122,82,126,101,131,118,137,133,145,147,155,161,176,187,191,208,201,226,206,242,207,259,202,286,189,308,169,324,144,335,116,338,89,335,66,325,49,310,38,290,34,267,35,255,38,246,44,239,50,235,58,233,65,234,71,237,75,242,78,248,79,255,77,264,72,270,66,276,62,283,60,292,62,301,69,310,80,317,92,321,107,323,124,320,139,312,151,300,159,283,161,264,160,246,156,227,150,209,136,171,126,147,120,127,116,109,114,95,113,82,16383,16383,145,22,144,30,140,38,134,44,127,48,119,49,110,48,103,44,97,38,93,31,92,22,93,14,97,7,102,1,110,-2,119,-3,127,-2,135,1,140,7,144,14,145,22,344,36,323,27,303,20,283,16,263,13,243,12,196,19,156,40,126,71,107,112,100,161,101,184,105,206,112,227,120,247,131,265,148,285,167,301,189,313,214,320,241,323,286,316,326,296,357,267,377,229,384,186,381,157,372,130,358,108,341,94,321,88,314,89,308,92,304,96,301,103,300,112,300,115,301,117,301,120,334,247,300,247,295,228,294,228,289,238,284,245,276,250,268,253,257,254,242,252,229,248,216,241,204,231,194,219,183,203,174,185,167,167,162,147,161,128,163,109,169,93,179,82,191,75,204,72,219,74,232,78,245,86,257,96,267,108,268,108,271,96,279,86,288,78,300,73,313,71,341,78,366,95,386,121,
-60,292,60,292,60,292,60,292,66,325,49,310,60,292,49,310,50,235,60,292,50,235,58,233,144,335,116,338,124,320,124,320,116,338,107,323,92,321,107,323,116,338,92,321,116,338,89,335,60,292,62,301,66,325,66,325,62,301,69,310,66,325,69,310,89,335,89,335,69,310,80,317,89,335,80,317,92,321,34,267,35,255,38,290,38,290,35,255,38,246,38,290,38,246,49,310,49,310,38,246,44,239,49,310,44,239,50,235,62,283,65,234,66,276,66,276,65,234,71,237,66,276,71,237,72,270,72,270,71,237,75,242,72,270,75,242,77,264,77,264,75,242,78,248,77,264,78,248,79,255,65,234,62,283,60,292,65,234,60,292,58,233,119,49,119,-3,127,48,127,48,119,-3,127,-2,127,48,127,-2,134,44,134,44,127,-2,135,1,134,44,135,1,140,38,140,38,135,1,140,7,140,38,140,7,144,30,144,30,140,7,144,14,144,30,144,14,145,22,92,22,93,14,93,31,93,31,93,14,97,7,93,31,97,7,97,38,97,38,97,7,102,1,97,38,102,1,103,44,103,44,102,1,110,-2,103,44,110,-2,110,48,110,48,110,-2,119,-3,110,48,119,-3,119,49,124,320,139,312,144,335,144,335,139,312,151,300,144,335,151,300,169,324,169,324,151,300,159,283,169,324,159,283,161,264,161,264,160,246,176,187,176,187,160,246,156,227,176,187,156,227,155,161,155,161,156,227,150,209,155,161,150,209,145,147,145,147,150,209,143,190,145,147,143,190,137,133,137,133,143,190,136,171,137,133,136,171,131,118,131,118,136,171,126,147,131,118,126,147,126,101,126,101,126,147,122,82,202,286,189,308,191,208,202,286,191,208,201,226,202,286,201,226,206,242,202,286,206,242,207,259,176,187,191,208,189,308,176,187,189,308,169,324,176,187,169,324,161,264,122,82,126,147,120,127,122,82,120,127,116,109,122,82,116,109,114,95,122,82,114,95,113,82,
-344,36,323,27,303,20,283,16,263,13,243,12,196,19,156,40,126,71,107,112,100,161,101,184,105,206,112,227,120,247,131,265,148,285,167,301,189,313,214,320,241,323,286,316,326,296,357,267,377,229,384,186,381,157,372,130,358,108,341,94,321,88,314,89,308,92,304,96,301,103,300,112,300,115,301,117,301,120,334,247,300,247,295,228,294,228,289,238,284,245,276,250,268,253,257,254,242,252,229,248,216,241,204,231,194,219,183,203,174,185,167,167,162,147,161,128,163,109,169,93,179,82,191,75,204,72,219,74,232,78,245,86,257,96,267,108,268,108,271,96,279,86,288,78,300,73,313,71,341,78,366,95,386,121,400,154,405,191,396,238,374,279,338,310,293,331,241,338,215,337,191,333,169,326,148,316,128,304,105,282,86,257,71,228,61,197,58,164,67,108,93,61,132,24,182,1,241,-6,261,-5,281,-2,302,2,324,10,350,22,16383,16383,286,202,285,187,282,171,277,155,271,138,264,123,257,113,250,105,242,99,234,95,226,94,216,96,207,101,201,110,197,122,196,137,197,150,199,163,203,175,208,186,214,197,223,209,234,219,244,226,254,231,263,232,271,231,277,227,282,221,285,213,286,202,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,211,175,225,178,236,182,245,185,259,195,266,203,272,213,276,224,279,235,280,248,274,277,258,300,232,317,195,327,148,331,8,331,8,321,29,320,43,316,51,308,55,295,56,275,56,56,55,37,51,24,42,16,29,11,8,9,8,0,177,0,217,4,250,15,275,34,291,58,296,89,295,102,292,115,287,126,281,137,272,147,263,154,254,160,242,166,229,170,211,174,16383,16383,108,183,108,303,109,307,112,310,115,312,119,313,140,313,172,309,197,301,214,287,225,268,228,245,225,223,217,205,202,193,181,186,153,183,16383,16383,108,163,139,162,162,161,181,158,198,152,215,143,224,136,231,126,235,115,238,103,239,89,238,77,236,66,232,56,227,47,220,40,207,30,194,24,179,20,161,19,138,18,126,19,118,21,112,26,109,32,
-156,40,126,71,132,24,132,24,126,71,107,112,132,24,107,112,93,61,93,61,107,112,100,161,105,282,100,161,101,184,105,282,101,184,105,206,105,206,112,227,128,304,128,304,112,227,120,247,128,304,120,247,131,265,131,265,148,285,148,316,148,316,148,285,167,301,148,316,167,301,169,326,169,326,167,301,189,313,169,326,189,313,191,333,191,333,189,313,214,320,191,333,214,320,215,337,215,337,214,320,241,323,215,337,241,323,241,338,241,338,241,323,293,331,93,61,100,161,105,282,93,61,105,282,86,257,93,61,86,257,71,228,93,61,71,228,67,108,61,197,58,164,67,108,61,197,67,108,71,228,384,186,386,121,396,238,384,186,396,238,377,229,377,229,396,238,374,279,377,229,374,279,357,267,357,267,374,279,338,310,357,267,338,310,326,296,326,296,338,310,293,331,326,296,293,331,286,316,286,316,293,331,241,323,148,316,128,304,131,265,344,36,323,27,324,10,324,10,323,27,303,20,324,10,303,20,302,2,302,2,303,20,283,16,302,2,283,16,281,-2,281,-2,283,16,263,13,281,-2,263,13,261,-5,261,-5,263,13,243,12,261,-5,243,12,241,-6,241,-6,243,12,196,19,241,-6,196,19,182,1,182,1,196,19,156,40,182,1,156,40,132,24,276,250,268,253,271,231,271,231,268,253,263,232,254,231,263,232,257,254,254,231,257,254,244,226,244,226,257,254,242,252,244,226,242,252,234,219,234,219,242,252,229,248,234,219,229,248,223,209,223,209,229,248,216,241,223,209,216,241,214,197,199,163,203,175,204,231,204,231,203,175,208,186,204,231,208,186,216,241,216,241,208,186,214,197,194,219,196,137,197,150,194,219,197,150,204,231,204,231,197,150,199,163,201,110,204,72,207,101,207,101,204,72,219,74,207,101,219,74,216,96,216,96,219,74,226,94,234,95,226,94,232,78,234,95,232,78,245,86,197,122,196,137,191,75,197,122,191,75,204,72,197,122,204,72,201,110,196,137,194,219,191,75,191,75,194,219,183,203,191,75,183,203,179,82,179,82,183,203,174,185,179,82,174,185,169,93,169,93,174,185,167,167,169,93,167,167,163,109,163,109,167,167,162,147,163,109,162,147,161,128,268,253,257,254,263,232,267,108,268,108,271,138,267,108,271,138,264,123,264,123,257,113,267,108,267,108,257,113,257,96,308,92,304,96,312,71,312,71,304,96,301,103,312,71,301,103,300,73,300,73,301,103,300,112,300,115,301,117,300,247,300,247,301,117,301,119,300,247,301,119,301,120,301,120,334,247,300,247,300,247,295,228,300,73,300,247,300,73,300,112,300,247,300,112,300,114,300,247,300,114,300,115,295,228,294,228,300,73,300,73,294,228,289,238,300,73,289,238,288,78,288,78,289,238,286,202,288,78,286,202,285,187,288,78,285,187,282,171,285,213,286,202,289,238,285,213,289,238,284,245,285,213,284,245,282,221,277,227,282,221,284,245,277,227,284,245,276,250,277,227,276,250,271,231,384,186,381,157,386,121,386,121,381,157,372,130,386,121,372,130,366,95,366,95,372,130,358,108,366,95,358,108,341,78,341,78,358,108,341,94,341,78,341,94,321,88,321,88,314,89,341,78,341,78,314,89,312,71,396,238,386,121,400,154,396,238,400,154,405,191,288,78,282,171,279,86,279,86,282,171,277,155,279,86,277,155,271,96,271,96,277,155,271,138,271,96,271,138,268,108,250,105,242,99,245,86,250,105,245,86,257,96,250,105,257,96,257,113,226,94,219,74,232,78,234,95,245,86,242,99,308,92,312,71,314,89,344,36,324,10,350,22,105,282,105,206,128,304,
-353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,211,175,225,178,236,182,245,185,259,195,266,203,272,213,276,224,279,235,280,248,274,277,258,300,232,317,195,327,148,331,8,331,8,321,29,320,43,316,51,308,55,295,56,275,56,56,55,37,51,24,42,16,29,11,8,9,8,0,177,0,217,4,250,15,275,34,291,58,296,89,295,102,292,115,287,126,281,137,272,147,263,154,254,160,242,166,229,170,211,174,16383,16383,108,183,
-55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0,
-211,175,225,178,236,182,245,185,259,195,266,203,272,213,276,224,279,235,280,248,274,277,258,300,232,317,195,327,148,331,8,331,8,321,29,320,43,316,51,308,55,295,56,275,56,56,55,37,51,24,42,16,29,11,8,9,8,0,177,0,217,4,250,15,275,34,291,58,296,89,295,102,292,115,287,126,281,137,272,147,263,154,254,160,242,166,229,170,211,174,16383,16383,108,183,108,303,109,307,112,310,115,312,119,313,140,313,172,309,197,301,214,287,225,268,228,245,225,223,217,205,202,193,181,186,153,183,16383,16383,108,163,139,162,162,161,181,158,198,152,215,143,224,136,231,126,235,115,238,103,239,89,238,77,236,66,232,56,227,47,220,40,207,30,194,24,179,20,161,19,138,18,126,19,118,21,112,26,109,32,108,41,307,65,285,47,265,32,244,23,222,17,197,15,177,17,157,21,139,28,123,38,108,51,95,68,85,88,78,112,73,140,72,171,77,219,93,260,117,291,151,311,192,318,211,316,228,311,244,304,259,293,272,280,279,272,285,263,290,252,295,240,299,224,310,224,305,338,296,338,293,332,290,328,285,324,280,322,275,321,269,322,262,324,254,326,240,330,228,333,204,337,192,338,180,338,153,336,127,330,102,320,80,305,59,286,44,266,31,243,22,218,16,191,14,162,16,133,22,106,32,80,45,57,62,37,81,22,103,9,127,0,153,-4,180,-6,214,-4,245,3,273,16,297,34,316,56,8,331,8,321,27,320,40,316,47,308,51,295,52,275,52,57,51,38,48,25,40,16,27,12,8,9,8,0,148,0,178,1,206,6,231,12,
-51,24,42,16,177,0,177,0,42,16,29,11,177,0,29,11,8,9,55,295,56,275,112,310,55,295,112,310,148,331,148,331,112,310,115,312,148,331,115,312,119,313,148,331,119,313,140,313,148,331,140,313,172,309,207,30,194,24,217,4,217,4,194,24,179,20,217,4,179,20,177,0,177,0,179,20,161,19,177,0,161,19,138,18,138,18,126,19,177,0,177,0,126,19,118,21,177,0,118,21,55,37,55,37,118,21,56,56,258,300,232,317,236,182,236,182,232,317,228,245,236,182,228,245,225,223,236,182,225,223,225,178,225,178,225,223,217,205,225,178,217,205,211,175,211,175,217,205,202,193,211,175,202,193,211,174,211,174,202,193,215,143,211,174,215,143,229,170,229,170,215,143,224,136,153,183,162,161,181,186,181,186,162,161,181,158,181,186,181,158,202,193,202,193,181,158,198,152,202,193,198,152,215,143,236,66,232,56,250,15,250,15,232,56,227,47,250,15,227,47,220,40,220,40,207,30,217,4,162,161,153,183,139,162,139,162,153,183,108,183,139,162,108,183,108,163,109,32,108,41,56,275,109,32,56,275,56,56,56,56,118,21,112,26,56,56,112,26,109,32,272,147,263,154,275,34,275,34,263,154,254,160,275,34,254,160,250,15,250,15,254,160,242,166,250,15,242,166,239,89,239,89,238,77,250,15,250,15,238,77,236,66,242,166,229,170,231,126,242,166,231,126,235,115,242,166,235,115,238,103,242,166,238,103,239,89,232,317,195,327,197,301,232,317,197,301,214,287,232,317,214,287,225,268,232,317,225,268,228,245,195,327,148,331,172,309,195,327,172,309,197,301,56,275,108,41,108,296,56,275,108,296,108,303,56,275,108,303,109,307,56,275,109,307,112,310,148,331,8,331,29,320,148,331,29,320,43,316,148,331,43,316,51,308,148,331,51,308,55,295,266,203,272,213,274,277,274,277,272,213,276,224,274,277,276,224,280,248,280,248,276,224,279,235,245,185,252,190,258,300,258,300,252,190,259,195,258,300,259,195,274,277,274,277,259,195,266,203,292,115,287,126,291,58,292,115,291,58,296,89,292,115,296,89,295,102,281,137,272,147,275,34,281,137,275,34,291,58,281,137,291,58,287,126,220,40,217,4,250,15,258,300,236,182,245,185,29,320,8,331,8,321,229,170,224,136,231,126,177,0,8,9,8,0,51,24,177,0,55,37,
-307,65,285,47,265,32,244,23,222,17,197,15,177,17,157,21,139,28,123,38,108,51,95,68,85,88,78,112,73,140,72,171,77,219,93,260,117,291,151,311,192,318,211,316,228,311,244,304,259,293,272,280,279,272,285,263,290,252,295,240,299,224,310,224,305,338,296,338,293,332,290,328,285,324,280,322,275,321,269,322,262,324,254,326,240,330,228,333,204,337,192,338,180,338,153,336,127,330,102,320,80,305,59,286,44,266,31,243,22,218,16,191,14,162,16,133,22,106,32,80,45,57,62,37,81,22,103,9,127,0,153,-4,180,-6,214,-4,245,3,273,16,297,34,316,56,8,331,8,321,27,320,40,316,47,308,51,295,52,275,52,57,51,38,48,25,40,16,27,12,8,9,8,0,148,0,178,1,206,6,231,12,254,21,275,32,299,51,318,75,331,102,340,133,343,167,341,196,334,223,324,247,310,267,293,286,270,302,244,314,214,323,180,329,143,331,16383,16383,103,291,104,300,107,306,112,310,119,312,129,313,157,311,182,308,203,301,222,291,241,278,257,260,271,241,280,219,286,193,288,164,286,132,280,104,270,81,255,61,236,45,218,34,200,27,179,22,155,19,127,18,117,19,110,22,106,26,104,33,103,42,299,84,285,84,271,57,255,38,234,26,
-62,37,73,140,72,171,72,171,80,305,62,37,62,37,80,305,59,286,62,37,59,286,45,57,45,57,59,286,44,266,45,57,44,266,32,80,32,80,44,266,31,243,32,80,31,243,22,106,22,106,31,243,22,218,22,106,22,218,16,133,16,133,22,218,16,191,16,133,16,191,14,162,78,112,81,22,85,88,85,88,81,22,103,9,85,88,103,9,95,68,95,68,103,9,108,51,123,38,108,51,127,0,123,38,127,0,139,28,139,28,127,0,153,-4,139,28,153,-4,157,21,157,21,153,-4,180,-6,157,21,180,-6,177,17,177,17,180,-6,197,15,222,17,197,15,214,-4,222,17,214,-4,245,3,73,140,62,37,81,22,73,140,81,22,78,112,108,51,103,9,127,0,254,326,259,293,262,324,262,324,259,293,272,280,262,324,272,280,269,322,269,322,272,280,275,321,280,322,275,321,279,272,280,322,279,272,285,263,275,321,272,280,279,272,228,333,228,311,240,330,240,330,228,311,244,304,240,330,244,304,247,328,247,328,244,304,259,293,247,328,259,293,254,326,216,335,204,337,211,316,216,335,211,316,228,311,216,335,228,311,228,333,204,337,192,338,211,316,211,316,192,338,192,318,151,311,192,318,153,336,151,311,153,336,127,330,310,224,305,338,299,224,299,224,305,338,296,338,299,224,296,338,295,240,295,240,296,338,293,332,295,240,293,332,290,252,290,252,293,332,290,328,290,252,290,328,285,263,285,263,290,328,285,324,285,263,285,324,280,322,316,56,307,65,297,34,297,34,307,65,285,47,297,34,285,47,273,16,273,16,285,47,265,32,273,16,265,32,245,3,245,3,265,32,244,23,245,3,244,23,222,17,197,15,180,-6,214,-4,192,318,192,338,180,338,192,318,180,338,153,336,72,171,77,219,80,305,80,305,77,219,93,260,80,305,93,260,102,320,102,320,93,260,117,291,102,320,117,291,127,330,127,330,117,291,151,311,
-8,331,8,321,27,320,40,316,47,308,51,295,52,275,52,57,51,38,48,25,40,16,27,12,8,9,8,0,148,0,178,1,206,6,231,12,254,21,275,32,299,51,318,75,331,102,340,133,343,167,341,196,334,223,324,247,310,267,293,286,270,302,244,314,214,323,180,329,143,331,16383,16383,103,291,104,300,107,306,112,310,119,312,129,313,157,311,182,308,203,301,222,291,241,278,257,260,271,241,280,219,286,193,288,164,286,132,280,104,270,81,255,61,236,45,218,34,200,27,179,22,155,19,127,18,117,19,110,22,106,26,104,33,103,42,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,273,259,271,331,6,331,6,321,25,319,38,315,45,307,49,294,50,276,50,61,
-48,25,40,16,148,0,148,0,40,16,27,12,148,0,27,12,8,9,52,57,51,38,110,22,110,22,51,38,148,0,110,22,148,0,117,19,117,19,148,0,127,18,155,19,127,18,148,0,155,19,148,0,178,1,104,300,107,306,52,275,52,275,107,306,112,310,52,275,112,310,143,331,143,331,112,310,119,312,143,331,119,312,129,313,129,313,119,312,129,312,129,313,129,312,157,311,129,313,157,311,143,331,143,331,157,311,180,329,206,6,231,12,218,34,218,34,231,12,236,45,255,61,236,45,254,21,255,61,254,21,275,32,155,19,178,1,179,22,179,22,178,1,206,6,179,22,206,6,200,27,200,27,206,6,218,34,244,314,241,278,257,260,244,314,257,260,270,302,270,302,257,260,271,241,270,302,271,241,293,286,293,286,271,241,280,219,293,286,280,219,286,193,182,308,203,301,214,323,214,323,203,301,222,291,214,323,222,291,244,314,244,314,222,291,241,278,180,329,157,311,182,308,180,329,182,308,214,323,343,167,341,196,340,133,340,133,341,196,334,223,340,133,334,223,331,102,331,102,334,223,324,247,331,102,324,247,318,75,318,75,324,247,310,267,318,75,310,267,299,51,299,51,310,267,293,286,299,51,293,286,288,164,288,164,286,132,299,51,299,51,286,132,280,104,299,51,280,104,275,32,275,32,280,104,270,81,275,32,270,81,255,61,236,45,231,12,254,21,110,22,106,26,52,57,52,57,106,26,104,33,52,57,104,33,52,275,52,275,104,33,103,42,52,275,103,42,103,291,40,316,47,308,143,331,143,331,47,308,51,295,143,331,51,295,52,275,27,320,40,316,143,331,27,320,143,331,8,331,27,320,8,331,8,321,148,0,8,9,8,0,48,25,148,0,51,38,104,300,52,275,103,291,293,286,286,193,288,164,
-299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,273,259,271,331,6,331,6,321,25,319,38,315,45,307,49,294,50,276,50,61,49,40,45,25,37,16,25,12,6,9,6,0,146,0,146,9,127,12,113,16,105,24,102,37,100,56,100,164,171,164,193,162,209,158,219,150,225,136,228,115,239,115,239,232,228,232,225,212,218,198,208,190,193,185,171,184,100,184,100,292,101,300,102,306,105,310,110,311,118,312,184,312,214,311,234,306,247,297,255,282,261,259,354,177,227,177,227,168,246,166,259,162,267,154,
-45,24,38,16,276,0,276,0,38,16,25,12,276,0,25,12,6,9,49,294,50,275,106,310,49,294,106,310,45,307,45,307,106,310,111,312,45,307,111,312,271,331,271,331,111,312,118,312,45,24,117,21,49,37,49,37,117,21,108,25,49,37,108,25,50,57,50,57,108,25,102,31,50,57,102,31,50,275,50,275,102,31,100,42,50,275,100,42,100,294,100,184,100,164,176,164,100,184,176,164,176,184,198,185,176,184,198,162,198,185,198,162,213,190,213,190,198,162,213,158,213,190,213,158,222,198,222,198,213,158,222,150,222,198,222,150,229,212,229,212,222,150,229,136,229,212,229,136,233,232,233,232,229,136,233,115,233,232,233,115,244,115,271,331,118,312,184,312,271,331,184,312,213,311,271,331,213,311,234,306,271,331,234,306,247,297,271,331,247,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,50,275,100,294,101,302,50,275,101,302,103,307,50,275,103,307,106,310,271,331,6,331,25,320,271,331,25,320,38,315,271,331,38,315,45,307,255,38,234,26,276,0,276,0,234,26,206,20,276,0,206,20,169,18,276,0,299,84,285,84,276,0,285,84,271,57,276,0,271,57,255,38,276,0,169,18,151,18,276,0,151,18,132,19,276,0,132,19,117,21,276,0,117,21,45,24,276,0,6,9,6,0,25,320,6,331,6,321,176,184,176,164,198,162,233,232,244,115,244,232,
-273,259,271,331,6,331,6,321,25,319,38,315,45,307,49,294,50,276,50,61,49,40,45,25,37,16,25,12,6,9,6,0,146,0,146,9,127,12,113,16,105,24,102,37,100,56,100,164,171,164,193,162,209,158,219,150,225,136,228,115,239,115,239,232,228,232,225,212,218,198,208,190,193,185,171,184,100,184,100,292,101,300,102,306,105,310,110,311,118,312,184,312,214,311,234,306,247,297,255,282,261,259,354,177,227,177,227,168,246,166,259,162,267,154,270,142,271,122,271,44,268,34,259,25,244,19,226,14,204,13,161,19,124,39,97,69,79,111,73,162,75,191,79,219,86,244,97,266,112,283,125,295,140,305,157,312,175,317,195,318,211,317,227,314,242,308,256,300,268,291,276,282,283,273,290,262,296,249,304,233,315,233,311,338,300,338,298,333,294,328,289,325,283,322,277,321,274,322,270,322,266,323,261,325,
-38,315,45,307,271,331,271,331,45,307,110,311,271,331,110,311,118,312,271,331,118,312,184,312,271,331,184,312,214,311,50,276,102,37,100,56,100,184,100,164,171,164,100,184,171,164,171,184,193,185,171,184,193,162,193,185,193,162,208,190,208,190,193,162,209,158,208,190,209,158,218,198,218,198,209,158,219,150,218,198,219,150,225,212,225,212,219,150,225,136,225,212,225,136,228,232,228,232,225,136,228,115,228,232,228,115,239,115,271,331,214,311,234,306,271,331,234,306,247,297,271,331,247,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,50,276,100,56,100,292,50,276,100,292,101,300,50,276,101,300,102,306,50,276,102,306,105,310,50,276,105,310,49,294,110,311,45,307,49,294,110,311,49,294,105,310,25,319,38,315,271,331,25,319,271,331,6,331,25,319,6,331,6,321,146,0,146,9,127,12,146,0,127,12,113,16,146,0,113,16,49,40,146,0,49,40,45,25,146,0,45,25,37,16,146,0,37,16,25,12,146,0,25,12,6,9,146,0,6,9,6,0,50,61,49,40,113,16,50,61,113,16,105,24,50,61,105,24,102,37,50,61,102,37,50,276,171,184,171,164,193,162,228,232,239,115,239,232,
-354,177,227,177,227,168,246,166,259,162,267,154,270,142,271,122,271,44,268,34,259,25,244,19,226,14,204,13,161,19,124,39,97,69,79,111,73,162,75,191,79,219,86,244,97,266,112,283,125,295,140,305,157,312,175,317,195,318,211,317,227,314,242,308,256,300,268,291,276,282,283,273,290,262,296,249,304,233,315,233,311,338,300,338,298,333,294,328,289,325,283,322,277,321,274,322,270,322,266,323,261,325,256,326,243,331,230,334,218,336,204,338,189,338,161,336,135,331,111,322,89,310,70,295,51,275,36,251,25,225,19,195,16,164,18,135,23,110,31,86,42,65,57,46,79,28,105,13,133,2,162,-4,193,-6,223,-5,251,0,278,6,301,16,320,28,320,128,321,144,324,156,330,162,340,166,354,168,352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,211,331,211,321,231,319,244,315,251,307,255,294,256,274,256,180,104,180,104,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,28,319,41,315,49,307,53,294,54,274,54,61,53,39,49,25,42,16,29,12,9,9,9,0,148,0,148,9,129,12,117,17,109,25,105,38,104,56,104,157,256,157,256,62,255,41,252,26,244,17,232,12,212,9,212,0,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,177,331,
-16,164,18,135,19,195,19,195,18,135,23,110,19,195,23,110,25,225,25,225,23,110,31,86,25,225,31,86,36,251,36,251,31,86,42,65,36,251,42,65,51,275,51,275,42,65,57,46,51,275,57,46,70,295,70,295,57,46,73,162,157,312,161,336,140,305,140,305,161,336,135,331,140,305,135,331,125,295,125,295,135,331,112,283,97,266,112,283,111,322,97,266,111,322,89,310,89,310,70,295,75,191,89,310,75,191,79,219,89,310,79,219,86,244,89,310,86,244,97,266,193,-6,204,13,162,-4,162,-4,204,13,161,19,162,-4,161,19,133,2,133,2,161,19,124,39,133,2,124,39,105,13,105,13,124,39,97,69,105,13,97,69,79,28,79,28,97,69,79,111,79,28,79,111,73,162,259,25,244,19,251,0,251,0,244,19,226,14,251,0,226,14,223,-5,223,-5,226,14,204,13,73,162,57,46,79,28,268,291,266,323,261,325,268,291,261,325,256,300,268,291,270,322,266,323,204,338,195,318,211,317,204,338,211,317,218,336,218,336,211,317,227,314,218,336,227,314,230,334,230,334,227,314,242,308,230,334,242,308,243,331,243,331,242,308,256,300,243,331,256,300,256,326,256,326,256,300,261,325,270,322,276,282,274,322,274,322,276,282,277,321,283,322,277,321,283,273,283,322,283,273,290,262,268,291,276,282,270,322,304,233,315,233,311,338,304,233,311,338,300,338,304,233,300,338,298,333,304,233,298,333,296,249,294,328,289,325,290,262,294,328,290,262,296,249,294,328,296,249,298,333,277,321,276,282,283,273,340,166,354,168,354,177,340,166,354,177,330,162,330,162,354,177,270,142,330,162,270,142,271,122,278,6,271,122,271,44,278,6,271,44,268,34,330,162,271,122,324,156,324,156,271,122,278,6,324,156,278,6,321,144,321,144,278,6,301,16,321,144,301,16,320,128,320,128,301,16,320,28,354,177,227,177,246,166,354,177,246,166,259,162,354,177,259,162,267,154,354,177,267,154,270,142,259,25,251,0,278,6,259,25,278,6,268,34,189,338,161,336,175,317,189,338,175,317,195,318,189,338,195,318,204,338,135,331,111,322,112,283,161,336,157,312,175,317,223,-5,204,13,193,-6,246,166,227,177,227,168,283,322,290,262,289,325,75,191,70,295,73,162,
-352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,211,331,211,321,231,319,244,315,251,307,255,294,256,274,256,180,104,180,104,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,28,319,41,315,49,307,53,294,54,274,54,61,53,39,49,25,42,16,29,12,9,9,9,0,148,0,148,9,129,12,117,17,109,25,105,38,104,56,104,157,256,157,256,62,255,41,252,26,244,17,232,12,212,9,212,0,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,177,331,33,331,33,321,54,319,67,315,75,308,79,295,80,275,80,47,79,34,78,24,75,17,69,13,61,12,56,13,53,16,51,21,48,27,46,34,42,41,38,47,33,52,28,54,22,55,14,54,7,50,2,44,-1,37,-2,29,0,16,6,6,17,0,31,-5,
-49,25,42,16,148,0,148,0,42,16,29,12,148,0,29,12,9,9,149,331,9,331,28,319,149,331,28,319,41,315,149,331,41,315,49,307,149,331,49,307,53,294,149,331,53,294,118,315,149,331,118,315,130,319,149,331,130,319,149,321,54,274,105,38,104,56,104,180,104,157,256,157,104,180,256,157,256,180,256,180,256,157,312,25,256,180,312,25,308,37,54,274,104,56,104,274,54,274,104,274,106,294,54,274,106,294,110,307,54,274,110,307,118,315,54,274,118,315,53,294,252,26,244,17,352,0,352,0,244,17,232,12,352,0,232,12,212,9,333,319,352,321,352,331,333,319,352,331,320,315,320,315,352,331,255,294,320,315,255,294,256,274,308,37,256,274,256,180,307,55,307,274,256,274,256,274,307,274,308,293,256,274,308,293,312,307,352,331,211,331,231,319,352,331,231,319,244,315,352,331,244,315,251,307,352,331,251,307,255,294,352,0,352,9,333,12,352,0,333,12,320,17,352,0,320,17,255,41,352,0,255,41,252,26,256,62,255,41,320,17,256,62,320,17,312,25,256,62,312,25,256,157,148,0,148,9,129,12,148,0,129,12,117,17,148,0,117,17,53,39,148,0,53,39,49,25,54,61,53,39,117,17,54,61,117,17,109,25,54,61,109,25,105,38,54,61,105,38,54,274,148,0,9,9,9,0,352,0,212,9,212,0,256,274,308,37,307,55,231,319,211,331,211,321,320,315,256,274,312,307,28,319,9,331,9,321,
-157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,177,331,33,331,33,321,54,319,67,315,75,308,79,295,80,275,80,47,79,34,78,24,75,17,69,13,61,12,56,13,53,16,51,21,48,27,46,34,42,41,38,47,33,52,28,54,22,55,14,54,7,50,2,44,
-52,23,44,15,157,0,157,0,44,15,30,11,157,0,30,11,9,9,157,331,9,331,30,320,157,331,30,320,44,316,157,331,44,316,53,308,157,331,53,308,57,295,157,331,57,295,122,316,157,331,122,316,136,320,157,331,136,320,157,321,122,16,114,24,57,56,57,56,114,24,109,37,57,56,109,37,57,276,57,276,109,37,108,56,57,276,108,56,108,276,57,276,108,276,109,295,57,276,109,295,113,308,57,276,113,308,122,316,57,276,122,316,57,295,157,0,157,9,137,11,157,0,137,11,122,16,157,0,122,16,56,36,157,0,56,36,52,23,157,0,9,9,9,0,56,36,122,16,57,56,30,320,9,331,9,321,
-177,331,33,331,33,321,54,319,67,315,75,308,79,295,80,275,80,47,79,34,78,24,75,17,69,13,61,12,56,13,53,16,51,21,48,27,46,34,42,41,38,47,33,52,28,54,22,55,14,54,7,50,2,44,-1,37,-2,29,0,16,6,6,17,0,31,-5,47,-6,76,-2,100,8,117,28,128,56,131,93,131,275,132,294,136,307,143,315,157,319,177,321,362,0,362,9,349,11,336,16,322,25,305,41,283,64,166,192,259,281,278,298,292,309,305,316,320,320,338,321,338,331,208,331,208,321,220,321,229,320,235,318,238,315,240,311,241,305,239,298,234,289,226,280,202,256,113,174,113,293,117,307,124,315,137,319,158,321,158,331,17,331,17,321,37,319,50,315,57,306,61,293,62,275,62,63,61,40,57,26,50,17,
-78,24,75,17,76,-2,76,-2,75,17,69,13,76,-2,69,13,61,12,61,12,56,13,76,-2,76,-2,56,13,47,-6,157,319,177,321,177,331,157,319,177,331,143,315,143,315,177,331,79,295,143,315,79,295,80,275,100,8,80,275,80,47,100,8,80,47,79,34,131,275,132,294,117,28,131,275,117,28,128,56,131,275,128,56,131,93,132,294,136,307,80,275,132,294,80,275,100,8,132,294,100,8,117,28,177,331,33,331,54,319,177,331,54,319,67,315,177,331,67,315,75,308,177,331,75,308,79,295,78,24,76,-2,100,8,78,24,100,8,79,34,47,-6,56,13,53,16,47,-6,53,16,51,21,47,-6,51,21,48,27,47,-6,48,27,46,34,47,-6,46,34,42,41,47,-6,42,41,38,47,47,-6,38,47,33,52,47,-6,33,52,31,-5,33,52,28,54,31,-5,31,-5,28,54,22,55,31,-5,22,55,17,0,17,0,22,55,14,54,17,0,14,54,7,50,17,0,7,50,6,6,6,6,7,50,2,44,6,6,2,44,0,16,0,16,2,44,-1,37,0,16,-1,37,-2,29,54,319,33,331,33,321,143,315,80,275,136,307,
-362,0,362,9,349,11,336,16,322,25,305,41,283,64,166,192,259,281,278,298,292,309,305,316,320,320,338,321,338,331,208,331,208,321,220,321,229,320,235,318,238,315,240,311,241,305,239,298,234,289,226,280,202,256,113,174,113,293,117,307,124,315,137,319,158,321,158,331,17,331,17,321,37,319,50,315,57,306,61,293,62,275,62,63,61,40,57,26,50,17,36,12,17,9,17,0,157,0,157,9,139,12,126,16,118,23,114,36,113,55,113,148,126,158,176,107,198,84,217,63,232,46,241,32,244,22,244,18,241,15,237,12,231,11,224,10,210,9,210,0,299,87,286,87,277,69,273,62,265,50,254,39,239,30,223,24,203,21,180,20,127,20,114,22,106,26,102,32,100,42,100,274,101,294,105,307,113,315,127,319,147,321,147,331,6,331,6,321,26,319,38,314,46,306,49,292,50,273,50,57,49,38,45,25,37,16,25,12,6,9,6,0,275,0,432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,6,9,6,0,123,0,123,9,
-158,321,158,321,137,319,137,319,158,321,158,331,137,319,158,331,124,315,124,315,158,331,61,293,124,315,61,293,62,275,114,36,62,275,62,63,114,36,62,63,118,23,118,23,62,63,126,16,62,275,114,36,113,55,113,174,113,148,126,158,113,174,126,158,202,256,202,256,126,158,166,192,202,256,166,192,259,281,62,275,113,55,113,274,62,275,113,274,113,293,62,275,113,293,117,307,62,275,117,307,124,315,158,331,17,331,37,319,158,331,37,319,50,315,158,331,50,315,57,306,158,331,57,306,61,293,234,289,226,280,259,281,259,281,226,280,215,269,259,281,215,269,202,256,338,331,208,331,220,321,338,331,220,321,229,320,338,331,229,320,235,318,338,331,235,318,238,315,338,331,238,315,240,311,338,331,240,311,241,305,338,331,241,305,305,316,338,331,305,316,320,320,338,331,320,320,338,321,241,305,259,281,278,298,241,305,278,298,292,309,241,305,292,309,305,316,239,298,234,289,259,281,239,298,259,281,241,305,241,15,237,12,362,0,362,0,237,12,231,11,362,0,231,11,224,10,244,22,362,0,336,16,244,22,336,16,322,25,244,22,322,25,305,41,244,22,305,41,283,64,244,22,283,64,241,32,283,64,166,192,176,107,283,64,176,107,198,84,283,64,198,84,217,63,283,64,217,63,232,46,283,64,232,46,241,32,349,11,336,16,362,0,349,11,362,0,362,9,244,18,241,15,362,0,244,18,362,0,244,22,210,9,210,0,362,0,210,9,362,0,224,10,157,0,157,9,139,12,157,0,139,12,126,16,157,0,126,16,61,40,157,0,61,40,57,26,157,0,57,26,50,17,157,0,50,17,36,12,157,0,36,12,17,9,157,0,17,9,17,0,61,40,126,16,62,63,176,107,166,192,126,158,220,321,208,331,208,321,37,319,17,331,17,321,
-299,87,286,87,277,69,273,62,265,50,254,39,239,30,223,24,203,21,180,20,127,20,114,22,106,26,102,32,100,42,100,274,101,294,105,307,113,315,127,319,147,321,147,331,6,331,6,321,26,319,38,314,46,306,49,292,50,273,50,57,49,38,45,25,37,16,25,12,6,9,6,0,275,0,432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,6,9,6,0,123,0,123,9,103,12,90,18,82,29,78,48,
-147,321,147,321,127,319,127,319,147,321,147,331,127,319,147,331,113,315,113,315,147,331,49,292,113,315,49,292,50,273,102,32,50,273,50,57,102,32,50,57,106,26,106,26,50,57,49,38,106,26,49,38,114,22,114,22,49,38,45,25,114,22,45,25,127,20,127,20,45,25,275,0,127,20,275,0,146,20,146,20,275,0,180,20,100,42,100,274,50,273,50,273,100,274,101,294,50,273,101,294,105,307,147,331,6,331,26,319,147,331,26,319,38,314,147,331,38,314,46,306,147,331,46,306,49,292,277,69,273,62,275,0,275,0,273,62,269,56,275,0,269,56,265,50,265,50,254,39,275,0,275,0,254,39,239,30,275,0,239,30,223,24,299,87,286,87,281,77,299,87,281,77,277,69,299,87,277,69,275,0,203,21,180,20,275,0,203,21,275,0,223,24,275,0,45,25,37,16,275,0,37,16,25,12,275,0,25,12,6,9,275,0,6,9,6,0,50,273,102,32,100,42,26,319,6,331,6,321,113,315,50,273,105,307,
-432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,6,9,6,0,123,0,123,9,103,12,90,18,82,29,78,48,76,75,76,275,203,0,209,0,337,286,337,61,336,40,333,26,325,17,312,12,292,9,292,0,353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,103,13,90,20,82,31,78,49,76,75,76,269,297,-5,306,-5,306,274,308,289,311,299,315,307,320,313,324,315,329,318,335,319,343,320,353,321,344,166,336,222,
-49,29,41,18,123,0,123,0,41,18,27,12,123,0,27,12,6,9,333,26,325,17,432,0,432,0,325,17,312,12,432,0,312,12,292,9,413,320,431,321,431,331,413,320,431,331,401,316,401,316,431,331,337,286,401,316,337,286,393,307,393,307,337,286,389,294,401,17,393,25,337,61,337,61,393,25,389,38,337,61,389,38,337,286,337,286,389,38,388,56,337,286,388,56,388,275,203,0,209,0,222,80,222,80,209,0,337,286,222,80,337,286,332,331,332,331,337,286,431,331,106,331,7,331,28,319,106,331,28,319,42,315,106,331,42,315,50,307,106,331,50,307,54,294,106,331,54,294,55,275,106,331,55,275,76,275,106,331,76,275,203,0,106,331,203,0,222,80,76,75,76,275,55,275,76,75,55,275,78,48,78,48,55,275,55,75,78,48,55,75,82,29,82,29,55,75,54,47,82,29,54,47,90,18,90,18,54,47,49,29,90,18,49,29,123,0,432,0,432,9,413,12,432,0,413,12,401,17,432,0,401,17,336,40,432,0,336,40,333,26,103,12,90,18,123,0,103,12,123,0,123,9,123,0,6,9,6,0,432,0,292,9,292,0,336,40,401,17,337,61,28,319,7,331,7,321,389,294,337,286,388,275,
-353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,103,13,90,20,82,31,78,49,76,75,76,269,297,-5,306,-5,306,274,308,289,311,299,315,307,320,313,324,315,329,318,335,319,343,320,353,321,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,
-49,30,41,19,123,0,123,0,41,19,27,13,123,0,27,13,6,9,256,319,263,317,353,331,353,331,263,317,269,313,353,331,269,313,275,309,275,309,278,303,353,331,353,331,278,303,281,295,353,331,281,295,324,315,324,315,281,295,320,313,324,315,320,313,320,312,320,312,320,313,315,307,315,307,320,313,284,274,315,307,284,274,284,259,297,-5,284,259,284,89,297,-5,284,89,91,331,353,331,324,315,329,318,353,331,329,318,335,319,353,331,335,319,343,320,353,331,343,320,353,321,306,-5,306,253,297,-5,297,-5,306,253,306,274,297,-5,306,274,284,259,284,259,306,274,308,289,284,259,308,289,311,299,283,285,284,274,320,313,283,285,320,313,281,295,247,320,256,319,353,331,247,320,353,331,235,331,247,320,235,331,235,321,91,331,6,331,19,321,91,331,19,321,29,318,91,331,29,318,37,313,91,331,37,313,46,306,91,331,46,306,55,295,91,331,55,295,76,269,91,331,76,269,297,-5,55,295,78,49,76,75,54,48,49,30,90,20,90,20,49,30,123,0,90,20,123,0,103,13,103,13,123,0,123,9,55,75,54,48,82,31,55,75,82,31,78,49,55,75,78,49,55,295,123,0,6,9,6,0,54,48,90,20,82,31,19,321,6,331,6,321,76,269,55,295,76,75,315,307,284,259,311,299,
-344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,8,331,8,321,27,319,39,315,46,307,49,294,50,276,50,39,47,25,40,16,27,12,8,9,8,0,148,0,148,9,128,12,114,16,106,24,102,37,101,56,101,146,109,145,115,145,122,144,136,144,164,145,188,147,208,153,225,161,243,175,253,185,260,197,266,210,270,225,271,240,270,254,267,268,262,280,255,291,246,300,231,310,213,319,191,325,166,329,137,331,16383,16383,101,295,101,302,103,307,106,310,111,312,118,313,155,310,182,302,202,288,213,266,217,238,213,213,202,192,185,177,162,167,132,164,120,164,
-149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,81,24,74,166,46,61,223,19,234,1,235,26,130,25,180,-6,142,19,
-8,331,8,321,27,319,39,315,46,307,49,294,50,276,50,39,47,25,40,16,27,12,8,9,8,0,148,0,148,9,128,12,114,16,106,24,102,37,101,56,101,146,109,145,115,145,122,144,136,144,164,145,188,147,208,153,225,161,243,175,253,185,260,197,266,210,270,225,271,240,270,254,267,268,262,280,255,291,246,300,231,310,213,319,191,325,166,329,137,331,16383,16383,101,295,101,302,103,307,106,310,111,312,118,313,155,310,182,302,202,288,213,266,217,238,213,213,202,192,185,177,162,167,132,164,120,164,114,165,108,165,101,166,350,-88,350,-78,318,-74,288,-65,261,-51,236,-30,213,-2,232,1,248,6,263,12,277,21,290,32,309,54,324,77,335,104,342,133,344,166,336,224,314,272,279,308,234,330,180,338,127,330,82,308,47,272,25,224,17,166,18,140,23,115,31,92,42,70,55,50,67,36,79,25,94,16,111,7,132,0,153,-25,177,-48,206,-66,241,-78,282,-85,326,-88,16383,16383,287,169,285,139,281,111,275,85,266,64,255,47,243,35,230,25,215,18,198,13,180,11,163,13,146,18,129,26,115,37,103,50,93,68,85,89,79,113,75,139,74,167,76,196,
-111,312,118,312,118,313,137,331,118,313,155,310,137,331,155,310,166,329,166,329,155,310,182,302,166,329,182,302,191,325,191,325,182,302,202,288,191,325,202,288,213,319,213,319,202,288,213,266,213,319,213,266,231,310,231,310,213,266,217,238,231,310,217,238,225,161,225,161,213,213,208,153,208,153,213,213,202,192,208,153,202,192,188,147,188,147,202,192,185,177,188,147,185,177,164,145,164,145,185,177,162,167,164,145,162,167,136,144,136,144,162,167,132,164,136,144,132,164,128,144,128,144,132,164,126,164,128,144,126,164,122,144,122,144,126,164,120,164,122,144,120,164,115,145,115,145,120,164,114,165,115,145,114,165,109,145,109,145,114,165,108,165,109,145,108,165,101,166,101,56,101,166,50,276,101,56,50,276,102,37,102,37,50,276,50,61,101,166,101,146,109,145,271,240,270,254,270,225,270,225,270,254,267,268,270,225,267,268,266,210,266,210,267,268,262,280,266,210,262,280,260,197,260,197,262,280,255,291,260,197,255,291,253,185,253,185,255,291,246,300,253,185,246,300,243,175,243,175,246,300,231,310,243,175,231,310,225,161,137,331,8,331,27,319,137,331,27,319,39,315,137,331,39,315,46,307,137,331,46,307,49,294,137,331,49,294,50,276,137,331,50,276,106,310,137,331,106,310,111,312,137,331,111,312,118,313,101,295,101,302,50,276,101,295,50,276,101,166,103,307,106,310,50,276,103,307,50,276,101,302,148,0,148,9,128,12,148,0,128,12,114,16,148,0,114,16,50,39,148,0,50,39,47,25,148,0,47,25,40,16,148,0,40,16,27,12,148,0,27,12,8,9,148,0,8,9,8,0,50,61,50,39,114,16,50,61,114,16,106,24,50,61,106,24,102,37,27,319,8,331,8,321,213,213,225,161,217,238,155,310,118,313,118,312,
-350,-88,350,-78,318,-74,288,-65,261,-51,236,-30,213,-2,232,1,248,6,263,12,277,21,290,32,309,54,324,77,335,104,342,133,344,166,336,224,314,272,279,308,234,330,180,338,127,330,82,308,47,272,25,224,17,166,18,140,23,115,31,92,42,70,55,50,67,36,79,25,94,16,111,7,132,0,153,-25,177,-48,206,-66,241,-78,282,-85,326,-88,16383,16383,287,169,285,139,281,111,275,85,266,64,255,47,243,35,230,25,215,18,198,13,180,11,163,13,146,18,129,26,115,37,103,50,93,68,85,89,79,113,75,139,74,167,76,196,80,222,87,247,96,268,107,285,119,297,133,307,147,314,163,318,179,320,193,319,206,316,219,312,231,306,242,297,257,280,270,258,279,232,285,202,287,169,330,0,330,9,318,11,308,13,299,17,291,24,283,33,183,160,216,168,242,180,260,197,270,217,273,242,272,255,270,268,265,281,258,292,249,301,234,311,217,319,196,326,172,330,145,331,8,331,8,321,28,319,40,315,47,307,50,294,51,276,51,62,50,40,47,25,39,16,27,12,8,9,8,0,147,0,147,9,127,12,114,16,107,24,103,37,102,56,102,153,130,154,249,0,16383,16383,102,291,103,300,106,306,111,310,118,312,127,313,161,310,186,302,205,289,215,270,219,246,218,231,214,218,208,206,200,196,190,189,177,182,163,177,147,174,128,172,102,171,234,232,224,338,213,338,211,332,209,327,206,324,202,322,197,321,194,321,190,322,185,323,175,327,164,331,154,334,134,338,123,338,
-79,113,79,25,85,89,85,89,79,25,94,16,85,89,94,16,93,68,93,68,94,16,103,50,115,37,103,50,111,7,115,37,111,7,132,0,79,113,75,139,79,25,79,25,75,139,74,167,67,36,74,167,76,196,67,36,76,196,55,50,55,50,76,196,82,308,55,50,82,308,47,272,147,314,180,338,133,307,133,307,180,338,127,330,133,307,127,330,119,297,119,297,127,330,107,285,96,268,107,285,127,330,96,268,127,330,82,308,129,26,132,0,146,18,146,18,132,0,153,-25,146,18,153,-25,163,13,163,13,153,-25,177,-48,163,13,177,-48,180,11,180,11,177,-48,206,-66,180,11,206,-66,198,13,234,330,180,338,193,319,193,319,180,338,179,320,163,318,179,320,180,338,163,318,180,338,147,314,206,316,219,312,234,330,234,330,219,312,231,306,234,330,231,306,242,297,242,297,257,280,279,308,279,308,257,280,270,258,279,308,270,258,279,232,232,1,248,6,243,35,243,35,248,6,255,47,266,64,255,47,263,12,266,64,263,12,277,21,236,-30,213,-2,241,-78,215,18,213,-2,232,1,215,18,232,1,230,25,230,25,232,1,243,35,206,-66,241,-78,213,-2,206,-66,213,-2,215,18,206,-66,215,18,198,13,336,224,314,272,324,77,336,224,324,77,335,104,336,224,335,104,342,133,336,224,342,133,344,166,285,139,290,32,287,169,287,169,290,32,314,272,314,272,290,32,309,54,314,272,309,54,324,77,285,202,287,169,314,272,285,202,314,272,279,308,285,202,279,308,279,232,279,308,234,330,242,297,281,111,275,85,277,21,281,111,277,21,290,32,281,111,290,32,285,139,255,47,248,6,263,12,326,-88,350,-88,350,-78,326,-88,350,-78,318,-74,326,-88,318,-74,288,-65,326,-88,288,-65,282,-85,261,-51,236,-30,241,-78,261,-51,241,-78,282,-85,261,-51,282,-85,288,-65,82,308,76,196,80,222,82,308,80,222,87,247,82,308,87,247,96,268,18,140,23,115,25,224,25,224,23,115,31,92,25,224,31,92,47,272,47,272,31,92,42,70,47,272,42,70,55,50,103,50,94,16,111,7,18,140,25,224,17,166,266,64,277,21,275,85,234,330,193,319,206,316,115,37,132,0,129,26,79,25,74,167,67,36,
-330,0,330,9,318,11,308,13,299,17,291,24,283,33,183,160,216,168,242,180,260,197,270,217,273,242,272,255,270,268,265,281,258,292,249,301,234,311,217,319,196,326,172,330,145,331,8,331,8,321,28,319,40,315,47,307,50,294,51,276,51,62,50,40,47,25,39,16,27,12,8,9,8,0,147,0,147,9,127,12,114,16,107,24,103,37,102,56,102,153,130,154,249,0,16383,16383,102,291,103,300,106,306,111,310,118,312,127,313,161,310,186,302,205,289,215,270,219,246,218,231,214,218,208,206,200,196,190,189,177,182,163,177,147,174,128,172,102,171,234,232,224,338,213,338,211,332,209,327,206,324,202,322,197,321,194,321,190,322,185,323,175,327,164,331,154,334,134,338,123,338,95,334,71,323,52,305,40,281,36,251,38,232,44,214,56,196,73,180,97,165,116,154,135,142,152,130,168,118,180,107,185,100,189,93,192,85,194,77,195,67,192,49,184,33,172,21,155,14,136,11,109,15,85,25,65,42,47,67,32,99,22,99,36,-6,47,-6,48,0,50,4,53,7,57,9,61,10,64,10,79,7,84,4,96,0,107,-2,131,-6,143,-6,176,-2,204,10,226,29,240,55,246,86,243,108,233,128,218,148,
-118,312,127,312,127,313,145,331,127,313,161,310,145,331,161,310,172,330,172,330,161,310,186,302,172,330,186,302,196,326,196,326,186,302,205,289,196,326,205,289,217,319,217,319,205,289,215,270,217,319,215,270,219,246,214,218,208,206,216,168,216,168,208,206,200,196,216,168,200,196,190,189,190,189,177,182,183,160,183,160,177,182,163,177,183,160,163,177,249,0,249,0,163,177,147,174,249,0,147,174,130,154,130,154,147,174,128,172,130,154,128,172,102,171,265,281,258,292,260,197,260,197,258,292,249,301,260,197,249,301,242,180,242,180,249,301,234,311,242,180,234,311,219,246,219,246,234,311,217,319,214,218,216,168,218,231,218,231,216,168,242,180,218,231,242,180,219,246,270,217,273,242,272,255,270,217,272,255,270,268,270,217,270,268,265,281,270,217,265,281,260,197,190,189,183,160,216,168,318,11,308,13,330,0,330,0,308,13,299,17,330,0,299,17,249,0,249,0,299,17,291,24,249,0,291,24,283,33,102,56,102,171,51,276,102,56,51,276,103,37,103,37,51,276,51,62,102,171,102,153,130,154,145,331,8,331,28,319,145,331,28,319,40,315,145,331,40,315,47,307,145,331,47,307,50,294,145,331,50,294,51,276,145,331,51,276,111,310,145,331,111,310,118,312,145,331,118,312,127,313,102,291,103,300,51,276,102,291,51,276,102,171,106,306,111,310,51,276,106,306,51,276,103,300,147,0,147,9,127,12,147,0,127,12,114,16,147,0,114,16,50,40,147,0,50,40,47,25,147,0,47,25,39,16,147,0,39,16,27,12,147,0,27,12,8,9,147,0,8,9,8,0,51,62,50,40,114,16,51,62,114,16,107,24,51,62,107,24,103,37,28,319,8,331,8,321,183,160,249,0,283,33,318,11,330,0,330,9,161,310,127,313,127,312,
-234,232,224,338,213,338,211,332,209,327,206,324,202,322,197,321,194,321,190,322,185,323,175,327,164,331,154,334,134,338,123,338,95,334,71,323,52,305,40,281,36,251,38,232,44,214,56,196,73,180,97,165,116,154,135,142,152,130,168,118,180,107,185,100,189,93,192,85,194,77,195,67,192,49,184,33,172,21,155,14,136,11,109,15,85,25,65,42,47,67,32,99,22,99,36,-6,47,-6,48,0,50,4,53,7,57,9,61,10,64,10,79,7,84,4,96,0,107,-2,131,-6,143,-6,176,-2,204,10,226,29,240,55,246,86,243,108,233,128,218,148,196,166,168,185,139,202,114,218,95,234,83,251,79,270,81,286,88,299,98,309,112,315,129,318,146,316,162,310,177,302,190,291,201,278,206,271,211,263,215,254,218,244,222,232,296,246,293,331,12,331,8,246,21,246,27,274,37,292,50,303,70,309,97,310,127,310,127,61,126,39,123,25,115,16,101,12,80,9,80,0,226,0,226,9,205,11,192,16,183,23,179,36,178,55,178,310,208,310,235,309,254,303,268,292,277,274,285,246,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,
-50,4,53,7,65,42,65,42,53,7,57,9,65,42,57,9,61,10,61,10,64,10,65,42,65,42,64,10,69,9,65,42,69,9,85,25,85,25,69,9,74,8,85,25,74,8,79,7,95,234,83,251,97,165,97,165,83,251,79,270,73,180,79,270,71,323,73,180,71,323,56,196,56,196,71,323,52,305,56,196,52,305,44,214,44,214,52,305,40,281,44,214,40,281,38,232,38,232,40,281,36,251,81,286,88,299,95,334,95,334,88,299,98,309,95,334,98,309,123,338,123,338,98,309,112,315,123,338,112,315,129,318,129,318,146,316,134,338,134,338,146,316,144,336,81,286,95,334,71,323,81,286,71,323,79,270,134,338,123,338,129,318,144,336,146,316,154,334,154,334,146,316,162,310,154,334,162,310,164,331,164,331,162,310,177,302,164,331,177,302,175,327,175,327,177,302,180,325,95,234,97,165,114,218,114,218,97,165,116,154,114,218,116,154,139,202,139,202,116,154,135,142,139,202,135,142,152,130,136,11,119,-4,131,-6,136,11,131,-6,143,-6,136,11,109,15,119,-4,79,7,84,4,85,25,85,25,84,4,96,0,85,25,96,0,109,15,109,15,96,0,107,-2,109,15,107,-2,119,-4,36,-6,47,-6,47,67,47,67,47,-6,48,0,47,67,48,0,65,42,65,42,48,0,50,4,32,99,22,99,36,-6,32,99,36,-6,47,67,139,202,152,130,168,185,168,185,152,130,168,118,168,185,168,118,180,107,180,107,185,100,196,166,196,166,185,100,189,93,196,166,189,93,192,85,246,86,243,108,240,55,240,55,243,108,233,128,240,55,233,128,226,29,226,29,233,128,218,148,226,29,218,148,204,10,204,10,218,148,196,166,204,10,196,166,195,67,195,67,192,49,204,10,204,10,192,49,184,33,204,10,184,33,176,-2,176,-2,184,33,172,21,176,-2,172,21,155,14,196,166,192,85,194,77,196,166,194,77,195,67,196,166,168,185,180,107,155,14,136,11,143,-6,155,14,143,-6,176,-2,190,291,201,278,194,321,194,321,201,278,197,321,202,322,197,321,201,278,190,291,194,321,190,322,190,291,190,322,185,323,190,291,185,323,180,325,190,291,180,325,177,302,224,338,213,338,215,254,224,338,215,254,218,244,224,338,218,244,222,232,224,338,222,232,234,232,206,324,206,271,209,327,209,327,206,271,211,263,209,327,211,263,211,332,211,332,211,263,215,254,211,332,215,254,213,338,202,322,201,278,206,271,202,322,206,271,206,324,97,165,79,270,73,180,
-296,246,293,331,12,331,8,246,21,246,27,274,37,292,50,303,70,309,97,310,127,310,127,61,126,39,123,25,115,16,101,12,80,9,80,0,226,0,226,9,205,11,192,16,183,23,179,36,178,55,178,310,208,310,235,309,254,303,268,292,277,274,285,246,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,
-293,331,12,331,70,309,293,331,70,309,97,310,293,331,97,310,127,310,293,331,127,310,178,310,293,331,178,310,208,310,293,331,208,310,235,309,293,331,235,309,254,303,293,331,254,303,268,292,293,331,268,292,277,274,293,331,277,274,285,246,293,331,285,246,296,246,192,16,183,23,127,61,127,61,183,23,179,36,127,61,179,36,127,310,127,310,179,36,178,55,127,310,178,55,178,310,12,331,8,246,21,246,12,331,21,246,27,274,12,331,27,274,37,292,12,331,37,292,50,303,12,331,50,303,70,309,226,0,226,9,205,11,226,0,205,11,192,16,226,0,192,16,126,39,226,0,126,39,123,25,226,0,123,25,115,16,226,0,115,16,101,12,226,0,101,12,80,9,226,0,80,9,80,0,126,39,192,16,127,61,
-353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,349,331,247,331,247,321,258,321,268,319,276,316,281,310,282,301,282,295,281,289,279,282,276,274,273,265,200,80,123,252,116,269,110,283,106,292,104,300,104,305,105,310,107,314,112,317,118,319,127,320,141,321,141,331,8,331,8,321,21,320,31,316,41,307,50,291,62,267,184,-5,191,-5,302,276,311,295,319,308,328,316,338,320,349,321,466,331,368,331,368,321,381,320,391,318,397,314,401,308,402,301,402,294,401,287,399,280,397,271,394,262,331,93,259,275,255,289,253,295,252,300,251,304,253,310,257,315,265,318,276,320,290,321,290,331,157,331,
-105,79,106,8,109,63,109,63,106,8,121,1,109,63,121,1,115,50,115,50,121,1,125,37,135,30,125,37,138,-3,135,30,138,-3,146,24,146,24,138,-3,157,-5,146,24,157,-5,158,19,158,19,157,-5,177,-6,158,19,177,-6,173,16,173,16,177,-6,189,15,208,16,189,15,204,-5,208,16,204,-5,227,0,103,118,103,275,93,16,103,118,93,16,104,97,104,97,93,16,106,8,104,97,106,8,105,79,125,37,121,1,138,-3,283,103,282,85,290,45,290,45,282,85,279,70,290,45,279,70,278,30,278,30,279,70,273,57,278,30,273,57,265,45,265,45,254,34,264,17,264,17,254,34,247,6,241,26,225,20,227,0,241,26,227,0,247,6,241,26,247,6,254,34,353,331,237,331,257,319,353,331,257,319,270,312,353,331,270,312,279,301,353,331,279,301,318,311,353,331,318,311,331,318,353,331,331,318,353,321,305,258,306,282,297,62,305,258,297,62,302,81,305,258,302,81,305,104,305,258,305,104,305,131,290,45,297,62,306,282,290,45,306,282,283,257,290,45,283,257,283,125,290,45,283,125,283,103,310,300,318,311,282,283,310,300,282,283,283,257,310,300,283,257,306,282,265,45,264,17,278,30,189,15,177,-6,204,-5,128,319,148,321,148,331,128,319,148,331,115,314,115,314,148,331,51,297,115,314,51,297,52,280,53,95,52,280,52,124,58,69,66,48,104,293,104,293,66,48,78,30,104,293,78,30,103,275,103,275,78,30,93,16,104,293,108,306,52,280,104,293,52,280,53,95,104,293,53,95,58,69,148,331,7,331,27,319,148,331,27,319,40,315,148,331,40,315,47,308,148,331,47,308,51,297,27,319,7,331,7,321,115,314,52,280,108,306,257,319,237,331,237,321,318,311,279,301,282,283,208,16,227,0,225,20,
-349,331,247,331,247,321,258,321,268,319,276,316,281,310,282,301,282,295,281,289,279,282,276,274,273,265,200,80,123,252,116,269,110,283,106,292,104,300,104,305,105,310,107,314,112,317,118,319,127,320,141,321,141,331,8,331,8,321,21,320,31,316,41,307,50,291,62,267,184,-5,191,-5,302,276,311,295,319,308,328,316,338,320,349,321,466,331,368,331,368,321,381,320,391,318,397,314,401,308,402,301,402,294,401,287,399,280,397,271,394,262,331,93,259,275,255,289,253,295,252,300,251,304,253,310,257,315,265,318,276,320,290,321,290,331,157,331,157,321,171,320,182,317,191,309,199,295,208,273,222,236,170,94,98,282,96,288,95,293,93,298,93,311,96,316,102,319,111,321,
-62,267,184,-5,62,267,62,267,184,-5,104,300,62,267,104,300,104,305,104,305,105,310,62,267,62,267,105,310,107,314,62,267,107,314,50,291,141,331,8,331,21,320,141,331,21,320,31,316,141,331,31,316,41,307,141,331,41,307,50,291,141,331,50,291,112,317,141,331,112,317,118,319,141,331,118,319,127,320,141,331,127,320,141,321,281,289,279,282,302,276,302,276,279,282,276,274,302,276,276,274,273,265,273,265,200,80,302,276,302,276,200,80,191,-5,349,331,247,331,258,321,349,331,258,321,268,319,349,331,268,319,276,316,349,331,276,316,281,310,349,331,281,310,282,301,349,331,282,301,328,316,349,331,328,316,338,320,349,331,338,320,349,321,282,301,302,276,311,295,282,301,311,295,319,308,282,301,319,308,328,316,282,295,281,289,302,276,282,295,302,276,282,301,184,-5,191,-5,200,80,184,-5,200,80,123,252,184,-5,123,252,116,269,184,-5,116,269,110,283,184,-5,110,283,106,292,184,-5,106,292,104,300,258,321,247,331,247,321,21,320,8,331,8,321,112,317,50,291,107,314,
-466,331,368,331,368,321,381,320,391,318,397,314,401,308,402,301,402,294,401,287,399,280,397,271,394,262,331,93,259,275,255,289,253,295,252,300,251,304,253,310,257,315,265,318,276,320,290,321,290,331,157,331,157,321,171,320,182,317,191,309,199,295,208,273,222,236,170,94,98,282,96,288,95,293,93,298,93,311,96,316,102,319,111,321,124,321,124,331,2,331,2,321,16,320,27,314,36,303,45,286,55,262,73,210,92,157,132,49,151,-5,158,-5,235,206,251,165,267,123,299,37,315,-5,323,-5,344,61,361,111,377,158,397,212,425,286,430,299,436,308,443,314,453,318,466,321,352,0,352,9,338,12,327,16,317,22,307,32,296,46,200,184,272,272,289,292,303,305,316,314,331,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,263,301,260,296,257,290,251,282,243,272,188,202,166,234,151,255,139,272,131,286,126,297,124,306,125,312,128,316,133,319,139,320,147,321,161,321,161,331,11,331,11,321,29,319,44,312,59,299,78,276,103,242,156,164,78,66,58,42,43,26,31,17,19,12,5,9,5,0,121,0,121,9,106,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,100,57,109,70,169,145,217,74,226,60,233,48,
-16,320,27,314,124,331,124,331,27,314,36,303,124,331,36,303,96,316,96,316,36,303,45,286,96,316,45,286,55,262,55,262,73,210,93,311,93,311,73,210,93,306,93,302,93,306,92,157,93,302,92,157,112,103,111,321,124,321,124,331,111,321,124,331,102,319,102,319,124,331,96,316,93,306,73,210,92,157,96,316,55,262,93,311,2,331,2,321,16,320,2,331,16,320,124,331,251,165,267,123,251,304,251,304,253,310,222,236,222,236,253,310,208,273,199,295,208,273,257,315,199,295,257,315,290,331,290,331,257,315,265,318,290,331,265,318,276,320,276,320,290,321,290,331,251,304,222,236,235,206,251,304,235,206,251,165,257,315,208,273,253,310,290,331,157,331,171,320,290,331,171,320,182,317,290,331,182,317,191,309,290,331,191,309,199,295,394,262,361,111,377,158,394,262,377,158,397,212,394,262,331,93,344,61,394,262,344,61,361,111,331,93,259,275,267,123,331,93,267,123,283,80,331,93,283,80,299,37,331,93,299,37,315,-5,331,93,315,-5,323,-5,331,93,323,-5,344,61,267,123,259,275,257,282,267,123,257,282,255,289,267,123,255,289,253,295,267,123,253,295,252,300,267,123,252,300,251,304,402,294,401,287,425,286,425,286,401,287,399,280,425,286,399,280,397,212,397,212,399,280,397,271,397,212,397,271,394,262,402,301,425,286,430,299,402,301,430,299,436,308,402,301,436,308,443,314,402,301,443,314,466,331,402,301,466,331,401,308,402,294,425,286,402,301,453,318,466,321,466,331,453,318,466,331,443,314,466,331,368,331,381,320,466,331,381,320,391,318,466,331,391,318,397,314,466,331,397,314,401,308,170,94,98,282,112,103,170,94,112,103,132,49,170,94,132,49,151,-5,170,94,151,-5,158,-5,170,94,158,-5,235,206,170,94,235,206,222,236,112,103,98,282,96,288,112,103,96,288,95,293,112,103,95,293,93,298,112,103,93,298,93,302,381,320,368,331,368,321,171,320,157,331,157,321,
-352,0,352,9,338,12,327,16,317,22,307,32,296,46,200,184,272,272,289,292,303,305,316,314,331,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,263,301,260,296,257,290,251,282,243,272,188,202,166,234,151,255,139,272,131,286,126,297,124,306,125,312,128,316,133,319,139,320,147,321,161,321,161,331,11,331,11,321,29,319,44,312,59,299,78,276,103,242,156,164,78,66,58,42,43,26,31,17,19,12,5,9,5,0,121,0,121,9,106,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,100,57,109,70,169,145,217,74,226,60,233,48,238,38,241,31,242,25,241,20,238,16,233,14,226,12,217,11,204,9,204,0,352,331,243,331,243,321,256,321,266,319,272,316,275,312,276,306,276,302,274,294,272,290,270,285,197,174,124,285,121,289,118,294,116,299,115,304,115,308,116,312,119,316,123,318,130,320,138,321,151,321,151,331,11,331,11,321,24,319,37,313,50,299,68,277,92,243,157,147,157,61,156,39,152,25,144,16,129,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,151,282,266,297,288,310,303,322,313,336,319,352,321,299,88,287,88,282,72,278,59,273,49,266,40,257,33,249,28,240,24,228,21,215,20,199,19,73,19,289,324,289,331,26,331,16,246,29,246,32,260,35,271,38,279,43,287,50,295,58,301,68,306,81,309,97,311,
-31,17,121,0,43,26,43,26,121,0,88,17,43,26,88,17,58,42,58,42,88,17,84,21,58,42,84,21,83,26,83,26,84,31,78,66,78,66,84,31,87,38,78,66,87,38,156,164,156,164,87,38,92,46,156,164,92,46,100,57,103,242,156,164,126,297,103,242,126,297,124,306,124,306,125,312,103,242,156,164,100,57,109,70,109,70,169,145,156,164,156,164,169,145,166,234,156,164,166,234,151,255,78,66,58,42,83,26,103,242,125,312,78,276,78,276,125,312,128,316,78,276,128,316,59,299,59,299,128,316,133,319,59,299,133,319,161,331,161,331,133,319,139,320,161,331,139,320,147,321,147,321,161,321,161,331,161,331,11,331,29,319,161,331,29,319,44,312,161,331,44,312,59,299,260,296,257,290,272,272,272,272,257,290,251,282,272,272,251,282,243,272,243,272,188,202,200,184,200,184,188,202,217,74,200,184,217,74,296,46,296,46,217,74,226,60,296,46,226,60,233,48,348,331,229,331,243,320,348,331,243,320,253,319,348,331,253,319,259,316,348,331,259,316,262,311,348,331,262,311,263,305,348,331,263,305,316,314,348,331,316,314,331,319,348,331,331,319,348,321,263,305,272,272,289,292,263,305,289,292,303,305,263,305,303,305,316,314,263,301,260,296,272,272,263,301,272,272,263,305,243,272,200,184,272,272,238,16,233,14,352,0,352,0,233,14,226,12,352,0,226,12,217,11,242,25,352,0,327,16,242,25,327,16,317,22,242,25,317,22,307,32,242,25,307,32,296,46,242,25,296,46,241,31,296,46,233,48,238,38,296,46,238,38,241,31,188,202,166,234,169,145,188,202,169,145,217,74,338,12,327,16,352,0,338,12,352,0,352,9,241,20,238,16,352,0,241,20,352,0,242,25,204,9,204,0,352,0,204,9,352,0,217,11,156,164,151,255,139,272,156,164,139,272,131,286,156,164,131,286,126,297,121,0,121,9,106,11,121,0,106,11,95,13,121,0,95,13,88,17,19,12,5,9,121,0,19,12,121,0,31,17,121,0,5,9,5,0,243,320,229,331,229,321,29,319,11,331,11,321,
-352,331,243,331,243,321,256,321,266,319,272,316,275,312,276,306,276,302,274,294,272,290,270,285,197,174,124,285,121,289,118,294,116,299,115,304,115,308,116,312,119,316,123,318,130,320,138,321,151,321,151,331,11,331,11,321,24,319,37,313,50,299,68,277,92,243,157,147,157,61,156,39,152,25,144,16,129,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,151,282,266,297,288,310,303,322,313,336,319,352,321,299,88,287,88,282,72,278,59,273,49,266,40,257,33,249,28,240,24,228,21,215,20,199,19,73,19,289,324,289,331,26,331,16,246,29,246,32,260,35,271,38,279,43,287,50,295,58,301,68,306,81,309,97,311,117,312,224,312,5,7,5,0,286,0,150,-77,150,-64,108,-64,99,-63,92,-61,86,-56,83,-48,82,-38,82,295,83,304,86,311,92,315,99,318,108,319,150,319,150,331,44,331,44,-77,143,-6,29,338,-3,338,109,-6,123,-77,
-121,289,118,294,157,147,157,147,118,294,116,299,157,147,116,299,92,243,92,243,116,299,115,304,92,243,115,304,115,308,115,308,116,312,92,243,151,331,11,331,24,319,151,331,24,319,37,313,151,331,37,313,50,299,151,331,50,299,123,318,151,331,123,318,130,320,151,331,130,320,138,321,151,331,138,321,151,321,123,318,50,299,119,316,119,316,50,299,68,277,119,316,68,277,116,312,116,312,68,277,92,243,209,55,209,151,197,174,209,55,197,174,210,36,210,36,197,174,157,147,210,36,157,147,215,23,215,23,157,147,157,61,215,23,157,61,224,15,224,15,157,61,156,39,224,15,156,39,260,0,260,0,156,39,152,25,260,0,152,25,144,16,275,298,274,294,282,266,282,266,274,294,272,290,282,266,272,290,270,285,270,285,197,174,209,151,352,331,243,331,256,321,352,331,256,321,266,319,352,331,266,319,272,316,352,331,272,316,275,312,352,331,275,312,276,306,352,331,276,306,322,313,352,331,322,313,336,319,352,331,336,319,352,321,276,306,282,266,297,288,276,306,297,288,310,303,276,306,310,303,322,313,282,266,276,306,276,302,282,266,276,302,275,298,270,285,209,151,282,266,239,11,224,15,260,0,239,11,260,0,260,9,129,12,107,9,260,0,129,12,260,0,144,16,124,285,121,289,157,147,124,285,157,147,197,174,260,0,107,9,107,0,256,321,243,331,243,321,24,319,11,331,11,321,
-299,88,287,88,282,72,278,59,273,49,266,40,257,33,249,28,240,24,228,21,215,20,199,19,73,19,289,324,289,331,26,331,16,246,29,246,32,260,35,271,38,279,43,287,50,295,58,301,68,306,81,309,97,311,117,312,224,312,5,7,5,0,286,0,150,-77,150,-64,108,-64,99,-63,92,-61,86,-56,83,-48,82,-38,82,295,83,304,86,311,92,315,99,318,108,319,150,319,150,331,44,331,44,-77,143,-6,29,338,-3,338,109,-6,123,-77,123,331,17,331,17,319,59,319,69,318,76,314,81,309,83,301,84,291,
-35,271,38,279,26,331,26,331,38,279,43,287,26,331,43,287,50,295,50,295,58,301,26,331,26,331,58,301,68,306,26,331,68,306,81,309,73,19,289,324,224,312,224,312,289,324,289,331,224,312,289,331,117,312,97,311,117,312,289,331,97,311,289,331,26,331,26,331,16,246,29,246,26,331,29,246,32,260,26,331,32,260,35,271,224,312,5,7,73,19,73,19,5,7,286,0,73,19,286,0,199,19,199,19,286,0,215,20,278,59,273,49,286,0,286,0,273,49,266,40,286,0,266,40,257,33,257,33,249,28,286,0,286,0,249,28,240,24,286,0,240,24,228,21,286,0,299,88,287,88,286,0,287,88,282,72,286,0,282,72,278,59,286,0,5,7,5,0,215,20,286,0,228,21,26,331,81,309,97,311,
-150,-77,150,-64,108,-64,99,-63,92,-61,86,-56,83,-48,82,-38,82,295,83,304,86,311,92,315,99,318,108,319,150,319,150,331,44,331,44,-77,143,-6,29,338,-3,338,109,-6,123,-77,123,331,17,331,17,319,59,319,69,318,76,314,81,309,83,301,84,291,84,-50,81,-56,77,-61,70,-63,
-86,311,92,315,44,331,44,331,92,315,99,318,44,331,99,318,150,331,150,331,99,318,108,319,82,-38,82,295,44,331,82,-38,44,331,44,-77,82,-38,44,-77,83,-48,83,304,86,311,44,331,83,304,44,331,82,295,150,-64,108,-64,150,-77,150,-77,108,-64,99,-63,150,-77,99,-63,44,-77,44,-77,99,-63,92,-61,44,-77,92,-61,86,-56,83,-48,44,-77,86,-56,150,331,108,319,150,319,
-143,-6,29,338,-3,338,109,-6,123,-77,123,331,17,331,17,319,
-143,-6,29,338,-3,338,143,-6,-3,338,109,-6,
-123,-77,123,331,17,331,17,319,59,319,69,318,76,314,81,309,83,301,84,291,84,-50,81,-56,77,-61,70,-63,61,-64,17,-64,17,-77,223,148,132,331,103,331,12,148,46,148,118,293,189,148,250,-62,250,-36,0,-36,0,-62,121,253,49,328,44,332,40,335,35,337,27,339,
-123,-77,123,331,84,291,123,-77,84,291,84,-41,123,-77,84,-41,84,-50,123,-77,84,-50,81,-56,123,-77,81,-56,77,-61,123,-77,77,-61,70,-63,123,-77,70,-63,61,-64,123,-77,61,-64,17,-64,123,-77,17,-64,17,-77,76,314,81,309,123,331,123,331,81,309,83,301,123,331,83,301,84,291,123,331,17,331,59,319,123,331,59,319,69,318,123,331,69,318,76,314,59,319,17,331,17,319,
-223,148,132,331,103,331,12,148,46,148,118,293,189,148,250,-62,250,-36,0,-36,0,-62,121,253,49,328,44,332,
-12,148,46,148,103,331,103,331,46,148,118,293,103,331,118,293,132,331,132,331,118,293,189,148,132,331,189,148,223,148,
-250,-62,250,-36,0,-36,0,-62,121,253,49,328,44,332,40,335,
-250,-62,250,-36,0,-36,250,-62,0,-36,0,-62,
-121,253,49,328,44,332,40,335,35,337,27,339,21,338,16,336,12,333,10,329,9,323,10,318,12,314,15,309,19,305,24,301,101,253,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,
-101,253,121,253,49,328,101,253,49,328,44,332,101,253,44,332,40,335,101,253,40,335,35,337,101,253,35,337,31,338,101,253,31,338,27,339,101,253,27,339,24,301,9,323,10,318,10,329,10,329,10,318,12,314,10,329,12,314,12,333,12,333,12,314,15,309,12,333,15,309,16,336,16,336,15,309,19,305,16,336,19,305,21,338,21,338,19,305,24,301,21,338,24,301,27,339,
-221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,76,340,74,342,62,338,51,334,41,331,29,328,17,324,2,320,2,311,5,311,6,312,10,312,21,311,28,309,32,304,34,296,35,283,35,28,39,18,52,9,71,2,93,-2,117,-4,155,1,187,18,212,44,228,78,234,120,230,155,218,185,199,209,174,224,144,230,126,228,110,223,96,214,85,202,76,188,16383,16383,76,159,79,171,86,182,97,191,111,197,126,199,137,198,146,195,155,190,164,183,171,175,177,163,183,149,186,133,189,116,190,99,189,82,187,67,183,54,178,42,171,32,164,25,156,19,147,15,136,12,125,11,110,12,97,16,86,21,79,28,76,37,199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,195,166,198,172,199,179,195,195,184,209,167,220,146,227,122,230,108,229,94,226,80,221,67,213,55,204,
-37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,184,56,186,-3,185,44,29,167,29,183,28,175,
-76,340,74,342,62,338,51,334,41,331,29,328,17,324,2,320,2,311,5,311,6,312,10,312,21,311,28,309,32,304,34,296,35,283,35,28,39,18,52,9,71,2,93,-2,117,-4,155,1,187,18,212,44,228,78,234,120,230,155,218,185,199,209,174,224,144,230,126,228,110,223,96,214,85,202,76,188,16383,16383,76,159,79,171,86,182,97,191,111,197,126,199,137,198,146,195,155,190,164,183,171,175,177,163,183,149,186,133,189,116,190,99,189,82,187,67,183,54,178,42,171,32,164,25,156,19,147,15,136,12,125,11,110,12,97,16,86,21,79,28,76,37,199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,195,166,198,172,199,179,195,195,184,209,167,220,146,227,122,230,108,229,94,226,80,221,67,213,55,204,40,189,28,172,19,152,14,130,12,106,17,70,30,39,50,15,76,0,108,-4,120,-3,132,-1,144,3,155,9,165,16,174,24,181,32,189,43,197,57,206,74,246,21,246,29,239,29,237,28,234,28,225,29,218,32,215,37,
-5,311,6,312,17,324,17,324,6,312,8,312,17,324,8,312,10,312,10,312,21,311,17,324,17,324,21,311,29,328,97,16,86,21,93,-2,93,-2,86,21,79,28,93,-2,79,28,71,2,71,2,79,28,76,37,71,2,76,37,74,342,74,342,76,37,76,188,74,342,76,188,76,340,62,338,51,334,52,9,52,9,51,334,41,331,52,9,41,331,39,18,39,18,41,331,35,283,39,18,35,283,35,28,3,311,5,311,17,324,3,311,17,324,2,320,3,311,2,320,2,311,156,19,147,15,155,1,155,1,147,15,136,12,155,1,136,12,125,11,125,11,110,12,117,-4,117,-4,110,12,97,16,117,-4,97,16,93,-2,62,338,52,9,71,2,62,338,71,2,74,342,21,311,28,309,29,328,29,328,28,309,32,304,29,328,32,304,41,331,41,331,32,304,34,296,41,331,34,296,35,283,126,228,126,199,137,198,126,228,137,198,144,230,144,230,137,198,146,195,144,230,146,195,174,224,174,224,146,195,155,190,174,224,155,190,164,183,76,159,79,171,85,202,85,202,79,171,86,182,85,202,86,182,96,214,96,214,86,182,97,191,96,214,97,191,110,223,110,223,97,191,111,197,110,223,111,197,126,228,126,228,111,197,126,199,76,159,85,202,76,188,76,159,76,188,76,37,174,224,171,175,177,163,174,224,177,163,199,209,199,209,177,163,183,149,199,209,183,149,186,133,187,67,183,54,187,18,187,18,183,54,178,42,187,18,178,42,171,32,171,32,164,25,187,18,187,18,164,25,156,19,187,18,156,19,155,1,234,120,230,155,228,78,228,78,230,155,218,185,228,78,218,185,212,44,212,44,218,185,199,209,212,44,199,209,190,99,190,99,199,209,189,116,187,67,187,18,189,82,189,82,187,18,212,44,189,82,212,44,190,99,125,11,117,-4,155,1,199,209,186,133,189,116,174,224,164,183,171,175,
-199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,195,166,198,172,199,179,195,195,184,209,167,220,146,227,122,230,108,229,94,226,80,221,67,213,55,204,40,189,28,172,19,152,14,130,12,106,17,70,30,39,50,15,76,0,108,-4,120,-3,132,-1,144,3,155,9,165,16,174,24,181,32,189,43,197,57,206,74,246,21,246,29,239,29,237,28,234,28,225,29,218,32,215,37,213,45,212,57,212,340,209,342,195,337,169,329,154,324,136,320,136,311,138,312,147,312,156,311,163,309,167,304,170,297,170,209,159,217,149,223,139,227,129,229,118,230,85,223,56,206,34,178,19,143,13,103,18,67,30,37,49,14,75,0,106,-4,122,-3,136,0,148,7,160,16,170,28,170,-2,172,-4,16383,16383,170,51,170,49,169,46,165,40,162,37,157,31,150,27,143,24,135,22,126,21,102,26,83,39,69,60,60,88,56,123,
-81,49,65,69,76,0,76,0,65,69,54,96,76,0,54,96,50,15,50,15,54,96,51,128,55,204,51,128,54,157,55,204,54,157,63,181,128,31,108,-4,120,-3,128,31,120,-3,132,-1,128,31,103,36,108,-4,81,49,76,0,108,-4,81,49,108,-4,103,36,136,212,141,208,146,227,146,227,141,208,145,201,146,227,145,201,148,191,148,191,151,180,167,220,167,220,151,180,154,172,167,220,154,172,159,166,122,230,119,215,128,215,122,230,128,215,146,227,146,227,128,215,136,212,195,195,184,209,189,161,195,195,189,161,195,166,195,195,195,166,198,172,195,195,198,172,199,179,184,209,167,220,169,158,184,209,169,158,175,157,184,209,175,157,183,158,184,209,183,158,189,161,167,220,159,166,163,161,167,220,163,161,169,158,167,220,146,227,148,191,174,24,181,32,185,60,185,60,181,32,189,43,185,60,189,43,199,78,199,78,189,43,197,57,199,78,197,57,206,74,132,-1,144,3,144,33,144,33,144,3,155,9,144,33,155,9,159,38,159,38,155,9,165,16,159,38,165,16,172,46,172,46,165,16,174,24,172,46,174,24,185,60,144,33,128,31,132,-1,96,211,119,215,108,229,96,211,108,229,94,226,96,211,94,226,80,221,96,211,80,221,78,200,67,213,55,204,63,181,67,213,63,181,78,200,67,213,78,200,80,221,40,189,28,172,30,39,40,189,30,39,50,15,40,189,50,15,51,128,40,189,51,128,55,204,19,152,14,130,17,70,19,152,17,70,30,39,19,152,30,39,28,172,119,215,122,230,108,229,17,70,14,130,12,106,
-246,21,246,29,239,29,237,28,234,28,225,29,218,32,215,37,213,45,212,57,212,340,209,342,195,337,169,329,154,324,136,320,136,311,138,312,147,312,156,311,163,309,167,304,170,297,170,209,159,217,149,223,139,227,129,229,118,230,85,223,56,206,34,178,19,143,13,103,18,67,30,37,49,14,75,0,106,-4,122,-3,136,0,148,7,160,16,170,28,170,-2,172,-4,16383,16383,170,51,170,49,169,46,165,40,162,37,157,31,150,27,143,24,135,22,126,21,102,26,83,39,69,60,60,88,56,123,59,154,67,180,80,199,98,212,119,216,135,213,149,206,160,195,167,181,170,166,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,11,225,11,209,51,209,51,52,50,34,47,21,40,13,28,9,10,7,10,0,140,0,140,7,119,9,106,13,98,21,95,33,94,52,94,209,155,209,
-170,209,159,217,160,195,160,195,159,217,149,223,160,195,149,223,149,206,149,206,149,223,139,227,149,206,139,227,135,213,135,213,139,227,129,229,135,213,129,229,119,216,67,180,80,199,85,223,85,223,80,199,98,212,85,223,98,212,118,230,118,230,98,212,119,216,118,230,119,216,129,229,13,103,18,67,19,143,19,143,18,67,30,37,19,143,30,37,34,178,34,178,30,37,49,14,34,178,49,14,56,206,56,206,49,14,56,123,56,206,56,123,59,154,56,206,59,154,67,180,56,206,67,180,85,223,126,21,106,-4,122,-3,126,21,122,-3,136,0,126,21,102,26,106,-4,83,39,69,60,75,0,83,39,75,0,106,-4,83,39,106,-4,102,26,60,88,56,123,49,14,60,88,49,14,75,0,60,88,75,0,69,60,169,46,167,43,170,28,170,28,167,43,165,40,170,28,165,40,162,37,162,37,157,31,160,16,160,16,157,31,150,27,160,16,150,27,148,7,148,7,150,27,143,24,148,7,143,24,136,0,136,0,143,24,135,22,136,0,135,22,126,21,140,312,142,312,154,324,154,324,142,312,145,312,154,324,145,312,147,312,147,312,156,311,154,324,154,324,156,311,169,329,154,324,136,320,138,312,154,324,138,312,140,312,170,209,170,166,170,28,170,209,170,28,170,286,170,297,170,286,182,333,170,297,182,333,169,329,170,209,160,195,167,181,170,209,167,181,170,166,172,-4,246,21,225,29,172,-4,225,29,218,32,172,-4,218,32,215,37,172,-4,215,37,213,45,172,-4,213,45,182,333,172,-4,182,333,170,28,172,-4,170,28,170,-2,170,28,170,166,170,51,170,28,170,51,170,49,170,28,170,49,169,46,162,37,160,16,170,28,212,57,212,340,209,342,212,57,209,342,195,337,212,57,195,337,213,45,239,29,237,28,246,21,246,21,237,28,235,28,246,21,235,28,234,28,234,28,225,29,246,21,241,29,239,29,246,21,241,29,246,21,246,29,169,329,156,311,163,309,169,329,163,309,167,304,169,329,167,304,170,297,138,312,136,320,136,311,182,333,170,286,170,28,182,333,213,45,195,337,
-204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,11,225,11,209,51,209,51,52,50,34,47,21,40,13,28,9,10,7,10,0,140,0,140,7,119,9,106,13,98,21,95,33,94,52,94,209,155,209,155,225,94,225,94,283,95,299,98,311,104,320,111,326,122,328,128,327,133,325,138,321,143,316,148,308,153,301,157,296,161,293,166,291,171,290,177,291,183,294,188,298,190,304,191,310,189,321,182,329,171,336,156,340,140,342,121,340,105,335,90,328,78,318,69,305,62,292,
-52,100,50,118,49,15,49,15,50,118,49,138,49,15,49,138,31,182,49,15,31,182,29,39,29,39,31,182,17,148,29,39,17,148,17,70,17,70,17,148,12,108,133,228,116,230,120,210,120,210,116,230,103,212,87,210,103,212,116,230,87,210,116,230,81,224,190,62,176,48,181,26,181,26,176,48,162,37,181,26,162,37,160,9,160,9,162,37,146,31,160,9,146,31,136,-1,136,-1,146,31,127,30,203,138,201,153,198,166,203,138,198,166,195,177,203,138,195,177,190,186,203,138,190,186,185,195,203,138,185,195,175,207,203,138,175,207,163,217,203,138,163,217,151,155,203,138,151,155,50,155,203,138,50,155,49,138,141,192,147,176,149,224,149,224,147,176,151,155,149,224,151,155,163,217,198,49,212,79,204,82,198,49,204,82,190,62,198,49,190,62,181,26,114,31,101,34,108,-4,114,31,108,-4,136,-1,114,31,136,-1,127,30,101,34,90,39,108,-4,108,-4,90,39,80,47,108,-4,80,47,75,0,75,0,80,47,71,57,133,228,120,210,133,203,133,228,133,203,141,192,133,228,141,192,149,224,50,155,55,175,52,207,52,207,55,175,63,191,52,207,63,191,81,224,81,224,63,191,74,203,81,224,74,203,87,210,52,207,31,182,49,138,52,207,49,138,50,155,75,0,71,57,62,71,75,0,62,71,56,85,75,0,56,85,52,100,75,0,52,100,49,15,
-11,225,11,209,51,209,51,52,50,34,47,21,40,13,28,9,10,7,10,0,140,0,140,7,119,9,106,13,98,21,95,33,94,52,94,209,155,209,155,225,94,225,94,283,95,299,98,311,104,320,111,326,122,328,128,327,133,325,138,321,143,316,148,308,153,301,157,296,161,293,166,291,171,290,177,291,183,294,188,298,190,304,191,310,189,321,182,329,171,336,156,340,140,342,121,340,105,335,90,328,78,318,69,305,62,292,57,279,54,264,52,247,51,225,235,194,235,214,185,214,180,215,175,217,169,219,158,223,134,229,126,230,118,230,91,226,68,214,51,197,39,174,35,148,36,131,41,116,50,103,63,92,81,81,77,77,72,73,60,61,51,53,44,46,40,39,37,33,36,27,37,21,40,16,44,11,52,6,63,1,44,-13,30,-26,21,-37,16,-48,14,-59,18,-75,31,-88,49,-98,73,-105,100,-108,122,-106,144,-102,165,-96,184,-87,200,-76,211,-66,220,-56,226,-46,229,-35,230,-24,228,-6,220,7,207,18,190,26,
-57,279,54,264,95,33,95,33,54,264,52,247,95,33,52,247,51,209,51,209,52,247,51,225,51,209,51,225,11,225,78,318,95,33,94,52,94,225,94,209,155,209,94,225,155,209,155,225,133,325,140,342,128,327,128,327,140,342,122,328,111,326,122,328,121,340,111,326,121,340,105,335,94,283,95,299,90,328,90,328,95,299,98,311,90,328,98,311,105,335,105,335,98,311,104,320,105,335,104,320,111,326,90,328,78,318,94,52,90,328,94,52,94,283,189,321,182,329,183,294,189,321,183,294,188,298,189,321,188,298,190,304,189,321,190,304,191,310,166,291,171,290,171,336,171,336,171,290,177,291,171,336,177,291,182,329,182,329,177,291,183,294,148,308,153,301,156,340,156,340,153,301,157,296,156,340,157,296,171,336,171,336,157,296,161,293,171,336,161,293,166,291,143,316,148,308,156,340,143,316,156,340,140,342,143,316,140,342,138,321,140,342,121,340,122,328,140,0,140,7,119,9,140,0,119,9,106,13,140,0,106,13,50,34,140,0,50,34,47,21,140,0,47,21,40,13,140,0,40,13,28,9,140,0,28,9,10,7,140,0,10,7,10,0,95,33,78,318,69,305,95,33,69,305,62,292,95,33,62,292,57,279,51,52,50,34,106,13,51,52,106,13,98,21,51,52,98,21,95,33,51,52,95,33,51,209,51,209,11,225,11,209,140,342,133,325,138,321,
-235,194,235,214,185,214,180,215,175,217,169,219,158,223,134,229,126,230,118,230,91,226,68,214,51,197,39,174,35,148,36,131,41,116,50,103,63,92,81,81,77,77,72,73,60,61,51,53,44,46,40,39,37,33,36,27,37,21,40,16,44,11,52,6,63,1,44,-13,30,-26,21,-37,16,-48,14,-59,18,-75,31,-88,49,-98,73,-105,100,-108,122,-106,144,-102,165,-96,184,-87,200,-76,211,-66,220,-56,226,-46,229,-35,230,-24,228,-6,220,7,207,18,190,26,170,29,105,32,91,33,80,35,72,38,68,41,66,46,68,52,73,60,80,67,88,73,97,77,106,76,111,75,125,75,136,76,146,78,157,82,167,87,177,94,186,103,194,113,199,124,202,137,203,152,203,160,202,168,200,176,194,194,16383,16383,76,169,78,185,82,198,90,208,100,214,113,216,122,215,130,212,137,207,144,201,150,193,155,181,159,169,162,157,164,145,165,132,163,117,158,104,150,95,140,89,127,87,110,91,96,102,85,118,78,141,76,167,16383,16383,217,-31,212,-47,200,-60,180,-71,153,-77,122,-79,97,-78,77,-73,62,-65,52,-55,49,-43,50,-36,52,-30,56,-22,63,-13,74,0,86,-2,102,-4,138,-6,155,-6,178,-7,196,-10,208,-14,214,-21,217,-31,243,0,243,7,230,10,221,15,216,22,214,34,214,151,211,179,204,201,191,217,174,227,152,230,135,228,120,224,106,216,92,204,79,188,79,340,76,342,66,338,46,332,34,328,18,324,5,320,5,311,6,312,11,312,22,311,29,309,34,305,36,297,36,33,33,22,28,15,19,10,4,7,4,0,113,0,113,7,98,10,88,14,82,22,79,34,79,171,90,184,101,193,112,199,123,202,134,203,148,201,158,195,165,184,170,169,171,150,171,34,168,22,162,14,152,10,137,7,137,0,90,316,89,324,85,331,80,337,73,340,65,342,56,340,49,336,44,331,40,324,39,316,40,308,44,301,49,295,56,292,64,291,73,292,80,295,85,301,89,308,90,316,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,88,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,8,0,97,316,96,324,92,331,86,337,79,340,71,342,63,340,56,336,51,331,47,324,46,316,47,308,51,301,56,295,63,292,71,291,79,292,87,295,92,301,96,308,97,316,16383,16383,97,228,94,230,77,224,62,218,48,213,33,208,16,203,16,195,18,195,23,196,27,197,39,197,
-85,118,81,81,88,73,88,73,81,81,80,67,80,67,81,81,77,77,80,67,77,77,73,60,73,60,77,77,72,73,73,60,72,73,68,52,68,52,72,73,68,69,68,52,68,69,66,46,66,46,64,65,63,-13,63,-13,64,65,63,1,116,75,127,87,111,75,111,75,127,87,110,91,111,75,110,91,106,76,106,76,110,91,97,77,88,73,97,77,96,102,88,73,96,102,85,118,118,230,113,216,122,215,118,230,122,215,126,230,126,230,122,215,130,212,126,230,130,212,134,229,134,229,130,212,137,207,134,229,137,207,142,227,142,227,137,207,144,201,142,227,144,201,150,225,150,225,144,201,150,193,127,87,116,75,120,75,127,87,120,75,123,75,127,87,123,75,125,75,127,87,125,75,136,76,110,91,96,102,97,77,169,219,158,223,159,169,169,219,159,169,162,157,169,219,162,157,164,145,169,219,164,145,165,132,169,219,165,132,167,87,169,219,167,87,177,94,169,219,177,94,175,217,167,87,165,132,163,117,167,87,163,117,158,104,167,87,158,104,157,82,127,87,136,76,140,89,140,89,136,76,146,78,140,89,146,78,150,95,150,95,146,78,157,82,150,95,157,82,158,104,82,198,90,208,91,226,91,226,90,208,100,214,91,226,100,214,118,230,118,230,100,214,113,216,76,167,76,169,68,214,68,214,76,169,78,185,68,214,78,185,91,226,91,226,78,185,82,198,81,81,85,118,78,141,81,81,78,141,76,167,81,81,76,167,68,214,81,81,68,214,63,92,51,197,39,174,41,116,51,197,41,116,50,103,51,197,50,103,63,92,51,197,63,92,68,214,39,174,35,148,36,131,39,174,36,131,41,116,51,53,44,46,44,11,51,53,44,11,52,6,51,53,52,6,60,61,36,27,37,21,37,33,37,33,37,21,40,16,37,33,40,16,40,39,40,39,40,16,44,11,40,39,44,11,44,46,30,-26,31,-88,44,-13,44,-13,31,-88,49,-98,44,-13,49,-98,49,-43,49,-43,50,-36,44,-13,44,-13,50,-36,52,-30,44,-13,52,-30,63,1,63,1,52,-30,56,-22,63,1,56,-22,63,-13,74,0,72,38,68,41,74,0,68,41,66,46,74,0,66,46,63,-13,74,0,80,35,72,38,60,61,52,6,63,1,60,61,63,1,64,65,62,-65,73,-105,77,-73,77,-73,73,-105,100,-108,77,-73,100,-108,97,-78,97,-78,100,-108,122,-79,153,-77,122,-79,122,-106,153,-77,122,-106,144,-102,52,-55,49,-43,49,-98,52,-55,49,-98,73,-105,52,-55,73,-105,62,-65,21,-37,16,-48,18,-75,21,-37,18,-75,31,-88,21,-37,31,-88,30,-26,196,214,191,214,194,194,196,214,194,194,235,194,196,214,235,194,235,214,202,137,203,152,203,160,202,137,203,160,202,168,202,137,202,168,200,176,202,137,200,176,199,124,197,185,194,194,194,113,197,185,194,113,199,124,197,185,199,124,200,176,191,214,185,214,186,103,191,214,186,103,194,113,191,214,194,113,194,194,180,215,175,217,177,94,180,215,177,94,186,103,180,215,186,103,185,214,155,181,159,169,158,223,155,181,158,223,150,225,155,181,150,225,150,193,208,-14,214,-21,220,7,220,7,214,-21,217,-31,220,-56,217,-31,212,-47,138,-6,155,-6,170,29,170,29,155,-6,178,-7,170,29,178,-7,190,26,190,26,178,-7,196,-10,190,26,196,-10,207,18,207,18,196,-10,208,-14,207,18,208,-14,220,7,228,-6,220,7,220,-56,228,-6,220,-56,226,-46,228,-6,226,-46,229,-35,228,-6,229,-35,230,-24,153,-77,165,-96,180,-71,180,-71,165,-96,184,-87,180,-71,184,-87,200,-60,200,-60,184,-87,200,-76,200,-60,200,-76,212,-47,212,-47,200,-76,211,-66,212,-47,211,-66,220,-56,138,-6,170,29,120,-5,120,-5,170,29,105,32,120,-5,105,32,102,-4,102,-4,105,32,91,33,102,-4,91,33,86,-2,86,-2,91,33,80,35,86,-2,80,35,74,0,122,-79,100,-108,122,-106,153,-77,144,-102,165,-96,217,-31,220,-56,220,7,18,-75,16,-48,14,-59,64,65,66,46,68,69,
-243,0,243,7,230,10,221,15,216,22,214,34,214,151,211,179,204,201,191,217,174,227,152,230,135,228,120,224,106,216,92,204,79,188,79,340,76,342,66,338,46,332,34,328,18,324,5,320,5,311,6,312,11,312,22,311,29,309,34,305,36,297,36,33,33,22,28,15,19,10,4,7,4,0,113,0,113,7,98,10,88,14,82,22,79,34,79,171,90,184,101,193,112,199,123,202,134,203,148,201,158,195,165,184,170,169,171,150,171,34,168,22,162,14,152,10,137,7,137,0,90,316,89,324,85,331,80,337,73,340,65,342,56,340,49,336,44,331,40,324,39,316,40,308,44,301,49,295,56,292,64,291,73,292,80,295,85,301,89,308,90,316,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,88,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,8,0,97,316,96,324,92,331,86,337,79,340,71,342,63,340,56,336,51,331,47,324,46,316,47,308,51,301,56,295,63,292,
-33,22,28,15,113,0,113,0,28,15,19,10,113,0,19,10,4,7,7,312,9,312,18,324,18,324,9,312,10,312,18,324,10,312,11,312,11,312,22,311,18,324,18,324,22,311,34,328,18,324,5,320,6,312,18,324,6,312,7,312,88,14,82,22,36,51,36,51,82,22,79,34,36,51,79,34,36,286,36,297,36,286,46,332,36,297,46,332,34,328,34,328,22,311,29,309,34,328,29,309,34,305,34,328,34,305,36,297,79,188,79,340,76,342,79,188,76,342,79,51,79,51,76,342,66,338,79,51,66,338,79,34,79,34,66,338,56,335,79,34,56,335,46,332,135,228,134,203,148,201,135,228,148,201,152,230,152,230,148,201,158,195,152,230,158,195,174,227,174,227,158,195,165,184,174,227,165,184,170,169,79,171,90,184,92,204,92,204,90,184,101,193,92,204,101,193,106,216,106,216,101,193,112,199,106,216,112,199,120,224,120,224,112,199,123,202,120,224,123,202,135,228,135,228,123,202,134,203,79,51,79,171,79,188,79,188,79,171,92,204,168,22,162,14,243,0,243,0,162,14,152,10,243,0,152,10,137,7,174,227,170,169,171,150,216,22,171,150,171,51,216,22,171,51,221,15,221,15,171,51,171,34,221,15,171,34,243,0,243,0,171,34,168,22,214,51,214,151,211,179,214,51,211,179,204,201,214,51,204,201,214,34,230,10,221,15,243,0,230,10,243,0,243,7,171,150,216,22,174,227,174,227,216,22,214,34,174,227,214,34,191,217,191,217,214,34,204,201,113,0,113,7,98,10,113,0,98,10,88,14,113,0,88,14,36,33,113,0,36,33,33,22,113,0,4,7,4,0,36,33,88,14,36,51,36,286,79,34,46,332,243,0,137,7,137,0,6,312,5,320,5,311,
-90,316,89,324,85,331,80,337,73,340,65,342,56,340,49,336,44,331,40,324,39,316,40,308,44,301,49,295,56,292,64,291,73,292,80,295,85,301,89,308,90,316,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,88,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,8,0,97,316,96,324,92,331,86,337,79,340,71,342,63,340,56,336,51,331,47,324,46,316,47,308,51,301,56,295,63,292,71,291,79,292,87,295,92,301,96,308,97,316,16383,16383,97,228,94,230,77,224,62,218,48,213,33,208,16,203,16,195,18,195,23,196,27,197,39,197,45,196,49,193,52,187,54,178,55,167,55,-21,54,-41,54,-56,52,-67,50,-76,47,-82,
-39,316,40,308,40,324,40,324,40,308,44,301,40,324,44,301,44,331,44,331,44,301,49,295,44,331,49,295,49,336,49,336,49,295,56,292,49,336,56,292,56,340,56,340,56,292,64,291,56,340,64,291,65,342,65,342,64,291,73,292,65,342,73,292,73,340,73,340,73,292,80,295,73,340,80,295,80,337,80,337,80,295,85,301,80,337,85,301,85,331,85,331,85,301,89,308,85,331,89,308,89,324,89,324,89,308,90,316,43,20,37,13,127,0,127,0,37,13,25,9,127,0,25,9,8,7,20,197,24,197,88,230,88,230,24,197,28,197,88,230,28,197,31,197,31,197,38,196,88,230,88,230,38,196,42,193,88,230,42,193,45,187,43,20,127,0,47,33,47,33,127,0,99,14,47,33,99,14,47,52,47,52,99,14,93,21,47,52,93,21,47,166,47,178,47,166,88,230,47,178,88,230,45,187,15,196,20,197,88,230,15,196,88,230,10,203,15,196,10,203,10,195,89,52,89,228,88,230,89,52,88,230,47,166,89,52,47,166,90,34,110,9,99,14,127,0,110,9,127,0,127,7,127,0,8,7,8,0,47,166,93,21,90,34,
-97,316,96,324,92,331,86,337,79,340,71,342,63,340,56,336,51,331,47,324,46,316,47,308,51,301,56,295,63,292,71,291,79,292,87,295,92,301,96,308,97,316,16383,16383,97,228,94,230,77,224,62,218,48,213,33,208,16,203,16,195,18,195,23,196,27,197,39,197,45,196,49,193,52,187,54,178,55,167,55,-21,54,-41,54,-56,52,-67,50,-76,47,-82,45,-85,39,-89,35,-91,26,-91,18,-87,14,-83,4,-71,0,-66,-4,-63,-9,-61,-14,-61,-20,-62,-26,-65,-30,-69,-33,-74,-34,-80,-32,-90,-26,-97,-16,-103,-3,-107,12,-108,42,-103,65,-90,83,-68,93,-38,97,0,252,0,252,7,240,9,228,13,217,20,206,30,194,44,118,141,132,155,164,183,188,201,206,212,222,217,240,218,240,225,138,225,138,218,148,218,155,217,160,215,162,212,163,209,161,203,155,195,151,191,83,131,83,340,81,342,70,338,48,332,35,328,18,324,3,320,3,311,7,312,17,312,20,313,28,312,34,309,38,303,40,294,41,282,41,41,40,28,38,20,32,14,21,11,3,7,3,0,121,0,121,7,110,8,100,9,92,12,87,17,84,24,83,33,83,126,158,26,160,24,162,21,163,19,163,17,164,15,163,13,162,10,153,7,143,7,143,0,128,0,128,7,
-86,337,87,295,92,331,92,331,87,295,92,301,92,331,92,301,96,324,96,324,92,301,96,308,96,324,96,308,97,316,46,316,47,308,47,324,47,324,47,308,51,301,47,324,51,301,51,331,51,331,51,301,56,295,51,331,56,295,56,336,56,336,56,295,63,292,56,336,63,292,63,340,63,340,63,292,71,291,63,340,71,291,71,342,71,342,71,291,79,292,71,342,79,292,79,340,79,340,79,292,87,295,79,340,87,295,86,337,18,195,23,196,33,208,18,195,33,208,16,203,18,195,16,203,16,195,42,-87,39,-89,42,-103,42,-103,39,-89,35,-91,42,-103,35,-91,31,-91,31,-91,26,-91,42,-103,42,-103,26,-91,22,-89,42,-103,22,-89,18,-87,52,187,62,218,49,193,49,193,62,218,48,213,49,193,48,213,45,196,45,196,48,213,39,197,35,197,39,197,48,213,35,197,48,213,33,208,54,-56,52,-67,65,-90,65,-90,52,-67,50,-76,65,-90,50,-76,47,-82,47,-82,45,-85,65,-90,65,-90,45,-85,42,-87,65,-90,42,-87,42,-103,93,-38,94,230,83,-68,83,-68,94,230,77,224,83,-68,77,224,65,-90,65,-90,77,224,62,218,65,-90,62,218,55,167,55,167,62,218,54,178,33,208,23,196,27,197,33,208,27,197,32,197,33,208,32,197,35,197,97,0,97,228,94,230,97,0,94,230,93,-38,65,-90,55,167,55,-21,65,-90,55,-21,54,-41,65,-90,54,-41,54,-56,12,-108,42,-103,18,-87,12,-108,18,-87,14,-83,12,-108,14,-83,9,-77,12,-108,9,-77,4,-71,12,-108,4,-71,0,-66,12,-108,0,-66,-3,-107,-3,-107,0,-66,-4,-63,-3,-107,-4,-63,-9,-61,-3,-107,-9,-61,-14,-61,-3,-107,-14,-61,-16,-103,-20,-62,-26,-65,-26,-97,-20,-62,-26,-97,-16,-103,-20,-62,-16,-103,-14,-61,-30,-69,-33,-74,-32,-90,-30,-69,-32,-90,-26,-97,-30,-69,-26,-97,-26,-65,-32,-90,-33,-74,-34,-80,62,218,52,187,54,178,
-252,0,252,7,240,9,228,13,217,20,206,30,194,44,118,141,132,155,164,183,188,201,206,212,222,217,240,218,240,225,138,225,138,218,148,218,155,217,160,215,162,212,163,209,161,203,155,195,151,191,83,131,83,340,81,342,70,338,48,332,35,328,18,324,3,320,3,311,7,312,17,312,20,313,28,312,34,309,38,303,40,294,41,282,41,41,40,28,38,20,32,14,21,11,3,7,3,0,121,0,121,7,110,8,100,9,92,12,87,17,84,24,83,33,83,126,158,26,160,24,162,21,163,19,163,17,164,15,163,13,162,10,153,7,143,7,143,0,128,0,128,7,112,9,101,13,95,20,92,29,91,44,91,339,89,342,74,337,59,333,45,329,28,324,9,320,9,311,14,312,25,312,28,313,36,311,42,308,46,302,48,293,49,281,49,46,48,32,45,21,38,14,27,10,11,7,11,0,387,0,387,7,374,8,366,10,360,13,356,19,354,27,353,39,353,140,351,172,344,197,333,215,317,226,295,230,278,228,262,224,246,215,230,204,214,188,207,203,199,215,188,223,176,228,161,230,147,229,133,226,119,220,103,208,84,191,83,191,83,228,79,230,51,220,25,212,9,208,9,199,13,200,16,200,19,201,
-38,20,32,14,121,0,121,0,32,14,21,11,121,0,21,11,3,7,10,312,14,312,18,324,18,324,14,312,17,312,18,324,17,312,20,313,20,313,28,312,35,328,35,328,28,312,34,309,35,328,34,309,38,303,7,312,10,312,18,324,7,312,18,324,3,320,7,312,3,320,3,311,194,44,118,141,158,26,158,26,118,141,83,131,158,26,83,131,83,126,84,24,83,33,48,332,84,24,48,332,41,282,41,282,48,332,40,294,48,332,35,328,38,303,48,332,38,303,40,294,35,328,18,324,20,313,83,33,83,340,81,342,83,33,81,342,70,338,83,33,70,338,59,335,83,33,59,335,48,332,151,191,118,141,132,155,151,191,132,155,164,183,151,191,83,131,118,141,161,203,158,199,164,183,164,183,158,199,155,195,164,183,155,195,151,191,240,225,138,225,148,218,240,225,148,218,155,217,240,225,155,217,160,215,240,225,160,215,162,212,240,225,162,212,163,209,240,225,163,209,206,212,240,225,206,212,222,217,240,225,222,217,240,218,163,209,164,183,188,201,163,209,188,201,206,212,164,183,163,209,162,206,164,183,162,206,161,203,162,10,159,9,252,0,252,0,159,9,156,8,252,0,156,8,153,7,164,15,252,0,228,13,164,15,228,13,217,20,164,15,217,20,206,30,164,15,206,30,194,44,164,15,194,44,163,17,194,44,158,26,160,24,194,44,160,24,162,21,194,44,162,21,163,19,194,44,163,19,163,17,240,9,228,13,252,0,240,9,252,0,252,7,163,13,162,10,252,0,163,13,252,0,164,15,143,7,143,0,252,0,143,7,252,0,153,7,121,0,121,7,110,8,121,0,110,8,100,9,121,0,100,9,92,12,121,0,92,12,40,28,121,0,40,28,38,20,92,12,87,17,41,41,41,41,87,17,84,24,41,41,84,24,41,282,121,0,3,7,3,0,40,28,92,12,41,41,148,218,138,225,138,218,
-128,0,128,7,112,9,101,13,95,20,92,29,91,44,91,339,89,342,74,337,59,333,45,329,28,324,9,320,9,311,14,312,25,312,28,313,36,311,42,308,46,302,48,293,49,281,49,46,48,32,45,21,38,14,27,10,11,7,11,0,387,0,387,7,374,8,366,10,360,13,356,19,354,27,353,39,353,140,351,172,344,197,333,215,317,226,295,230,278,228,262,224,246,215,230,204,214,188,207,203,199,215,188,223,176,228,161,230,147,229,133,226,119,220,103,208,84,191,83,191,
-45,21,38,14,128,0,128,0,38,14,27,10,128,0,27,10,11,7,18,312,22,312,28,324,28,324,22,312,25,312,28,324,25,312,28,313,28,313,36,311,28,324,28,324,36,311,45,329,28,324,9,320,14,312,28,324,14,312,18,312,36,311,42,308,45,329,45,329,42,308,46,302,45,329,46,302,59,333,59,333,46,302,48,293,59,333,48,293,49,281,92,29,49,281,49,46,92,29,49,46,95,20,95,20,49,46,101,13,91,44,91,339,89,342,91,44,89,342,74,337,91,44,74,337,59,333,91,44,59,333,92,29,128,0,128,7,112,9,128,0,112,9,101,13,128,0,101,13,48,32,128,0,48,32,45,21,14,312,9,320,9,311,128,0,11,7,11,0,48,32,101,13,49,46,49,281,92,29,59,333,
-387,0,387,7,374,8,366,10,360,13,356,19,354,27,353,39,353,140,351,172,344,197,333,215,317,226,295,230,278,228,262,224,246,215,230,204,214,188,207,203,199,215,188,223,176,228,161,230,147,229,133,226,119,220,103,208,84,191,83,191,83,228,79,230,51,220,25,212,9,208,9,199,13,200,16,200,19,201,26,201,32,200,37,196,41,190,42,181,43,168,43,44,42,29,39,19,32,12,22,9,8,7,8,0,119,0,119,7,105,8,96,11,89,16,86,24,85,35,85,175,99,189,109,195,121,200,133,203,145,204,156,202,165,195,172,183,176,168,177,148,177,43,176,28,173,18,167,12,157,9,143,7,143,0,255,0,255,7,240,9,230,12,223,19,220,31,219,47,219,174,228,185,237,194,248,200,259,203,272,204,287,202,298,196,305,185,310,169,311,148,311,45,310,30,307,20,302,14,293,10,278,7,278,0,243,0,243,7,230,9,221,13,216,19,213,29,212,42,212,153,210,180,202,201,190,217,174,227,153,230,139,229,125,224,111,216,96,205,81,190,80,190,80,228,76,230,50,220,37,216,23,212,8,208,8,199,10,200,13,200,16,201,22,201,30,200,35,197,38,191,40,181,40,47,39,32,37,21,31,14,22,9,9,7,9,0,114,0,114,7,101,9,92,13,86,18,83,26,82,36,82,174,95,186,105,194,115,199,124,202,133,203,147,201,157,195,164,185,169,171,170,152,170,52,169,35,166,23,161,15,152,10,139,7,138,0,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,
-16,200,19,201,25,212,25,212,19,201,22,201,25,212,22,201,26,201,26,201,32,200,38,216,38,216,32,200,37,196,38,216,37,196,41,190,25,212,9,208,13,200,25,212,13,200,16,200,38,216,41,190,51,220,51,220,41,190,42,181,51,220,42,181,43,168,86,24,43,168,43,44,86,24,43,44,89,16,89,16,43,44,96,11,38,216,25,212,26,201,83,228,79,230,83,191,83,191,79,230,85,35,83,191,85,35,84,191,84,191,85,35,85,174,84,191,85,174,85,175,173,18,167,12,255,0,255,0,167,12,157,9,255,0,157,9,143,7,161,230,147,229,156,202,156,202,147,229,145,204,133,203,145,204,133,226,133,203,133,226,121,200,121,200,133,226,119,220,121,200,119,220,109,195,109,195,119,220,103,208,109,195,103,208,99,189,99,189,103,208,92,182,103,208,84,191,85,175,103,208,85,175,86,176,103,208,86,176,88,178,103,208,88,178,90,180,103,208,90,180,92,182,85,35,79,230,65,225,85,35,65,225,86,24,147,229,133,226,145,204,173,18,255,0,176,28,176,28,255,0,230,12,176,28,230,12,177,43,177,43,230,12,223,19,177,43,223,19,177,148,176,228,177,148,188,223,176,228,161,230,165,195,176,228,165,195,172,183,176,228,172,183,176,168,176,228,176,168,177,148,207,203,199,215,220,31,207,203,220,31,219,47,207,203,219,47,214,188,219,174,228,185,230,204,230,204,228,185,237,194,230,204,237,194,246,215,246,215,237,194,248,200,246,215,248,200,262,224,262,224,248,200,259,203,262,224,259,203,272,204,272,204,287,202,278,228,278,228,287,202,295,230,219,47,219,174,214,188,214,188,219,174,230,204,278,228,262,224,272,204,307,20,302,14,387,0,387,0,302,14,293,10,387,0,293,10,278,7,298,196,305,185,317,226,317,226,305,185,310,169,317,226,310,169,311,148,356,19,311,148,311,45,356,19,311,45,360,13,360,13,311,45,310,30,360,13,310,30,366,10,366,10,310,30,387,0,366,10,387,0,374,8,374,8,387,0,387,7,295,230,287,202,298,196,295,230,298,196,317,226,353,39,353,140,351,172,353,39,351,172,344,197,353,39,344,197,333,215,353,39,333,215,354,27,354,27,333,215,317,226,354,27,317,226,311,148,354,27,311,148,356,19,240,9,230,12,255,0,240,9,255,0,255,7,220,31,199,215,188,223,220,31,188,223,177,148,220,31,177,148,223,19,119,0,119,7,105,8,119,0,105,8,96,11,119,0,96,11,42,29,119,0,42,29,39,19,119,0,39,19,32,12,119,0,32,12,22,9,119,0,22,9,8,7,119,0,8,7,8,0,51,220,43,168,86,24,51,220,86,24,65,225,13,200,9,208,9,199,42,29,96,11,43,44,255,0,143,7,143,0,387,0,278,7,278,0,307,20,387,0,310,30,161,230,156,202,165,195,
-243,0,243,7,230,9,221,13,216,19,213,29,212,42,212,153,210,180,202,201,190,217,174,227,153,230,139,229,125,224,111,216,96,205,81,190,80,190,80,228,76,230,50,220,37,216,23,212,8,208,8,199,10,200,13,200,16,201,22,201,30,200,35,197,38,191,40,181,40,47,39,32,37,21,31,14,22,9,9,7,9,0,114,0,114,7,101,9,92,13,86,18,83,26,82,36,82,174,95,186,105,194,115,199,124,202,133,203,147,201,157,195,164,185,169,171,170,152,170,52,169,35,166,23,161,15,152,10,139,7,138,0,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,79,229,76,230,62,224,20,209,4,204,4,196,7,197,17,197,26,196,31,194,35,189,37,180,37,-78,
-37,21,31,14,114,0,114,0,31,14,22,9,114,0,22,9,9,7,13,200,16,201,23,212,23,212,16,201,19,201,23,212,19,201,22,201,22,201,30,200,23,212,23,212,30,200,37,216,23,212,8,208,10,200,23,212,10,200,13,200,30,200,35,197,37,216,37,216,35,197,38,191,37,216,38,191,50,220,50,220,38,191,40,181,50,220,40,181,40,169,83,26,40,169,40,47,83,26,40,47,86,18,86,18,40,47,92,13,80,228,76,230,80,190,80,190,76,230,82,36,80,190,82,36,81,190,81,190,82,36,82,174,81,190,82,174,96,205,96,205,82,174,95,186,96,205,95,186,105,194,96,205,105,194,111,216,111,216,105,194,115,199,111,216,115,199,125,224,125,224,115,199,124,202,125,224,124,202,133,203,133,203,147,201,139,229,139,229,147,201,153,230,82,36,76,230,63,225,82,36,63,225,83,26,139,229,125,224,133,203,166,23,161,15,243,0,243,0,161,15,152,10,243,0,152,10,139,7,157,195,164,185,174,227,174,227,164,185,169,171,174,227,169,171,170,152,216,19,170,152,170,52,216,19,170,52,221,13,221,13,170,52,169,35,221,13,169,35,243,0,243,0,169,35,166,23,153,230,147,201,157,195,153,230,157,195,174,227,212,42,212,153,210,180,212,42,210,180,202,201,212,42,202,201,213,29,230,9,221,13,243,0,230,9,243,0,243,7,213,29,202,201,190,217,213,29,190,217,174,227,213,29,174,227,170,152,213,29,170,152,216,19,114,0,114,7,101,9,114,0,101,9,92,13,114,0,92,13,39,32,114,0,39,32,37,21,50,220,40,169,83,26,50,220,83,26,63,225,10,200,8,208,8,199,114,0,9,7,9,0,39,32,92,13,40,47,243,0,139,7,138,0,
-235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,79,229,76,230,62,224,20,209,4,204,4,196,7,197,17,197,26,196,31,194,35,189,37,180,37,-78,34,-87,27,-93,17,-97,2,-99,2,-107,123,-107,123,-98,104,-97,92,-94,84,-88,80,-77,79,-61,79,17,90,8,99,2,108,-1,118,-3,130,-4,164,1,193,19,215,47,230,82,235,123,231,158,219,188,202,210,179,225,151,230,135,228,120,224,106,216,93,205,79,190,16383,16383,79,167,82,176,91,185,103,193,116,198,131,200,
-64,91,58,17,69,70,69,70,58,17,88,1,69,70,88,1,76,51,76,51,88,1,86,34,93,25,86,34,88,1,93,25,88,1,123,-4,162,225,127,230,130,215,130,215,127,230,118,216,98,212,118,216,127,230,98,212,127,230,90,225,187,70,180,44,191,17,191,17,180,44,168,25,191,17,168,25,160,1,160,1,168,25,151,13,160,1,151,13,131,9,131,9,120,10,123,-4,123,-4,120,10,110,13,123,-4,110,13,101,18,140,211,149,206,162,225,162,225,149,206,158,199,162,225,158,199,165,191,165,191,174,177,191,210,191,210,174,177,181,161,191,210,181,161,186,142,230,154,215,186,215,43,230,154,215,43,230,76,230,154,230,76,235,116,187,70,191,17,190,102,190,102,191,17,191,210,191,210,191,17,215,43,191,210,215,43,215,186,191,210,186,142,189,122,191,210,189,122,190,102,191,210,162,225,165,191,131,9,123,-4,160,1,58,17,61,113,60,137,60,137,62,164,58,209,58,209,62,164,70,186,58,209,70,186,90,225,90,225,70,186,82,202,90,225,82,202,98,212,58,17,60,137,58,209,58,17,58,209,35,42,35,42,58,209,35,185,35,42,35,185,20,75,20,75,35,185,20,153,20,75,20,153,15,114,61,113,58,17,64,91,162,225,130,215,140,211,93,25,123,-4,101,18,
-79,229,76,230,62,224,20,209,4,204,4,196,7,197,17,197,26,196,31,194,35,189,37,180,37,-78,34,-87,27,-93,17,-97,2,-99,2,-107,123,-107,123,-98,104,-97,92,-94,84,-88,80,-77,79,-61,79,17,90,8,99,2,108,-1,118,-3,130,-4,164,1,193,19,215,47,230,82,235,123,231,158,219,188,202,210,179,225,151,230,135,228,120,224,106,216,93,205,79,190,16383,16383,79,167,82,176,91,185,103,193,116,198,131,200,151,195,168,183,181,163,189,136,192,103,189,73,181,47,168,28,152,15,132,11,117,13,103,18,91,26,82,35,79,44,244,-107,244,-99,231,-97,222,-93,216,-88,213,-80,213,228,207,228,180,213,167,220,155,224,144,228,122,230,87,224,57,206,33,179,18,144,12,103,16,67,27,38,44,15,66,0,92,-4,109,-2,126,1,142,8,157,19,171,32,171,-61,169,-75,165,-86,157,-93,144,-97,126,-99,126,-107,16383,16383,171,64,170,57,170,52,168,47,167,44,165,41,149,31,140,28,130,26,112,26,96,30,89,34,83,39,74,50,66,64,60,81,56,100,55,121,58,153,67,179,81,199,100,211,124,215,141,214,154,208,163,198,169,184,171,166,80,229,78,230,62,224,48,219,
-34,-87,27,-93,123,-107,123,-107,27,-93,17,-97,123,-107,17,-97,2,-99,9,197,12,197,20,209,20,209,12,197,14,197,20,209,14,197,17,197,17,197,26,196,20,209,20,209,26,196,34,214,20,209,4,204,7,197,20,209,7,197,9,197,82,35,79,44,90,8,90,8,79,44,79,17,80,-77,79,-61,48,219,80,-77,48,219,37,169,37,169,48,219,37,180,26,196,31,194,34,214,34,214,31,194,35,189,34,214,35,189,48,219,48,219,35,189,37,180,79,190,79,229,76,230,79,190,76,230,79,-61,79,190,79,-61,79,167,79,190,79,167,82,176,79,190,82,176,93,205,235,123,231,158,230,82,230,82,231,158,219,188,230,82,219,188,215,47,215,47,219,188,202,210,215,47,202,210,193,19,193,19,202,210,192,103,193,19,192,103,189,73,193,19,189,73,181,47,202,210,179,225,181,163,202,210,181,163,189,136,202,210,189,136,192,103,135,228,131,200,151,195,135,228,151,195,151,230,151,230,151,195,168,183,151,230,168,183,179,225,179,225,168,183,181,163,108,-1,118,-3,117,13,117,13,118,-3,132,11,152,15,132,11,164,1,152,15,164,1,168,28,168,28,164,1,193,19,168,28,193,19,181,47,132,11,118,-3,130,-4,132,11,130,-4,164,1,123,-107,123,-98,104,-97,123,-107,104,-97,92,-94,123,-107,92,-94,37,-78,123,-107,37,-78,34,-87,62,224,48,219,79,-61,62,224,79,-61,76,230,92,-94,84,-88,37,-64,37,-64,84,-88,80,-77,37,-64,80,-77,37,169,82,176,91,185,93,205,93,205,91,185,103,193,93,205,103,193,106,216,106,216,103,193,116,198,106,216,116,198,120,224,120,224,116,198,131,200,120,224,131,200,135,228,82,35,90,8,91,26,91,26,90,8,99,2,91,26,99,2,103,18,103,18,99,2,108,-1,103,18,108,-1,117,13,7,197,4,204,4,196,123,-107,2,-99,2,-107,37,-78,92,-94,37,-64,
-244,-107,244,-99,231,-97,222,-93,216,-88,213,-80,213,228,207,228,180,213,167,220,155,224,144,228,122,230,87,224,57,206,33,179,18,144,12,103,16,67,27,38,44,15,66,0,92,-4,109,-2,126,1,142,8,157,19,171,32,171,-61,169,-75,165,-86,157,-93,144,-97,126,-99,126,-107,16383,16383,171,64,170,57,170,52,168,47,167,44,165,41,149,31,140,28,130,26,112,26,96,30,89,34,83,39,74,50,66,64,60,81,56,100,55,121,58,153,67,179,81,199,100,211,124,215,141,214,154,208,163,198,169,184,171,166,80,229,78,230,62,224,48,219,35,214,20,209,3,203,3,195,7,196,11,196,14,197,21,197,28,196,32,193,36,187,37,179,38,167,38,42,37,29,35,21,29,15,18,11,2,7,2,0,123,0,123,7,105,9,93,13,85,20,81,30,80,45,80,157,82,168,88,179,97,189,106,196,115,199,119,197,122,196,125,194,128,191,133,187,137,184,141,182,144,181,148,181,155,182,160,185,164,190,167,196,167,204,166,213,163,220,157,225,149,229,140,230,128,228,117,224,106,215,94,202,80,183,78,151,71,156,64,163,
-112,26,104,28,109,-2,109,-2,104,28,96,30,109,-2,96,30,92,-4,92,-4,96,30,89,34,92,-4,89,34,83,39,83,39,74,50,92,-4,92,-4,74,50,66,64,92,-4,66,64,66,0,66,0,66,64,60,81,66,0,60,81,56,100,109,-2,126,1,112,26,112,26,126,1,121,26,130,26,121,26,126,1,130,26,126,1,142,8,133,229,124,215,141,214,133,229,141,214,144,228,144,228,141,214,154,208,144,228,154,208,155,224,155,224,154,208,163,198,155,224,163,198,167,220,167,220,163,198,169,184,167,220,169,184,180,213,180,213,169,184,171,166,180,213,171,166,171,32,171,32,171,166,171,64,67,179,81,199,87,224,87,224,81,199,100,211,87,224,100,211,122,230,122,230,100,211,124,215,122,230,124,215,133,229,57,206,33,179,44,15,57,206,44,15,55,121,57,206,55,121,58,153,57,206,58,153,67,179,57,206,67,179,87,224,55,121,44,15,56,100,12,103,16,67,18,144,18,144,16,67,27,38,18,144,27,38,33,179,33,179,27,38,44,15,165,-86,157,-93,244,-107,244,-107,157,-93,144,-97,244,-107,144,-97,126,-99,170,52,168,47,171,32,171,32,168,47,167,44,171,32,167,44,165,41,165,41,157,36,171,32,171,32,157,36,157,19,170,57,170,52,171,32,170,57,171,32,171,64,149,31,140,28,142,8,149,31,142,8,157,19,149,31,157,19,157,36,213,-69,213,228,207,228,213,-69,207,228,180,213,213,-69,180,213,213,-80,244,-107,244,-99,231,-97,244,-107,231,-97,222,-93,244,-107,222,-93,169,-75,244,-107,169,-75,165,-86,171,32,216,-88,213,-80,171,32,213,-80,180,213,171,-61,169,-75,222,-93,171,-61,222,-93,216,-88,171,-61,216,-88,171,32,244,-107,126,-99,126,-107,56,100,44,15,66,0,130,26,142,8,140,28,
-80,229,78,230,62,224,48,219,35,214,20,209,3,203,3,195,7,196,11,196,14,197,21,197,28,196,32,193,36,187,37,179,38,167,38,42,37,29,35,21,29,15,18,11,2,7,2,0,123,0,123,7,105,9,93,13,85,20,81,30,80,45,80,157,82,168,88,179,97,189,106,196,115,199,119,197,122,196,125,194,128,191,133,187,137,184,141,182,144,181,148,181,155,182,160,185,164,190,167,196,167,204,166,213,163,220,157,225,149,229,140,230,128,228,117,224,106,215,94,202,80,183,78,151,71,156,64,163,60,170,57,178,56,185,58,197,63,207,71,214,82,217,94,219,110,217,123,210,134,198,143,181,151,157,158,157,156,225,150,225,145,220,140,220,137,221,134,221,131,223,122,226,115,228,109,229,94,229,72,227,53,219,38,207,29,190,26,168,28,153,35,138,47,123,63,109,85,95,113,80,129,68,134,60,138,52,139,43,137,31,132,21,123,13,112,8,98,6,79,9,63,17,51,31,41,50,34,76,26,76,26,-1,32,-1,34,0,36,2,39,3,41,4,48,4,
-11,196,14,197,20,209,20,209,14,197,18,197,20,209,18,197,21,197,21,197,28,196,35,214,35,214,28,196,32,193,35,214,32,193,36,187,20,209,3,203,7,196,20,209,7,196,11,196,80,183,80,229,78,230,80,183,78,230,80,45,80,45,78,230,62,224,80,45,62,224,81,30,81,30,62,224,48,219,81,30,48,219,38,167,38,167,48,219,37,179,48,219,35,214,36,187,48,219,36,187,37,179,35,214,20,209,21,197,122,196,128,228,119,197,119,197,128,228,117,224,119,197,117,224,117,198,117,198,117,224,115,199,106,196,115,199,117,224,106,196,117,224,106,215,137,184,140,230,133,187,133,187,140,230,128,228,133,187,128,228,128,191,128,191,128,228,125,194,144,181,148,181,149,229,149,229,148,181,155,182,149,229,155,182,157,225,157,225,155,182,160,185,157,225,160,185,163,220,163,220,160,185,164,190,163,220,164,190,166,213,166,213,164,190,167,196,166,213,167,196,167,204,141,182,144,181,149,229,141,182,149,229,140,230,141,182,140,230,137,184,82,168,88,179,94,202,94,202,88,179,97,189,94,202,97,189,106,215,106,215,97,189,106,196,80,45,80,157,80,183,80,183,80,157,82,168,80,183,82,168,94,202,123,0,123,7,105,9,123,0,105,9,93,13,123,0,93,13,37,29,123,0,37,29,35,21,123,0,35,21,29,15,123,0,29,15,18,11,123,0,18,11,2,7,123,0,2,7,2,0,93,13,85,20,38,42,38,42,85,20,81,30,38,42,81,30,38,167,7,196,3,203,3,195,37,29,93,13,38,42,128,228,122,196,125,194,
-78,151,71,156,64,163,60,170,57,178,56,185,58,197,63,207,71,214,82,217,94,219,110,217,123,210,134,198,143,181,151,157,158,157,156,225,150,225,145,220,140,220,137,221,134,221,131,223,122,226,115,228,109,229,94,229,72,227,53,219,38,207,29,190,26,168,28,153,35,138,47,123,63,109,85,95,113,80,129,68,134,60,138,52,139,43,137,31,132,21,123,13,112,8,98,6,79,9,63,17,51,31,41,50,34,76,26,76,26,-1,32,-1,34,0,36,2,39,3,41,4,48,4,52,3,56,3,61,1,68,0,75,-2,82,-3,90,-4,104,-4,126,-1,145,7,160,21,170,38,174,57,173,73,168,86,159,97,147,108,130,119,133,39,127,32,121,27,115,24,109,22,103,21,93,23,86,28,81,36,78,49,77,66,77,209,127,209,127,225,77,225,77,286,76,287,76,289,75,289,74,290,72,287,69,284,65,278,64,276,53,260,42,247,32,236,23,228,15,222,12,220,8,216,7,214,7,210,8,210,8,209,35,209,35,59,37,36,42,18,51,5,64,-1,79,-4,93,-3,106,1,118,8,129,19,140,33,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,
-36,2,39,3,41,50,41,50,39,3,41,4,41,50,41,4,45,4,45,4,48,4,51,31,51,31,48,4,52,3,51,31,52,3,63,17,63,17,52,3,56,3,63,17,56,3,61,1,36,2,41,50,34,0,34,0,41,50,34,76,34,0,34,76,32,-1,32,-1,34,76,26,76,32,-1,26,76,26,-1,72,227,53,219,58,197,58,197,53,219,56,185,63,109,56,185,53,219,63,109,53,219,47,123,47,123,53,219,38,207,47,123,38,207,35,138,35,138,38,207,29,190,35,138,29,190,28,153,28,153,29,190,26,168,102,229,94,229,110,217,110,217,94,229,94,219,82,217,94,219,94,229,82,217,94,229,72,227,137,221,134,221,134,198,134,198,134,221,131,223,134,198,131,223,128,224,128,224,122,226,123,210,123,210,122,226,115,228,123,210,115,228,110,217,110,217,115,228,109,229,110,217,109,229,102,229,148,223,146,221,151,157,151,157,146,221,145,220,151,157,145,220,143,181,143,181,145,220,143,220,143,181,143,220,142,220,142,220,140,220,143,181,143,181,140,220,137,221,143,181,137,221,134,198,151,157,158,157,156,225,151,157,156,225,150,225,151,157,150,225,148,223,128,224,123,210,134,198,174,57,173,73,170,38,170,38,173,73,168,86,170,38,168,86,160,21,160,21,168,86,159,97,160,21,159,97,147,108,123,13,126,-1,132,21,132,21,126,-1,145,7,132,21,145,7,137,31,137,31,145,7,139,43,147,108,139,43,145,7,147,108,145,7,160,21,121,74,129,68,130,119,130,119,129,68,134,60,130,119,134,60,147,108,147,108,134,60,138,52,147,108,138,52,139,43,130,119,78,151,85,95,130,119,85,95,113,80,130,119,113,80,121,74,78,151,71,156,85,95,85,95,71,156,64,163,85,95,64,163,63,109,63,109,64,163,60,170,63,109,60,170,57,178,98,6,104,-4,112,8,112,8,104,-4,126,-1,112,8,126,-1,123,13,72,227,58,197,63,207,72,227,63,207,71,214,72,227,71,214,82,217,98,6,79,9,82,-3,98,6,82,-3,90,-4,98,6,90,-4,97,-4,98,6,97,-4,104,-4,79,9,63,17,68,0,79,9,68,0,75,-2,79,9,75,-2,82,-3,68,0,63,17,61,1,51,31,41,50,45,4,56,185,63,109,57,178,
-133,39,127,32,121,27,115,24,109,22,103,21,93,23,86,28,81,36,78,49,77,66,77,209,127,209,127,225,77,225,77,286,76,287,76,289,75,289,74,290,72,287,69,284,65,278,64,276,53,260,42,247,32,236,23,228,15,222,12,220,8,216,7,214,7,210,8,210,8,209,35,209,35,59,37,36,42,18,51,5,64,-1,79,-4,93,-3,106,1,118,8,129,19,140,33,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,
-42,247,32,236,35,209,35,209,32,236,23,228,35,209,23,228,15,222,53,260,42,247,42,18,53,260,42,18,51,5,53,260,51,5,64,-1,53,260,64,-1,64,276,37,36,42,18,42,247,37,36,42,247,35,209,37,36,35,209,35,59,7,210,8,210,8,216,8,216,8,210,8,209,8,216,8,209,10,218,10,218,8,209,35,209,10,218,35,209,12,220,12,220,35,209,15,222,7,214,7,213,7,212,7,214,7,212,7,211,7,214,7,211,7,210,7,214,7,210,8,216,69,284,79,-4,77,66,77,225,77,209,127,209,77,225,127,209,127,225,77,66,77,283,77,286,77,66,77,286,76,287,77,66,76,287,76,289,77,66,76,289,75,289,77,66,75,289,74,290,77,66,74,290,72,287,77,66,72,287,69,284,86,28,93,-3,93,23,93,23,93,-3,103,21,109,22,103,21,106,1,109,22,106,1,118,8,81,36,78,49,79,-4,81,36,79,-4,93,-3,81,36,93,-3,86,28,79,-4,69,284,67,281,79,-4,67,281,65,278,79,-4,65,278,64,276,79,-4,64,276,64,-1,129,19,140,33,133,39,129,19,133,39,127,32,129,19,127,32,121,27,129,19,121,27,118,8,115,24,109,22,118,8,115,24,118,8,121,27,103,21,93,-3,106,1,77,66,79,-4,78,49,
-240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,238,225,169,225,169,218,178,216,184,214,189,211,192,207,193,201,192,198,192,195,191,192,191,189,190,186,140,57,89,185,87,190,86,194,85,197,84,201,84,204,85,209,88,212,92,215,99,216,108,218,108,225,9,225,9,218,19,216,27,212,35,202,44,186,55,160,115,17,116,14,118,10,118,8,119,6,121,1,123,-1,125,-4,126,-6,128,-6,130,-5,132,-3,135,1,138,8,142,18,206,179,213,195,219,206,224,213,231,216,238,218,
-78,225,4,225,17,216,78,225,17,216,26,213,78,225,26,213,32,207,78,225,32,207,35,197,78,225,35,197,36,185,78,225,36,185,38,38,78,225,38,38,46,20,78,225,46,20,58,6,78,225,58,6,75,-1,78,225,75,-1,78,64,164,53,162,48,168,38,168,38,162,48,159,43,168,38,159,43,155,40,155,40,147,34,153,21,153,21,147,34,139,29,153,21,139,29,138,8,138,8,139,29,130,26,138,8,130,26,123,0,123,0,130,26,121,25,123,0,121,25,113,24,113,24,102,26,109,-3,109,-3,102,26,97,-4,97,-4,102,26,92,31,97,-4,92,31,84,40,97,-4,84,40,79,51,97,-4,79,51,75,-1,78,64,75,-1,79,51,113,24,109,-3,123,0,166,184,168,38,209,225,209,225,168,38,169,38,209,225,169,38,171,-3,171,-3,169,38,169,-2,168,38,166,184,166,69,168,38,166,69,166,59,168,38,166,59,164,53,155,40,153,21,168,38,225,26,217,29,225,14,225,14,217,29,212,34,225,14,212,34,212,10,212,10,212,34,209,42,212,10,209,42,199,6,199,6,209,42,209,54,199,6,209,54,209,225,209,225,171,-3,186,1,209,225,186,1,199,6,209,225,129,225,145,215,209,225,145,215,155,212,209,225,155,212,162,206,209,225,162,206,165,197,209,225,165,197,166,184,237,25,225,26,225,14,237,25,225,14,240,18,237,25,240,18,240,25,38,38,36,185,36,59,145,215,129,225,129,217,17,216,4,225,4,218,
-238,225,169,225,169,218,178,216,184,214,189,211,192,207,193,201,192,198,192,195,191,192,191,189,190,186,140,57,89,185,87,190,86,194,85,197,84,201,84,204,85,209,88,212,92,215,99,216,108,218,108,225,9,225,9,218,19,216,27,212,35,202,44,186,55,160,115,17,116,14,118,10,118,8,119,6,121,1,123,-1,125,-4,126,-6,128,-6,130,-5,132,-3,135,1,138,8,142,18,206,179,213,195,219,206,224,213,231,216,238,218,347,225,286,225,286,218,294,215,301,213,305,210,307,207,307,197,306,191,302,177,299,169,254,58,209,178,206,185,204,195,204,205,207,210,212,213,221,215,233,218,233,225,131,225,131,218,141,216,148,212,155,206,160,196,166,183,175,155,130,55,80,186,79,189,79,192,78,195,78,206,81,211,85,214,91,216,100,218,100,225,11,225,11,218,17,216,22,214,26,208,31,199,37,186,104,15,108,7,111,0,113,-3,116,-5,118,-6,121,-3,
-87,190,86,194,115,17,115,17,86,194,85,197,115,17,85,197,55,160,55,160,85,197,84,201,55,160,84,201,84,204,84,204,85,209,55,160,108,225,9,225,19,216,108,225,19,216,27,212,108,225,27,212,35,202,108,225,35,202,44,186,108,225,44,186,88,212,108,225,88,212,92,215,108,225,92,215,99,216,108,225,99,216,108,218,85,209,88,212,44,186,85,209,44,186,55,160,140,57,89,185,115,17,140,57,115,17,116,14,140,57,116,14,117,12,140,57,117,12,118,10,140,57,118,10,118,8,140,57,118,8,119,6,140,57,119,6,121,1,140,57,121,1,123,-1,140,57,123,-1,125,-4,140,57,125,-4,126,-6,140,57,126,-6,128,-6,140,57,128,-6,130,-5,140,57,130,-5,132,-3,140,57,132,-3,135,1,140,57,135,1,138,8,140,57,138,8,142,18,140,57,142,18,190,186,206,179,190,186,142,18,238,225,169,225,178,216,238,225,178,216,184,214,238,225,184,214,189,211,238,225,189,211,192,207,238,225,192,207,193,201,238,225,193,201,224,213,238,225,224,213,231,216,238,225,231,216,238,218,206,179,213,195,193,201,206,179,193,201,192,198,206,179,192,198,192,195,206,179,192,195,191,192,206,179,191,192,191,189,206,179,191,189,190,186,219,206,224,213,193,201,219,206,193,201,213,195,178,216,169,225,169,218,87,190,115,17,89,185,19,216,9,225,9,218,
-347,225,286,225,286,218,294,215,301,213,305,210,307,207,307,197,306,191,302,177,299,169,254,58,209,178,206,185,204,195,204,205,207,210,212,213,221,215,233,218,233,225,131,225,131,218,141,216,148,212,155,206,160,196,166,183,175,155,130,55,80,186,79,189,79,192,78,195,78,206,81,211,85,214,91,216,100,218,100,225,11,225,11,218,17,216,22,214,26,208,31,199,37,186,104,15,108,7,111,0,113,-3,116,-5,118,-6,121,-3,123,0,126,5,130,12,186,132,232,15,235,5,238,0,241,-6,246,-6,250,0,253,7,257,17,326,190,331,200,334,207,338,212,342,215,347,218,239,0,239,7,230,8,222,12,215,18,207,26,199,37,134,136,176,195,182,203,190,209,198,214,207,216,217,218,217,225,137,225,137,218,145,217,151,215,155,213,157,210,157,202,154,197,150,191,145,184,136,169,133,165,130,160,124,152,123,154,121,156,119,160,117,162,109,174,103,185,98,194,95,201,94,206,95,210,97,213,101,216,107,217,116,218,116,225,12,225,12,218,17,218,25,217,32,214,39,208,47,200,55,187,55,188,102,116,45,33,37,22,31,15,24,11,17,9,8,7,8,0,81,0,81,7,73,8,68,9,64,11,62,13,61,17,61,19,62,22,64,26,67,31,
-22,214,26,208,100,225,100,225,26,208,31,199,100,225,31,199,37,186,37,186,104,15,78,195,78,195,104,15,79,192,37,186,78,198,78,201,78,201,78,206,37,186,37,186,78,206,81,211,37,186,81,211,85,214,100,225,37,186,85,214,100,225,85,214,91,216,100,225,91,216,100,218,17,216,22,214,100,225,17,216,100,225,11,225,17,216,11,225,11,218,186,132,204,200,204,205,186,132,204,205,175,155,175,155,204,205,166,183,160,196,166,183,207,210,160,196,207,210,212,213,233,225,131,225,141,216,233,225,141,216,148,212,233,225,148,212,155,206,233,225,155,206,160,196,233,225,160,196,212,213,233,225,212,213,221,215,233,225,221,215,233,218,207,210,166,183,204,205,254,58,212,170,232,15,254,58,232,15,235,5,254,58,235,5,238,0,254,58,238,0,240,-4,254,58,240,-4,241,-6,254,58,241,-6,243,-6,254,58,243,-6,246,-6,254,58,246,-6,248,-3,254,58,248,-3,250,0,254,58,250,0,253,7,254,58,253,7,257,17,254,58,257,17,299,169,232,15,212,170,209,178,232,15,209,178,206,185,232,15,206,185,205,190,232,15,205,190,204,195,232,15,204,195,186,132,326,190,299,169,257,17,347,225,286,225,294,215,347,225,294,215,301,213,347,225,301,213,305,210,347,225,305,210,307,207,347,225,307,207,307,203,347,225,307,203,334,207,347,225,334,207,338,212,347,225,338,212,342,215,347,225,342,215,347,218,326,190,331,200,307,203,326,190,307,203,307,197,326,190,307,197,306,191,326,190,306,191,304,184,326,190,304,184,302,177,326,190,302,177,299,169,123,0,126,5,130,55,130,55,126,5,130,12,130,55,130,12,175,155,175,155,130,12,186,132,130,55,80,186,104,15,130,55,104,15,108,7,130,55,108,7,111,0,130,55,111,0,113,-3,130,55,113,-3,116,-5,130,55,116,-5,118,-6,130,55,118,-6,119,-5,130,55,119,-5,121,-3,130,55,121,-3,123,0,79,189,79,192,104,15,79,189,104,15,80,186,37,186,78,195,78,198,294,215,286,225,286,218,334,207,307,203,331,200,186,132,204,195,204,200,141,216,131,225,131,218,
-239,0,239,7,230,8,222,12,215,18,207,26,199,37,134,136,176,195,182,203,190,209,198,214,207,216,217,218,217,225,137,225,137,218,145,217,151,215,155,213,157,210,157,202,154,197,150,191,145,184,136,169,133,165,130,160,124,152,123,154,121,156,119,160,117,162,109,174,103,185,98,194,95,201,94,206,95,210,97,213,101,216,107,217,116,218,116,225,12,225,12,218,17,218,25,217,32,214,39,208,47,200,55,187,55,188,102,116,45,33,37,22,31,15,24,11,17,9,8,7,8,0,81,0,81,7,73,8,68,9,64,11,62,13,61,17,61,19,62,22,64,26,67,31,71,37,110,99,156,28,157,27,159,23,159,15,157,12,153,9,147,8,139,7,139,0,238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,26,211,30,206,33,200,99,60,105,47,111,35,116,24,121,9,119,2,116,-8,112,-21,106,-34,100,-44,96,-51,85,-62,80,-65,75,-66,71,-66,69,-65,66,-64,62,-63,63,-63,57,-60,52,-58,42,-56,36,-56,30,-57,24,-60,19,-65,16,-72,15,-79,17,-88,21,-96,28,-102,38,-106,50,-108,71,-105,90,-94,106,-76,122,-49,137,-11,213,192,217,202,221,208,226,213,231,216,238,218,209,68,200,70,197,57,195,47,193,40,190,34,186,28,181,24,173,20,
-31,15,24,11,81,0,81,0,24,11,17,9,81,0,17,9,8,7,32,214,39,208,116,225,116,225,39,208,47,200,116,225,47,200,55,188,55,187,55,188,102,116,55,187,102,116,94,206,94,206,95,210,55,187,55,187,95,210,97,213,55,187,97,213,116,225,116,225,97,213,101,216,116,225,101,216,107,217,31,15,81,0,37,22,37,22,81,0,64,11,37,22,64,11,45,33,45,33,64,11,62,13,45,33,62,13,61,17,61,17,61,19,45,33,45,33,61,19,62,22,45,33,62,22,102,116,102,116,62,22,64,26,102,116,64,26,67,31,102,116,67,31,71,37,71,37,110,99,102,116,102,116,110,99,103,185,102,116,103,185,98,194,107,217,116,218,116,225,116,225,12,225,17,218,116,225,17,218,25,217,116,225,25,217,32,214,95,201,94,206,102,116,95,201,102,116,98,194,121,156,120,158,156,28,156,28,120,158,119,160,156,28,119,160,117,162,117,162,109,174,110,99,110,99,109,174,103,185,222,12,215,18,159,20,159,20,215,18,207,26,159,20,207,26,199,37,199,37,134,136,156,28,156,28,134,136,127,156,156,28,127,156,124,152,124,152,123,154,156,28,156,28,123,154,121,156,217,225,137,225,145,217,217,225,145,217,151,215,217,225,151,215,155,213,217,225,155,213,157,210,217,225,157,210,157,206,217,225,157,206,190,209,217,225,190,209,198,214,217,225,198,214,207,216,217,225,207,216,217,218,176,195,182,203,157,206,176,195,157,206,157,202,176,195,157,202,154,197,176,195,154,197,150,191,176,195,150,191,145,184,176,195,145,184,139,174,176,195,139,174,136,169,176,195,136,169,134,136,134,136,136,169,133,165,134,136,133,165,130,160,134,136,130,160,127,156,157,12,153,9,239,0,239,0,153,9,147,8,239,0,147,8,139,7,158,25,159,23,199,37,199,37,159,23,159,21,199,37,159,21,159,20,159,20,159,15,239,0,239,0,159,15,157,12,199,37,156,28,157,27,199,37,157,27,158,25,117,162,110,99,156,28,239,0,239,7,230,8,239,0,230,8,222,12,239,0,222,12,159,20,81,0,81,7,73,8,81,0,73,8,68,9,81,0,68,9,64,11,81,0,8,7,8,0,239,0,139,7,139,0,145,217,137,225,137,218,190,209,157,206,182,203,17,218,12,225,12,218,116,225,55,188,55,187,
-238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,26,211,30,206,33,200,99,60,105,47,111,35,116,24,121,9,119,2,116,-8,112,-21,106,-34,100,-44,96,-51,85,-62,80,-65,75,-66,71,-66,69,-65,66,-64,62,-63,63,-63,57,-60,52,-58,42,-56,36,-56,30,-57,24,-60,19,-65,16,-72,15,-79,17,-88,21,-96,28,-102,38,-106,50,-108,71,-105,90,-94,106,-76,122,-49,137,-11,213,192,217,202,221,208,226,213,231,216,238,218,209,68,200,70,197,57,195,47,193,40,190,34,186,28,181,24,173,20,163,17,149,16,133,15,67,15,201,218,201,225,28,225,26,166,36,166,39,184,44,197,51,205,63,209,79,210,147,210,13,7,13,0,201,0,175,-84,157,-78,144,-69,136,-58,131,-42,129,-22,129,60,128,82,124,98,115,110,102,118,83,124,102,131,115,140,124,151,128,167,129,189,129,273,131,293,136,308,144,320,157,328,175,334,175,340,157,339,144,338,132,336,114,328,107,321,100,312,96,300,94,287,93,271,93,181,91,163,87,149,80,139,67,131,50,125,67,118,80,110,87,100,91,86,93,68,93,-20,94,-35,96,-49,
-90,-57,85,-62,90,-94,90,-94,85,-62,80,-65,90,-94,80,-65,75,-66,75,-66,73,-66,90,-94,90,-94,73,-66,71,-105,90,-57,106,-76,96,-51,96,-51,106,-76,100,-44,106,-34,100,-44,106,-76,106,-34,106,-76,122,-49,143,59,88,184,99,60,143,59,99,60,105,47,143,59,105,47,111,35,143,59,111,35,116,24,143,59,116,24,119,15,143,59,119,15,121,9,143,59,121,9,122,-49,143,59,122,-49,137,-11,143,59,137,-11,213,192,143,59,213,192,192,196,122,-49,121,9,119,2,99,60,88,184,86,188,99,60,86,188,84,192,99,60,84,192,82,196,99,60,82,196,81,201,99,60,81,201,33,200,33,200,81,201,81,204,81,204,82,209,33,200,33,200,82,209,85,212,33,200,85,212,109,225,109,225,85,212,90,215,109,225,90,215,98,217,194,202,193,201,213,192,213,192,193,201,193,198,213,192,193,198,192,196,238,225,171,225,179,217,238,225,179,217,186,216,238,225,186,216,190,213,238,225,190,213,193,210,238,225,193,210,194,205,238,225,194,205,226,213,238,225,226,213,231,216,238,225,231,216,238,218,194,205,213,192,217,202,194,205,217,202,221,208,194,205,221,208,226,213,194,204,194,202,213,192,194,204,213,192,194,205,122,-49,119,2,116,-8,122,-49,116,-8,112,-21,122,-49,112,-21,106,-34,71,-105,73,-66,71,-66,71,-105,71,-66,69,-65,71,-105,69,-65,66,-64,71,-105,66,-64,63,-63,71,-105,63,-63,57,-60,71,-105,57,-60,52,-58,71,-105,52,-58,50,-108,52,-58,47,-57,50,-108,50,-108,47,-57,42,-56,50,-108,42,-56,38,-106,38,-106,42,-56,36,-56,38,-106,36,-56,30,-57,38,-106,30,-57,28,-102,28,-102,30,-57,24,-60,28,-102,24,-60,21,-96,21,-96,24,-60,19,-65,21,-96,19,-65,17,-88,17,-88,19,-65,16,-72,17,-88,16,-72,15,-79,98,217,109,218,109,225,109,225,7,225,14,217,109,225,14,217,21,214,109,225,21,214,26,211,109,225,26,211,30,206,109,225,30,206,33,200,66,-64,62,-63,63,-63,14,217,7,225,7,218,90,-57,90,-94,106,-76,179,217,171,225,171,218,
-209,68,200,70,197,57,195,47,193,40,190,34,186,28,181,24,173,20,163,17,149,16,133,15,67,15,201,218,201,225,28,225,26,166,36,166,39,184,44,197,51,205,63,209,79,210,147,210,13,7,13,0,201,0,175,-84,157,-78,144,-69,136,-58,131,-42,129,-22,129,60,128,82,124,98,115,110,102,118,83,124,102,131,115,140,124,151,128,167,129,189,129,273,131,293,136,308,144,320,157,328,175,334,175,340,157,339,144,338,132,336,
-67,15,201,218,147,210,147,210,201,218,201,225,147,210,201,225,79,210,63,209,79,210,201,225,63,209,201,225,28,225,28,225,26,166,36,166,28,225,36,166,39,184,28,225,39,184,44,197,28,225,44,197,51,205,28,225,51,205,63,209,147,210,13,7,67,15,67,15,13,7,201,0,67,15,201,0,133,15,133,15,201,0,149,16,195,47,193,40,201,0,201,0,193,40,190,34,201,0,190,34,186,28,186,28,181,24,201,0,201,0,181,24,173,20,201,0,173,20,163,17,201,0,209,68,200,70,201,0,200,70,197,57,201,0,197,57,195,47,201,0,13,7,13,0,149,16,201,0,163,17,
-175,-84,157,-78,144,-69,136,-58,131,-42,129,-22,129,60,128,82,124,98,115,110,102,118,83,124,102,131,115,140,124,151,128,167,129,189,129,273,131,293,136,308,144,320,157,328,175,334,175,340,157,339,144,338,132,336,114,328,107,321,100,312,96,300,94,287,93,271,93,181,91,163,87,149,80,139,67,131,50,125,67,118,80,110,87,100,91,86,93,68,93,-20,94,-35,96,-49,101,-61,107,-70,114,-77,123,-82,132,-85,143,-87,157,-89,175,-89,66,-6,66,338,33,338,33,-6,147,270,146,286,144,300,139,312,133,321,126,328,108,336,97,338,83,339,65,340,65,334,83,328,96,320,104,308,109,293,110,273,110,189,112,167,116,151,125,139,138,131,157,125,138,118,125,110,116,98,112,82,110,60,110,-22,109,-42,104,-58,96,-69,83,-78,65,-84,65,-89,83,-89,96,-87,108,-85,117,-82,126,-77,133,-71,139,-61,144,-50,146,-36,147,-20,147,68,149,86,153,100,160,111,172,118,190,125,172,131,
-107,-70,114,-77,115,110,115,110,114,-77,123,-82,115,110,123,-82,124,98,124,98,123,-82,132,-85,124,98,132,-85,129,-22,129,-22,129,60,128,82,129,-22,128,82,124,98,157,-89,175,-89,175,-84,157,-89,175,-84,157,-78,157,-89,157,-78,144,-69,157,-89,144,-69,143,-87,136,-58,131,-42,132,-85,136,-58,132,-85,143,-87,136,-58,143,-87,144,-69,102,118,83,124,87,100,102,118,87,100,91,86,102,118,91,86,93,68,102,118,93,68,94,-35,102,118,94,-35,96,-49,102,118,96,-49,101,-61,102,118,101,-61,107,-70,102,118,107,-70,115,110,93,68,93,-20,94,-35,80,110,87,100,83,124,80,110,83,124,87,149,80,110,87,149,80,139,80,110,80,139,67,118,157,339,144,338,144,320,157,339,144,320,157,328,157,339,157,328,175,334,157,339,175,334,175,340,129,273,131,293,132,336,132,336,131,293,136,308,132,336,136,308,144,338,144,338,136,308,144,320,114,328,115,140,123,332,123,332,115,140,124,151,123,332,124,151,129,273,129,273,124,151,128,167,129,273,128,167,129,189,107,321,100,312,102,131,107,321,102,131,115,140,107,321,115,140,114,328,102,131,100,312,96,300,102,131,96,300,94,287,102,131,94,287,93,271,102,131,93,271,93,181,102,131,93,181,91,163,102,131,91,163,87,149,102,131,87,149,83,124,67,131,50,125,67,118,67,131,67,118,80,139,123,332,129,273,132,336,129,-22,132,-85,131,-42,
-66,-6,66,338,33,338,33,-6,147,270,146,286,144,300,139,312,
-66,-6,66,338,33,338,66,-6,33,338,33,-6,
-147,270,146,286,144,300,139,312,133,321,126,328,108,336,97,338,83,339,65,340,65,334,83,328,96,320,104,308,109,293,110,273,110,189,112,167,116,151,125,139,138,131,157,125,138,118,125,110,116,98,112,82,110,60,110,-22,109,-42,104,-58,96,-69,83,-78,65,-84,65,-89,83,-89,96,-87,108,-85,117,-82,126,-77,133,-71,139,-61,144,-50,146,-36,147,-20,147,68,149,86,153,100,160,111,172,118,190,125,172,131,160,139,153,149,149,163,147,181,233,162,227,151,219,141,211,133,201,128,189,126,179,127,157,135,148,140,141,143,124,150,111,155,100,158,92,160,83,160,69,159,56,154,43,146,31,134,20,117,38,92,44,104,51,114,60,122,70,126,80,128,92,127,103,125,114,122,122,119,128,116,143,107,155,101,166,97,176,95,189,94,202,95,214,100,226,108,238,120,251,137,101,209,100,217,96,224,90,229,83,233,75,234,66,233,59,229,53,224,49,217,48,209,49,200,53,192,58,186,
-110,273,112,167,110,273,110,273,112,167,117,332,110,273,117,332,109,293,109,293,117,332,108,336,109,293,108,336,104,308,104,308,108,336,97,338,104,308,97,338,96,320,96,320,97,338,83,339,96,320,83,339,83,328,83,328,83,339,65,340,83,328,65,340,65,334,147,181,147,270,146,286,147,181,146,286,144,300,147,181,144,300,139,312,147,181,139,312,138,131,147,181,138,131,149,163,172,118,190,125,172,131,172,118,172,131,160,111,160,111,172,131,160,139,160,111,160,139,157,125,157,125,160,139,153,149,157,125,153,149,149,163,112,167,116,151,117,332,117,332,116,151,125,139,117,332,125,139,126,328,126,328,125,139,138,131,126,328,138,131,133,321,133,321,138,131,139,312,157,125,138,118,149,86,157,125,149,86,153,100,157,125,153,100,160,111,147,68,149,86,138,118,147,68,138,118,139,-61,147,68,139,-61,144,-50,147,68,144,-50,146,-36,147,68,146,-36,147,-20,116,98,117,-82,125,110,125,110,117,-82,126,-77,125,110,126,-77,138,118,138,118,126,-77,133,-71,138,118,133,-71,139,-61,117,-82,116,98,112,82,117,-82,112,82,110,60,117,-82,110,60,110,-22,117,-82,110,-22,109,-42,117,-82,109,-42,108,-85,104,-58,96,-69,96,-87,104,-58,96,-87,108,-85,104,-58,108,-85,109,-42,83,-78,65,-84,83,-89,83,-78,83,-89,96,-87,83,-78,96,-87,96,-69,83,-89,65,-84,65,-89,149,163,138,131,157,125,112,167,110,273,110,189,
-233,162,227,151,219,141,211,133,201,128,189,126,179,127,157,135,148,140,141,143,124,150,111,155,100,158,92,160,83,160,69,159,56,154,43,146,31,134,20,117,38,92,44,104,51,114,60,122,70,126,80,128,92,127,103,125,114,122,122,119,128,116,143,107,155,101,166,97,176,95,189,94,202,95,214,100,226,108,238,120,251,137,101,209,100,217,96,224,90,229,83,233,75,234,66,233,59,229,53,224,49,217,48,209,49,200,53,192,58,186,66,182,74,181,83,182,90,186,96,192,100,200,101,209,16383,16383,78,141,71,141,49,-49,49,-53,48,-57,48,-69,49,-82,52,-93,58,-101,65,-106,75,-108,84,-106,91,-100,96,-92,100,-81,101,-68,101,-57,100,-53,100,-49,
-92,160,83,160,92,127,92,127,83,160,80,128,70,126,80,128,83,160,70,126,83,160,69,159,141,143,128,116,143,107,141,143,143,107,148,140,148,140,143,107,155,101,148,140,155,101,157,135,157,135,155,101,166,97,157,135,166,97,168,131,168,131,166,97,176,95,168,131,176,95,179,127,179,127,176,95,189,94,179,127,189,94,189,126,189,126,189,94,202,95,189,126,202,95,201,128,92,160,92,127,100,158,100,158,92,127,103,125,100,158,103,125,111,155,111,155,103,125,114,122,111,155,114,122,124,150,124,150,114,122,122,119,124,150,122,119,128,116,201,128,202,95,211,133,211,133,202,95,214,100,211,133,214,100,219,141,219,141,214,100,226,108,219,141,226,108,227,151,227,151,226,108,238,120,227,151,238,120,233,162,233,162,238,120,251,137,44,104,51,114,56,154,56,154,51,114,60,122,56,154,60,122,69,159,69,159,60,122,70,126,43,146,31,134,38,92,43,146,38,92,44,104,43,146,44,104,56,154,38,92,31,134,20,117,128,116,141,143,124,150,
-101,209,100,217,96,224,90,229,83,233,75,234,66,233,59,229,53,224,49,217,48,209,49,200,53,192,58,186,66,182,74,181,83,182,90,186,96,192,100,200,101,209,16383,16383,78,141,71,141,49,-49,49,-53,48,-57,48,-69,49,-82,52,-93,58,-101,65,-106,75,-108,84,-106,91,-100,96,-92,100,-81,101,-68,101,-57,100,-53,100,-49,218,82,203,62,189,48,175,39,160,33,144,32,138,32,133,33,127,34,121,36,114,38,165,184,170,173,176,166,181,161,187,158,194,157,201,158,207,161,211,166,214,173,215,180,214,190,209,200,202,208,191,216,178,222,201,290,184,290,162,228,155,229,150,229,145,230,137,230,101,224,71,207,47,181,32,148,26,109,27,94,30,79,
-48,209,49,200,49,217,49,217,49,200,53,192,49,217,53,192,53,224,53,224,53,192,58,186,53,224,58,186,59,229,59,229,58,186,66,182,59,229,66,182,66,233,66,233,66,182,74,181,66,233,74,181,75,234,75,234,74,181,83,182,75,234,83,182,83,233,83,233,83,182,90,186,83,233,90,186,90,229,90,229,90,186,96,192,90,229,96,192,96,224,96,224,96,192,100,200,96,224,100,200,100,217,100,217,100,200,101,209,100,-49,78,141,84,-106,100,-49,84,-106,91,-100,100,-49,91,-100,96,-92,100,-49,96,-92,100,-81,100,-49,100,-81,101,-68,100,-49,101,-68,100,-53,58,-101,65,-106,71,141,71,141,65,-106,75,-108,71,141,75,-108,78,141,78,141,75,-108,84,-106,71,141,49,-49,49,-82,71,141,49,-82,52,-93,71,141,52,-93,58,-101,49,-82,49,-49,49,-53,49,-82,49,-53,48,-57,49,-82,48,-57,48,-61,49,-82,48,-61,48,-65,49,-82,48,-65,48,-69,101,-68,101,-64,101,-61,101,-68,101,-61,101,-57,101,-68,101,-57,100,-53,
-218,82,203,62,189,48,175,39,160,33,144,32,138,32,133,33,127,34,121,36,114,38,165,184,170,173,176,166,181,161,187,158,194,157,201,158,207,161,211,166,214,173,215,180,214,190,209,200,202,208,191,216,178,222,201,290,184,290,162,228,155,229,150,229,145,230,137,230,101,224,71,207,47,181,32,148,26,109,27,94,30,79,34,64,40,50,47,38,53,30,59,24,66,18,74,12,84,6,59,-68,76,-68,100,0,107,-1,119,-3,140,-3,151,0,161,3,171,8,180,15,190,24,198,33,206,45,214,59,224,78,16383,16383,99,49,86,63,76,77,70,92,66,110,65,130,68,158,77,182,91,200,110,211,133,215,138,215,142,214,147,213,151,212,156,210,172,164,172,186,109,186,107,205,106,220,105,233,104,245,104,256,106,280,112,299,122,313,135,322,151,325,161,324,169,321,175,315,178,308,180,299,180,285,182,275,186,269,191,266,199,265,207,266,214,270,219,276,223,283,224,291,221,306,212,319,198,329,180,336,159,338,126,333,99,317,79,293,66,261,61,221,62,214,62,208,64,194,65,186,12,186,12,164,65,164,68,147,71,127,73,109,75,93,76,81,76,69,75,67,75,63,69,64,64,64,60,65,51,65,36,63,24,58,14,50,8,40,6,27,8,16,12,8,19,1,28,-2,40,-3,50,-2,59,0,68,6,78,14,89,27,107,15,123,6,136,1,149,-1,161,-2,175,-1,188,1,201,7,212,15,
-156,210,99,49,100,0,100,0,99,49,86,63,100,0,86,63,84,6,84,6,86,63,76,77,84,6,76,77,74,12,74,12,76,77,70,92,74,12,70,92,66,110,53,30,59,24,65,130,65,130,66,18,66,110,66,110,66,18,74,12,113,-2,119,-3,114,38,114,38,119,-3,121,36,121,36,119,-3,124,-3,121,36,124,-3,127,34,127,34,124,-3,129,-3,127,34,129,-3,133,33,133,33,129,-3,140,-3,133,33,140,-3,138,32,138,32,140,-3,144,32,160,33,144,32,151,0,160,33,151,0,161,3,114,38,165,184,156,210,156,210,162,228,155,229,156,210,155,229,151,212,151,212,155,229,150,229,151,212,150,229,147,213,147,213,150,229,145,230,147,213,145,230,142,214,142,214,145,230,141,230,142,214,141,230,138,215,138,215,141,230,137,230,138,215,137,230,133,215,184,290,162,228,165,184,184,290,165,184,170,173,184,290,170,173,178,222,184,290,178,222,201,290,170,173,176,166,178,222,178,222,176,166,181,161,178,222,181,161,191,216,191,216,181,161,187,158,191,216,187,158,194,157,114,38,156,210,100,0,114,38,100,0,107,-1,114,38,107,-1,113,-2,76,-68,100,0,84,6,76,-68,84,6,59,-68,194,157,201,158,202,208,202,208,201,158,207,161,202,208,207,161,209,200,209,200,207,161,211,166,209,200,211,166,214,190,214,190,211,166,214,173,214,190,214,173,215,180,77,182,91,200,101,224,101,224,91,200,110,211,101,224,110,211,137,230,137,230,110,211,133,215,71,207,47,181,47,38,71,207,47,38,53,30,71,207,53,30,65,130,71,207,65,130,68,158,71,207,68,158,77,182,71,207,77,182,101,224,27,94,30,79,32,148,32,148,30,79,34,64,32,148,34,64,47,181,47,181,34,64,40,50,47,181,40,50,47,38,190,24,198,33,203,62,203,62,198,33,206,45,203,62,206,45,218,82,218,82,206,45,214,59,218,82,214,59,224,78,161,3,171,8,175,39,175,39,171,8,180,15,175,39,180,15,189,48,189,48,180,15,190,24,189,48,190,24,203,62,144,32,140,-3,151,0,160,33,161,3,175,39,27,94,32,148,26,109,191,216,194,157,202,208,156,210,165,184,162,228,66,18,65,130,59,24,
-172,164,172,186,109,186,107,205,106,220,105,233,104,245,104,256,106,280,112,299,122,313,135,322,151,325,161,324,169,321,175,315,178,308,180,299,180,285,182,275,186,269,191,266,199,265,207,266,214,270,219,276,223,283,224,291,221,306,212,319,198,329,180,336,159,338,126,333,99,317,79,293,66,261,61,221,62,214,62,208,64,194,65,186,12,186,12,164,65,164,68,147,71,127,73,109,75,93,76,81,76,69,75,67,75,63,69,64,64,64,60,65,51,65,36,63,24,58,14,50,8,40,6,27,8,16,12,8,19,1,28,-2,40,-3,50,-2,59,0,68,6,78,14,89,27,107,15,123,6,136,1,149,-1,161,-2,175,-1,188,1,201,7,212,15,223,24,229,32,235,42,240,52,244,61,245,68,245,69,244,70,240,70,238,69,236,67,233,65,230,62,230,63,221,54,210,47,199,42,187,39,174,38,160,38,147,40,133,43,117,48,99,55,109,105,111,117,112,125,112,164,16383,16383,71,38,71,35,68,29,66,26,64,22,59,18,55,14,50,12,46,10,40,10,33,11,27,13,23,17,20,22,19,28,20,35,23,40,28,44,35,46,44,47,52,46,59,45,65,43,69,41,71,38,261,20,213,68,221,81,226,93,230,105,232,118,233,132,232,146,230,158,226,170,221,182,213,194,261,243,237,267,188,219,176,226,165,232,153,235,140,238,112,238,99,236,87,232,75,226,62,219,14,267,-10,243,38,194,30,182,24,170,20,158,18,145,17,131,18,117,20,105,24,92,30,80,38,68,-10,20,14,-4,62,44,74,36,87,31,99,27,112,24,126,23,139,24,152,27,164,31,176,37,188,44,237,-4,16383,16383,199,132,195,108,185,86,169,70,149,59,126,55,102,59,82,70,66,86,55,107,51,132,55,155,66,176,81,192,101,203,124,206,148,203,168,192,184,176,195,156,199,132,256,331,158,331,158,321,174,321,181,319,186,315,190,311,191,306,191,303,190,299,188,294,187,289,184,284,128,174,69,285,67,289,65,294,64,299,63,303,63,307,64,313,67,317,73,319,83,321,95,321,95,331,-25,331,-25,321,-13,319,-3,314,7,304,18,287,32,262,80,176,8,176,8,156,92,156,95,149,95,111,8,111,8,91,95,91,95,60,94,39,91,25,84,16,72,11,55,9,55,0,177,0,177,9,161,11,150,16,142,24,138,37,137,55,137,91,224,91,224,111,137,111,137,149,141,156,
-59,18,55,14,59,0,59,0,55,14,50,12,59,0,50,12,50,-2,50,-2,50,12,46,10,50,-2,46,10,40,-3,40,-3,46,10,40,10,69,64,64,64,65,43,65,43,64,64,60,65,65,43,60,65,59,45,59,45,60,65,56,65,59,45,56,65,52,46,52,46,56,65,51,65,52,46,51,65,44,47,20,35,23,40,24,58,24,58,23,40,28,44,24,58,28,44,36,63,36,63,28,44,35,46,36,63,35,46,44,47,20,22,19,28,19,1,19,1,19,28,14,50,14,50,19,28,24,58,24,58,19,28,20,35,71,35,70,33,78,14,78,14,70,33,68,29,78,14,68,29,68,6,68,6,68,29,66,26,68,6,66,26,64,22,64,22,59,18,68,6,68,6,59,18,59,0,75,67,75,65,78,14,78,14,75,65,75,62,78,14,75,62,71,38,71,38,75,62,75,63,71,38,75,63,69,41,69,41,75,63,69,64,69,41,69,64,65,43,78,14,71,38,71,35,89,27,107,15,99,55,99,55,107,15,117,48,117,48,107,15,123,6,117,48,123,6,133,43,133,43,123,6,136,1,133,43,136,1,147,40,147,40,136,1,149,-1,147,40,149,-1,160,38,160,38,149,-1,161,-2,160,38,161,-2,174,38,174,38,161,-2,175,-1,174,38,175,-1,187,39,99,55,105,85,104,256,104,256,106,280,99,317,99,317,106,280,112,299,99,317,112,299,126,333,126,333,112,299,122,313,126,333,122,313,135,322,180,336,159,338,161,324,161,324,159,338,151,325,135,322,151,325,159,338,135,322,159,338,126,333,221,306,212,319,214,270,221,306,214,270,219,276,221,306,219,276,223,283,221,306,223,283,224,291,186,269,191,266,198,329,198,329,191,266,199,265,198,329,199,265,212,319,212,319,199,265,207,266,212,319,207,266,214,270,178,308,180,299,180,336,180,336,180,299,180,285,180,336,180,285,198,329,198,329,180,285,182,275,198,329,182,275,186,269,180,336,161,324,169,321,180,336,169,321,175,315,180,336,175,315,178,308,76,71,78,14,76,73,76,73,78,14,79,293,79,293,78,14,89,27,79,293,89,27,99,317,99,317,89,27,99,55,99,317,99,55,104,256,109,105,111,117,109,186,109,186,111,117,112,164,109,186,112,164,172,186,172,186,112,164,172,164,109,186,107,205,109,105,109,105,107,205,106,220,109,105,106,220,105,85,105,85,106,220,105,233,105,85,105,233,104,245,112,139,112,146,112,133,112,133,112,146,112,152,112,133,112,152,112,125,112,125,112,152,112,158,112,125,112,158,112,164,229,32,230,62,223,24,223,24,230,62,221,54,223,24,221,54,212,15,212,15,221,54,210,47,212,15,210,47,201,7,201,7,210,47,199,42,201,7,199,42,188,1,188,1,199,42,187,39,188,1,187,39,175,-1,245,69,244,70,245,68,245,68,244,70,244,61,244,61,244,70,243,70,244,61,243,70,242,70,240,52,244,61,242,70,240,52,242,70,240,70,240,52,240,70,238,69,240,52,238,69,236,67,240,52,236,67,235,42,235,42,236,67,233,65,235,42,233,65,230,62,235,42,230,62,229,32,79,293,66,261,68,147,79,293,68,147,71,127,79,293,71,127,73,109,79,293,73,109,75,93,79,293,75,93,76,81,79,293,76,81,76,73,66,261,61,221,62,214,66,261,62,214,62,208,66,261,62,208,63,201,66,261,63,201,64,194,66,261,64,194,65,186,66,261,65,186,65,164,66,261,65,164,68,147,76,69,75,67,78,14,76,69,78,14,76,71,65,164,65,186,12,186,65,164,12,186,12,164,33,11,27,13,28,-2,33,11,28,-2,40,-3,33,11,40,-3,40,10,28,-2,27,13,23,17,28,-2,23,17,20,22,28,-2,20,22,19,1,6,27,8,16,8,40,8,40,8,16,12,8,8,40,12,8,14,50,14,50,12,8,19,1,221,54,230,62,230,63,112,125,112,164,111,117,104,256,105,85,104,245,44,47,51,65,36,63,
-261,20,213,68,221,81,226,93,230,105,232,118,233,132,232,146,230,158,226,170,221,182,213,194,261,243,237,267,188,219,176,226,165,232,153,235,140,238,112,238,99,236,87,232,75,226,62,219,14,267,-10,243,38,194,30,182,24,170,20,158,18,145,17,131,18,117,20,105,24,92,30,80,38,68,-10,20,14,-4,62,44,74,36,87,31,99,27,112,24,126,23,139,24,152,27,164,31,176,37,188,44,237,-4,16383,16383,199,132,195,108,185,86,169,70,149,59,126,55,102,59,82,70,66,86,55,107,51,132,55,155,66,176,81,192,101,203,124,206,148,203,168,192,184,176,195,156,199,132,256,331,158,331,158,321,174,321,181,319,186,315,190,311,191,306,191,303,190,299,188,294,187,289,184,284,128,174,69,285,67,289,65,294,64,299,63,303,63,307,64,313,67,317,73,319,83,321,95,321,95,331,-25,331,-25,321,-13,319,-3,314,7,304,18,287,32,262,80,176,8,176,8,156,92,156,95,149,95,111,8,111,8,91,95,91,95,60,94,39,91,25,84,16,72,11,55,9,55,0,177,0,177,9,161,11,150,16,142,24,138,37,137,55,137,91,224,91,224,111,137,111,137,149,141,156,224,156,224,176,151,176,197,268,207,286,218,300,229,310,242,317,256,321,66,200,66,338,
-99,27,112,24,102,59,102,59,112,24,126,55,149,59,126,55,126,23,149,59,126,23,139,24,62,219,14,267,38,194,62,219,38,194,38,68,62,219,38,68,51,132,62,219,51,132,55,155,62,219,55,155,66,176,62,219,66,176,75,226,66,86,55,107,62,44,62,44,55,107,51,132,140,238,126,238,148,203,148,203,126,238,124,206,101,203,124,206,112,238,101,203,112,238,99,236,87,232,75,226,81,192,87,232,81,192,101,203,87,232,101,203,99,236,261,20,213,68,237,-4,237,-4,213,68,195,108,237,-4,195,108,188,44,188,44,195,108,185,86,188,44,185,86,176,37,176,37,185,86,169,70,176,37,169,70,164,31,164,31,169,70,152,27,149,59,139,24,152,27,149,59,152,27,169,70,195,156,199,132,213,194,195,156,213,194,237,267,237,267,213,194,261,243,165,232,168,192,176,226,176,226,168,192,184,176,176,226,184,176,188,219,188,219,184,176,195,156,188,219,195,156,237,267,153,235,140,238,148,203,153,235,148,203,168,192,153,235,168,192,165,232,213,194,213,68,221,182,221,182,213,68,221,81,221,182,221,81,226,170,226,170,221,81,226,93,226,170,226,93,230,158,230,158,226,93,230,105,230,158,230,105,232,146,232,146,230,105,232,118,232,146,232,118,233,132,213,68,213,194,199,132,213,68,199,132,195,108,126,55,112,24,126,23,126,238,112,238,124,206,99,27,102,59,87,31,87,31,102,59,82,70,87,31,82,70,74,36,74,36,82,70,66,86,74,36,66,86,62,44,38,68,14,-4,62,44,38,68,62,44,51,132,38,68,38,194,30,80,30,80,38,194,30,182,30,80,30,182,24,92,24,92,30,182,24,170,24,92,24,170,20,105,20,105,24,170,20,158,20,105,20,158,18,117,18,117,20,158,18,145,18,117,18,145,17,131,14,-4,38,68,-10,20,75,226,66,176,81,192,38,194,14,267,-10,243,
-256,331,158,331,158,321,174,321,181,319,186,315,190,311,191,306,191,303,190,299,188,294,187,289,184,284,128,174,69,285,67,289,65,294,64,299,63,303,63,307,64,313,67,317,73,319,83,321,95,321,95,331,-25,331,-25,321,-13,319,-3,314,7,304,18,287,32,262,80,176,8,176,8,156,92,156,95,149,95,111,8,111,8,91,95,91,95,60,94,39,91,25,84,16,72,11,55,9,55,0,177,0,177,9,161,11,150,16,142,24,138,37,137,55,137,91,224,91,224,111,137,111,137,149,141,156,224,156,224,176,151,176,197,268,207,286,218,300,229,310,242,317,256,321,66,200,66,338,33,338,33,200,16383,16383,66,-6,66,131,33,131,33,-6,100,257,94,262,86,276,84,284,83,292,85,304,91,314,100,321,111,326,126,328,135,327,144,324,150,321,155,316,156,311,156,310,155,309,154,307,152,306,144,298,142,293,140,289,140,284,141,277,144,271,149,266,155,263,163,262,172,263,179,267,184,272,188,280,189,289,185,305,177,318,163,329,145,336,124,338,101,335,82,327,68,314,58,297,55,277,57,262,61,248,70,235,84,220,105,202,99,202,97,203,92,203,74,200,58,191,46,179,38,162,35,143,38,121,48,100,64,79,88,57,121,32,137,20,
-32,262,80,176,32,262,32,262,80,176,63,303,32,262,63,303,63,307,63,307,64,313,32,262,91,25,84,16,177,0,177,0,84,16,72,11,177,0,72,11,55,9,95,331,-25,331,-13,319,95,331,-13,319,-3,314,95,331,-3,314,7,304,95,331,7,304,67,317,95,331,67,317,73,319,95,331,73,319,83,321,95,331,83,321,95,321,18,287,32,262,64,313,18,287,64,313,67,317,18,287,67,317,7,304,184,284,128,174,137,149,184,284,137,149,141,156,184,284,141,156,151,176,184,284,151,176,197,268,184,284,197,268,187,289,256,331,158,331,166,321,256,331,166,321,174,321,256,331,174,321,181,319,256,331,181,319,186,315,256,331,186,315,190,311,256,331,190,311,191,306,256,331,191,306,229,310,256,331,229,310,242,317,256,331,242,317,256,321,197,268,207,286,191,306,197,268,191,306,191,303,197,268,191,303,190,299,197,268,190,299,188,294,197,268,188,294,187,289,218,300,229,310,191,306,218,300,191,306,207,286,92,156,95,149,128,174,128,174,95,149,138,37,128,174,138,37,137,55,137,111,137,91,224,91,137,111,224,91,224,111,151,176,141,156,224,156,151,176,224,156,224,176,177,0,177,9,161,11,177,0,161,11,150,16,177,0,150,16,94,39,177,0,94,39,91,25,142,24,138,37,95,149,142,24,95,149,95,111,142,24,95,111,95,91,142,24,95,91,95,60,142,24,95,60,150,16,8,111,8,91,95,91,8,111,95,91,95,111,80,176,8,176,92,156,80,176,92,156,128,174,80,176,128,174,69,285,80,176,69,285,67,289,80,176,67,289,65,294,80,176,65,294,64,299,80,176,64,299,63,303,92,156,8,176,8,156,177,0,55,9,55,0,94,39,150,16,95,60,137,149,128,174,137,55,166,321,158,331,158,321,-13,319,-25,331,-25,321,
-66,200,66,338,33,338,33,200,16383,16383,66,-6,66,131,33,131,33,-6,100,257,94,262,86,276,84,284,83,292,85,304,91,314,100,321,111,326,
-33,338,33,200,66,200,33,338,66,200,66,338,33,131,33,-6,66,-6,33,131,66,-6,66,131,
-100,257,94,262,86,276,84,284,83,292,85,304,91,314,100,321,111,326,126,328,135,327,144,324,150,321,155,316,156,311,156,310,155,309,154,307,152,306,144,298,142,293,140,289,140,284,141,277,144,271,149,266,155,263,163,262,172,263,179,267,184,272,188,280,189,289,185,305,177,318,163,329,145,336,124,338,101,335,82,327,68,314,58,297,55,277,57,262,61,248,70,235,84,220,105,202,99,202,97,203,92,203,74,200,58,191,46,179,38,162,35,143,38,121,48,100,64,79,88,57,121,32,137,20,150,8,159,-2,164,-13,165,-24,163,-37,157,-48,148,-56,136,-61,122,-63,111,-62,101,-59,93,-55,88,-50,86,-45,86,-44,87,-42,90,-39,92,-38,96,-33,99,-29,103,-21,103,-17,102,-10,99,-5,93,0,87,2,79,3,70,2,63,-1,57,-7,53,-14,52,-23,55,-39,65,-53,80,-64,99,-71,121,-73,145,-70,165,-62,180,-48,190,-31,193,-10,192,4,187,17,179,30,165,45,146,63,152,63,173,65,190,73,202,86,210,102,213,123,211,139,206,154,197,170,184,185,169,200,16383,16383,187,105,185,96,180,87,172,80,163,75,152,73,141,75,129,79,116,87,101,99,84,114,75,124,69,133,65,141,62,149,61,158,63,169,68,178,75,185,84,190,95,191,106,190,118,184,132,176,146,165,161,152,170,142,177,132,183,123,186,114,187,105,158,286,157,294,153,301,148,306,141,310,133,311,125,310,118,306,113,301,110,294,108,286,109,278,113,272,118,266,125,263,132,262,140,263,148,266,153,272,157,278,158,286,16383,16383,59,286,57,294,54,301,48,306,41,310,33,311,26,310,19,306,14,301,10,294,9,286,10,278,14,272,19,266,25,263,33,262,41,263,48,266,54,272,57,278,59,286,273,124,266,124,257,108,247,95,236,87,223,82,208,80,183,84,162,95,147,113,137,138,133,169,137,197,146,221,161,240,180,252,205,256,221,254,234,249,245,240,253,227,257,211,266,211,266,247,265,249,264,250,263,252,261,254,259,255,249,259,238,262,216,266,205,266,169,262,138,248,115,227,100,199,95,165,99,133,112,107,132,87,158,75,191,70,210,71,230,74,247,78,260,82,265,86,16383,16383,361,165,352,220,329,267,292,305,246,329,193,338,137,329,89,305,52,268,28,220,19,165,28,110,52,63,89,26,136,1,190,-6,245,1,292,26,329,63,353,110,361,165,16383,16383,334,167,326,119,306,77,275,44,235,22,190,14,145,22,106,43,74,76,54,118,46,166,54,213,74,254,106,287,144,309,189,317,234,309,274,288,305,255,326,214,334,167,135,221,129,217,127,216,124,215,118,215,116,217,115,220,115,225,114,233,114,290,112,307,106,321,96,330,81,336,62,338,44,337,29,332,
-101,335,82,327,85,304,85,304,82,327,83,292,84,220,83,292,82,327,84,220,82,327,70,235,70,235,82,327,68,314,70,235,68,314,61,248,61,248,68,314,58,297,61,248,58,297,57,262,57,262,58,297,55,277,69,133,88,57,75,124,75,124,88,57,84,114,101,99,84,114,88,57,101,99,88,57,121,32,95,191,94,203,92,203,95,191,92,203,84,190,95,191,97,203,94,203,63,169,68,178,74,200,74,200,68,178,75,185,74,200,75,185,92,203,92,203,75,185,84,190,74,200,58,191,63,169,63,169,58,191,61,158,64,79,61,158,58,191,64,79,58,191,48,100,48,100,58,191,46,179,48,100,46,179,38,121,38,121,46,179,38,162,38,121,38,162,35,143,165,45,146,63,150,8,150,8,146,63,141,75,150,8,141,75,137,20,137,20,141,75,129,79,137,20,129,79,121,32,121,32,129,79,116,87,121,32,116,87,101,99,163,-37,157,-48,165,-62,165,-62,157,-48,148,-56,165,-62,148,-56,145,-70,145,-70,148,-56,136,-61,145,-70,136,-61,122,-63,122,-63,111,-62,121,-73,121,-73,111,-62,101,-59,121,-73,101,-59,99,-71,99,-71,101,-59,93,-55,99,-71,93,-55,88,-50,79,3,80,-64,87,2,87,2,80,-64,86,-45,88,-50,86,-45,80,-64,88,-50,80,-64,99,-71,144,324,145,336,135,327,135,327,145,336,126,328,111,326,126,328,124,338,111,326,124,338,101,335,101,335,85,304,91,314,101,335,91,314,100,321,101,335,100,321,111,326,152,73,146,63,152,63,152,73,152,63,173,65,152,73,141,75,146,63,180,87,172,80,173,65,173,65,172,80,163,75,173,65,163,75,152,73,118,184,132,176,169,200,169,200,132,176,146,165,169,200,146,165,161,152,161,152,170,142,169,200,169,200,170,142,184,185,213,123,211,139,210,102,210,102,211,139,206,154,210,102,206,154,202,86,202,86,206,154,197,170,202,86,197,170,190,73,190,73,197,170,187,105,190,73,187,105,185,96,190,73,185,96,180,87,177,132,183,123,184,185,184,185,183,123,186,114,184,185,186,114,197,170,197,170,186,114,187,105,106,190,118,184,169,200,106,190,169,200,105,202,106,190,105,202,102,202,106,190,102,202,99,202,106,190,99,202,97,203,106,190,97,203,95,191,100,257,94,262,105,202,100,257,105,202,169,200,94,262,90,269,105,202,105,202,90,269,86,276,105,202,86,276,84,220,84,220,86,276,84,284,84,220,84,284,83,292,193,-10,192,4,190,-31,190,-31,192,4,187,17,190,-31,187,17,180,-48,180,-48,187,17,179,30,180,-48,179,30,165,45,165,45,150,8,159,-2,165,45,159,-2,164,-13,165,45,164,-13,165,-24,165,45,165,-24,165,-62,165,45,165,-62,180,-48,163,-37,165,-62,165,-24,122,-63,121,-73,145,-70,156,311,156,310,163,262,163,262,156,310,155,309,163,262,155,309,155,263,155,263,155,309,154,307,155,263,154,307,152,306,163,329,156,311,163,262,155,316,156,311,163,329,155,316,163,329,150,321,150,321,163,329,145,336,150,321,145,336,144,324,145,336,124,338,126,328,185,305,177,318,179,267,185,305,179,267,184,272,185,305,184,272,188,280,185,305,188,280,189,289,177,318,163,329,163,262,177,318,163,262,172,263,177,318,172,263,179,267,149,266,155,263,152,306,149,266,152,306,148,302,149,266,148,302,144,298,149,266,144,298,144,271,142,293,140,289,141,277,142,293,141,277,144,271,142,293,144,271,144,298,102,-10,99,-5,99,-29,102,-10,99,-29,101,-25,102,-10,101,-25,103,-21,102,-10,103,-21,103,-17,99,-29,99,-5,96,-33,96,-33,99,-5,93,0,96,-33,93,0,92,-38,92,-38,93,0,90,-39,86,-45,86,-44,87,2,87,2,86,-44,87,-42,87,2,87,-42,93,0,93,0,87,-42,88,-41,93,0,88,-41,90,-39,70,2,63,-1,65,-53,70,2,65,-53,80,-64,70,2,80,-64,79,3,57,-7,53,-14,55,-39,57,-7,55,-39,65,-53,57,-7,65,-53,63,-1,65,141,62,149,64,79,65,141,64,79,88,57,65,141,88,57,69,133,61,158,64,79,62,149,55,-39,53,-14,52,-23,141,277,140,289,140,284,180,87,173,65,190,73,184,185,170,142,177,132,
-158,286,157,294,153,301,148,306,141,310,133,311,125,310,118,306,113,301,110,294,108,286,109,278,113,272,118,266,125,263,132,262,140,263,148,266,153,272,157,278,158,286,16383,16383,59,286,57,294,54,301,48,306,41,310,33,311,26,310,19,306,14,301,10,294,9,286,10,278,14,272,19,266,25,263,33,262,41,263,48,266,54,272,57,278,59,286,273,124,266,124,257,108,247,95,236,87,223,82,208,80,183,84,162,95,147,113,137,138,133,169,137,197,146,221,161,240,180,252,205,256,221,254,234,249,245,240,253,227,257,211,266,211,266,247,265,249,264,250,263,252,261,254,259,255,249,259,238,262,216,266,205,266,169,262,138,248,115,227,100,199,95,165,99,133,112,107,132,87,158,75,191,70,
-108,286,109,278,110,294,110,294,109,278,113,272,110,294,113,272,113,301,113,301,113,272,118,266,113,301,118,266,118,306,118,306,118,266,125,263,118,306,125,263,125,310,125,310,125,263,132,262,125,310,132,262,133,311,133,311,132,262,140,263,133,311,140,263,141,310,141,310,140,263,148,266,141,310,148,266,148,306,148,306,148,266,153,272,148,306,153,272,153,301,153,301,153,272,157,278,153,301,157,278,157,294,157,294,157,278,158,286,9,286,10,278,10,294,10,294,10,278,14,272,10,294,14,272,14,301,14,301,14,272,19,266,14,301,19,266,19,306,19,306,19,266,25,263,19,306,25,263,26,310,26,310,25,263,33,262,26,310,33,262,33,311,33,311,33,262,41,263,33,311,41,263,41,310,41,310,41,263,48,266,41,310,48,266,48,306,48,306,48,266,54,272,48,306,54,272,54,301,54,301,54,272,57,278,54,301,57,278,57,294,57,294,57,278,59,286,
-273,124,266,124,257,108,247,95,236,87,223,82,208,80,183,84,162,95,147,113,137,138,133,169,137,197,146,221,161,240,180,252,205,256,221,254,234,249,245,240,253,227,257,211,266,211,266,247,265,249,264,250,263,252,261,254,259,255,249,259,238,262,216,266,205,266,169,262,138,248,115,227,100,199,95,165,99,133,112,107,132,87,158,75,191,70,210,71,230,74,247,78,260,82,265,86,16383,16383,361,165,352,220,329,267,292,305,246,329,193,338,137,329,89,305,52,268,28,220,19,165,28,110,52,63,89,26,136,1,190,-6,245,1,292,26,329,63,353,110,361,165,16383,16383,334,167,326,119,306,77,275,44,235,22,190,14,145,22,106,43,74,76,54,118,46,166,54,213,74,254,106,287,144,309,189,317,234,309,274,288,305,255,326,214,334,167,135,221,129,217,127,216,124,215,118,215,116,217,115,220,115,225,114,233,114,290,112,307,106,321,96,330,81,336,62,338,44,337,29,332,18,325,10,316,8,305,9,300,11,295,14,292,19,290,24,289,29,290,37,294,39,298,40,301,40,303,39,304,39,307,38,309,38,313,39,316,43,319,48,322,54,324,60,324,67,323,72,321,76,316,78,310,79,303,79,288,56,279,40,273,29,268,20,263,13,257,9,253,6,248,4,243,2,231,4,220,9,210,16,203,26,199,37,197,46,198,55,200,64,205,73,211,83,219,85,210,88,204,93,200,98,198,105,197,112,197,117,199,123,202,128,206,135,212,16383,16383,79,237,79,235,78,233,77,230,76,228,74,226,64,222,60,221,56,221,52,220,46,222,41,225,37,230,34,236,33,243,35,250,39,256,
-162,95,147,113,158,75,158,75,147,113,137,138,158,75,137,138,132,87,132,87,137,138,133,169,138,248,133,169,137,197,138,248,137,197,146,221,216,266,205,266,221,254,221,254,205,266,205,256,180,252,205,256,205,266,180,252,205,266,169,262,263,252,261,254,266,211,266,211,261,254,259,255,266,211,259,255,257,211,257,211,259,255,253,227,169,262,138,248,146,221,169,262,146,221,161,240,169,262,161,240,180,252,115,227,100,199,112,107,115,227,112,107,132,87,115,227,132,87,133,169,115,227,133,169,138,248,100,199,95,165,99,133,100,199,99,133,112,107,266,124,257,108,260,82,260,82,257,108,247,95,260,82,247,95,247,78,247,78,247,95,236,87,247,78,236,87,230,74,230,74,236,87,223,82,230,74,223,82,210,71,210,71,223,82,208,80,191,70,210,71,208,80,191,70,208,80,183,84,191,70,183,84,162,95,191,70,162,95,158,75,266,211,266,247,265,249,266,211,265,249,264,250,266,211,264,250,263,252,216,266,221,254,227,264,227,264,221,254,234,249,227,264,234,249,238,262,238,262,234,249,245,240,238,262,245,240,249,259,249,259,245,240,253,227,249,259,253,227,259,255,266,124,260,82,265,86,266,124,265,86,273,124,193,338,189,317,234,309,193,338,234,309,246,329,246,329,234,309,274,288,246,329,274,288,292,305,292,305,274,288,305,255,292,305,305,255,329,267,329,267,305,255,326,214,329,267,326,214,334,167,334,167,352,220,329,267,334,167,353,110,352,220,329,63,353,110,334,167,329,63,334,167,326,119,329,63,326,119,306,77,329,63,306,77,292,26,190,14,190,-6,235,22,235,22,190,-6,245,1,235,22,245,1,275,44,275,44,245,1,292,26,275,44,292,26,306,77,54,213,74,254,89,305,89,305,74,254,106,287,89,305,106,287,137,329,137,329,106,287,144,309,137,329,144,309,193,338,193,338,144,309,189,317,28,110,52,63,28,220,28,220,52,63,46,166,52,268,46,166,54,213,52,268,54,213,89,305,145,22,106,43,136,1,145,22,136,1,190,-6,145,22,190,-6,190,14,89,26,136,1,106,43,89,26,106,43,74,76,89,26,74,76,54,118,89,26,54,118,52,63,46,166,52,63,54,118,28,110,28,220,19,165,28,220,46,166,52,268,352,220,353,110,361,165,
-135,221,129,217,127,216,124,215,118,215,116,217,115,220,115,225,114,233,114,290,112,307,106,321,96,330,81,336,62,338,44,337,29,332,18,325,10,316,8,305,9,300,11,295,14,292,19,290,24,289,29,290,37,294,39,298,40,301,40,303,39,304,39,307,38,309,38,313,39,316,43,319,48,322,54,324,60,324,67,323,72,321,76,316,78,310,79,303,79,288,56,279,40,273,29,268,20,263,13,257,9,253,6,248,4,243,2,231,4,220,9,210,16,203,26,199,37,197,46,198,55,200,64,205,73,211,83,219,85,210,88,204,93,200,98,198,105,197,112,197,117,199,123,202,128,206,135,212,16383,16383,79,237,79,235,78,233,77,230,76,228,74,226,64,222,60,221,56,221,52,220,46,222,41,225,37,230,34,236,33,243,35,250,39,256,48,262,61,269,79,276,117,113,157,77,172,64,203,33,216,21,222,17,224,17,225,18,227,19,228,20,228,22,227,26,224,31,219,39,212,49,203,60,196,70,188,80,180,91,171,102,161,113,203,166,212,178,219,187,224,194,227,199,228,203,228,205,227,207,225,208,223,208,216,204,204,193,172,163,157,150,16383,16383,21,113,61,77,76,64,107,33,120,21,126,17,128,17,129,18,131,19,132,20,132,22,131,26,128,31,123,39,116,49,107,60,100,70,92,80,65,113,107,166,116,178,123,187,128,194,131,199,132,203,132,205,131,207,129,208,127,208,120,204,108,193,76,163,61,150,276,57,276,196,24,196,24,164,243,164,243,57,142,97,142,128,20,128,20,97,283,76,283,80,276,86,268,94,252,112,244,123,216,162,230,168,241,177,249,188,254,199,256,211,253,228,246,241,233,251,217,258,
-38,309,38,310,39,298,39,298,38,310,38,311,39,298,38,311,37,294,37,294,38,311,38,313,44,337,38,313,39,316,44,337,39,316,43,319,39,305,39,307,39,298,39,305,39,298,40,301,40,301,40,302,40,303,40,301,40,303,39,304,40,301,39,304,39,305,46,198,55,200,46,222,46,222,55,200,52,220,56,221,52,220,55,200,56,221,55,200,64,205,81,336,62,338,67,323,67,323,62,338,60,324,54,324,60,324,62,338,54,324,62,338,48,322,48,322,62,338,44,337,48,322,44,337,43,319,78,233,77,230,83,219,83,219,77,230,76,228,83,219,76,228,74,226,74,226,69,224,73,211,73,211,69,224,64,222,73,211,64,222,64,205,64,205,64,222,60,221,64,205,60,221,56,221,24,289,29,290,29,332,29,332,29,290,33,292,29,332,33,292,38,313,38,313,33,292,37,294,11,295,14,292,18,325,18,325,14,292,19,290,18,325,19,290,29,332,29,332,19,290,24,289,10,316,8,305,9,300,10,316,9,300,11,295,10,316,11,295,18,325,81,336,79,276,83,219,81,336,83,219,96,330,96,330,83,219,85,210,96,330,85,210,88,204,81,336,67,323,72,321,81,336,72,321,76,316,81,336,76,316,78,310,81,336,78,310,79,303,81,336,79,303,79,276,98,198,105,197,106,321,106,321,105,197,112,197,106,321,112,197,112,307,112,307,112,197,115,225,112,307,115,225,114,233,117,199,123,202,118,215,118,215,123,202,121,215,124,215,121,215,123,202,124,215,123,202,128,206,135,221,132,219,135,212,135,212,132,219,129,217,135,212,129,217,128,206,128,206,129,217,127,216,128,206,127,216,124,215,117,199,118,215,116,217,117,199,116,217,115,220,117,199,115,220,115,225,117,199,115,225,112,197,96,330,88,204,93,200,96,330,93,200,98,198,96,330,98,198,106,321,83,219,79,276,79,237,83,219,79,237,79,235,83,219,79,235,78,233,74,226,73,211,83,219,35,250,39,256,40,273,40,273,39,256,48,262,40,273,48,262,56,279,56,279,48,262,61,269,56,279,61,269,79,288,79,288,61,269,79,276,79,288,79,276,79,303,40,273,29,268,35,250,35,250,29,268,33,243,37,197,33,243,29,268,37,197,29,268,26,199,26,199,29,268,20,263,26,199,20,263,16,203,16,203,20,263,13,257,16,203,13,257,9,253,41,225,37,230,37,197,41,225,37,197,46,198,41,225,46,198,46,222,34,236,33,243,37,197,34,236,37,197,37,230,9,210,16,203,9,253,9,210,9,253,6,248,9,210,6,248,4,243,9,210,4,243,4,220,3,237,2,231,4,220,3,237,4,220,4,243,114,233,114,290,112,307,29,332,38,313,44,337,38,309,39,298,39,307,
-117,113,157,77,172,64,203,33,216,21,222,17,224,17,225,18,227,19,228,20,228,22,227,26,224,31,219,39,212,49,203,60,196,70,188,80,180,91,171,102,161,113,203,166,212,178,219,187,224,194,227,199,228,203,228,205,227,207,225,208,223,208,216,204,204,193,172,163,157,150,16383,16383,21,113,61,77,76,64,107,33,120,21,126,17,128,17,129,18,131,19,132,20,132,22,131,26,128,31,123,39,116,49,107,60,100,70,92,80,65,113,107,166,116,178,123,187,128,194,131,199,132,203,132,205,131,207,129,208,127,208,120,204,108,193,76,163,61,150,276,57,276,196,24,196,24,164,243,164,243,57,142,97,142,128,20,128,20,97,283,76,283,80,276,86,268,94,252,112,244,123,216,162,230,168,241,177,249,188,254,199,256,211,253,228,246,241,233,251,217,258,196,260,110,260,110,252,122,251,128,248,132,244,134,237,134,98,132,91,129,87,121,85,110,84,109,76,190,76,190,84,178,85,171,87,168,92,166,100,166,157,190,157,199,143,206,133,210,127,213,121,216,116,224,101,232,90,239,82,246,77,252,76,16383,16383,166,166,166,251,185,251,199,248,210,243,217,234,221,222,222,209,221,196,216,184,209,175,
-203,60,196,70,203,60,203,60,196,70,203,33,203,60,203,33,212,49,212,49,203,33,216,21,212,49,216,21,219,39,219,39,216,21,222,17,219,39,222,17,224,31,224,31,222,17,224,17,224,31,224,17,225,18,227,26,224,31,225,18,227,26,225,18,227,19,227,26,227,19,228,20,227,26,228,20,228,22,171,102,172,64,180,91,180,91,172,64,188,48,180,91,188,48,188,80,188,80,188,48,203,33,188,80,203,33,196,70,161,113,172,163,157,150,161,113,157,150,157,77,161,113,157,77,172,64,161,113,172,64,171,102,228,205,227,207,227,199,228,205,227,199,228,203,228,205,228,203,228,204,188,178,203,166,204,193,204,193,203,166,212,178,204,193,212,178,216,204,216,204,212,178,219,187,216,204,219,187,223,208,223,208,219,187,224,194,223,208,224,194,225,208,225,208,224,194,227,199,225,208,227,199,227,207,172,163,161,113,203,166,172,163,203,166,188,178,107,60,100,70,107,33,107,60,107,33,116,49,116,49,107,33,120,21,116,49,120,21,123,39,123,39,120,21,126,17,123,39,126,17,128,31,128,31,126,17,128,17,128,31,128,17,129,18,131,26,128,31,129,18,131,26,129,18,131,19,131,26,131,19,132,20,131,26,132,20,132,22,74,102,76,64,83,91,83,91,76,64,92,48,83,91,92,48,92,80,92,80,92,48,107,33,92,80,107,33,100,70,65,113,76,163,61,150,65,113,61,150,61,77,65,113,61,77,76,64,65,113,76,64,74,102,132,205,131,207,131,199,132,205,131,199,132,203,132,205,132,203,132,204,92,178,107,166,108,193,108,193,107,166,116,178,108,193,116,178,120,204,120,204,116,178,123,187,120,204,123,187,127,208,127,208,123,187,128,194,127,208,128,194,129,208,129,208,128,194,131,199,129,208,131,199,131,207,76,163,65,113,107,166,76,163,107,166,92,178,61,77,61,150,21,113,157,77,157,150,117,113,
-276,57,276,196,24,196,24,164,243,164,243,57,142,97,142,128,20,128,20,97,283,76,283,80,
-243,164,243,57,276,57,243,164,276,57,276,196,243,164,276,196,24,196,243,164,24,196,24,164,
-142,97,142,128,20,128,20,97,283,76,283,80,276,86,268,94,
-142,97,142,128,20,128,142,97,20,128,20,97,
-283,76,283,80,276,86,268,94,252,112,244,123,216,162,230,168,241,177,249,188,254,199,256,211,253,228,246,241,233,251,217,258,196,260,110,260,110,252,122,251,128,248,132,244,134,237,134,98,132,91,129,87,121,85,110,84,109,76,190,76,190,84,178,85,171,87,168,92,166,100,166,157,190,157,199,143,206,133,210,127,213,121,216,116,224,101,232,90,239,82,246,77,252,76,16383,16383,166,166,166,251,185,251,199,248,210,243,217,234,221,222,222,209,221,196,216,184,209,175,199,168,187,166,188,166,16383,16383,361,165,352,220,329,267,292,305,246,329,193,338,137,330,89,305,52,268,28,221,19,166,28,111,51,63,88,26,135,1,190,-6,245,1,292,26,329,63,353,110,361,165,16383,16383,334,165,326,118,306,77,275,44,235,22,190,14,145,22,106,43,74,76,54,118,46,166,54,213,74,254,106,287,145,309,189,317,235,309,275,288,306,255,326,213,334,165,161,273,161,300,6,300,6,273,171,267,168,289,158,309,143,324,123,334,101,338,78,335,58,325,42,309,32,290,28,267,32,244,42,224,57,209,77,198,100,195,123,198,142,209,158,224,168,244,171,267,16383,16383,152,267,149,250,142,235,130,223,116,215,100,212,84,215,69,223,58,234,51,249,48,267,51,284,58,298,69,310,83,318,99,321,115,318,130,310,141,299,149,284,152,267,319,121,319,154,188,154,188,251,155,251,155,154,24,154,24,121,155,121,155,17,188,17,188,121,16383,16383,319,-43,319,-10,24,-10,24,-43,148,177,139,181,134,175,124,169,110,167,54,167,95,208,112,226,125,241,133,255,137,269,138,283,136,301,127,316,114,328,97,335,75,338,53,336,35,329,21,317,10,301,1,278,13,271,20,284,28,295,37,302,46,307,57,308,68,306,78,301,86,292,91,282,93,270,91,260,86,247,78,233,67,217,54,201,3,147,3,135,128,135,102,256,
-222,209,222,209,222,209,222,209,230,168,233,251,233,251,230,168,241,177,233,251,241,177,246,241,246,241,241,177,249,188,246,241,249,188,253,228,253,228,249,188,254,199,253,228,254,199,256,211,221,222,222,209,233,251,221,222,233,251,217,258,221,222,217,258,217,234,166,251,185,251,196,260,196,260,185,251,199,248,196,260,199,248,217,258,217,258,199,248,210,243,217,258,210,243,217,234,134,226,168,92,166,100,134,226,166,100,166,111,166,166,166,157,190,157,166,166,190,157,187,166,187,166,190,157,188,166,187,166,188,166,199,168,199,168,188,166,190,157,199,168,190,157,199,143,166,251,196,260,132,244,166,251,132,244,134,237,166,251,134,237,134,226,166,251,134,226,166,111,196,260,110,260,122,251,196,260,122,251,128,248,196,260,128,248,132,244,213,121,216,162,216,184,216,184,216,162,230,168,216,184,230,168,221,196,221,196,230,168,222,209,213,121,216,184,210,127,210,127,216,184,209,175,210,127,209,175,206,133,206,133,209,175,199,168,206,133,199,168,199,143,232,90,239,82,244,123,244,123,239,82,246,77,244,123,246,77,252,112,252,112,246,77,252,76,252,112,252,76,260,103,260,103,252,76,283,76,260,103,283,76,268,94,268,94,283,76,276,86,244,123,216,162,216,116,244,123,216,116,224,101,244,123,224,101,232,90,190,76,190,84,178,85,190,76,178,85,171,87,190,76,171,87,134,108,190,76,134,108,134,98,190,76,134,98,132,91,190,76,132,91,129,87,190,76,129,87,121,85,190,76,121,85,110,84,190,76,110,84,109,76,134,111,134,108,171,87,134,111,171,87,168,92,134,111,168,92,134,226,193,338,189,317,235,309,193,338,235,309,246,329,246,329,235,309,275,288,246,329,275,288,292,305,292,305,275,288,306,255,292,305,306,255,329,267,329,267,306,255,326,213,329,267,326,213,334,165,334,165,352,220,329,267,334,165,353,110,352,220,329,63,353,110,334,165,329,63,334,165,326,118,329,63,326,118,306,77,329,63,306,77,292,26,190,14,190,-6,235,22,235,22,190,-6,245,1,235,22,245,1,275,44,275,44,245,1,292,26,275,44,292,26,306,77,54,213,74,254,89,305,89,305,74,254,106,287,89,305,106,287,137,330,137,330,106,287,145,309,137,330,145,309,193,338,193,338,145,309,189,317,28,111,51,63,28,221,28,221,51,63,46,166,52,268,46,166,54,213,52,268,54,213,89,305,145,22,106,43,135,1,145,22,135,1,190,-6,145,22,190,-6,190,14,88,26,135,1,106,43,88,26,106,43,74,76,88,26,74,76,54,118,88,26,54,118,51,63,46,166,51,63,54,118,28,111,28,221,19,166,28,221,46,166,52,268,352,220,353,110,361,165,216,116,216,162,213,121,276,86,283,76,283,80,122,251,110,260,110,252,
-161,273,161,300,6,300,6,273,171,267,168,289,158,309,143,324,
-161,273,161,300,6,300,161,273,6,300,6,273,
-171,267,168,289,158,309,143,324,123,334,101,338,78,335,58,325,42,309,32,290,28,267,32,244,42,224,57,209,77,198,100,195,123,198,142,209,158,224,168,244,171,267,16383,16383,152,267,149,250,142,235,130,223,116,215,100,212,84,215,69,223,58,234,51,249,48,267,51,284,58,298,69,310,83,318,99,321,115,318,130,310,141,299,149,284,152,267,319,121,319,154,188,154,188,251,155,251,155,154,24,154,24,121,155,121,155,17,188,17,188,121,16383,16383,319,-43,319,-10,24,-10,24,-43,148,177,139,181,134,175,124,169,110,167,54,167,95,208,112,226,125,241,133,255,137,269,138,283,136,301,127,316,114,328,97,335,75,338,53,336,35,329,21,317,10,301,1,278,13,271,20,284,28,295,37,302,
-83,318,99,321,99,321,101,338,99,321,115,318,101,338,115,318,123,334,123,334,115,318,130,310,123,334,130,310,143,324,143,324,130,310,141,299,143,324,141,299,149,284,171,267,168,289,168,244,168,244,168,289,158,309,168,244,158,309,158,224,158,224,158,309,152,267,158,224,152,267,149,250,158,224,149,250,142,209,142,209,149,250,142,235,142,209,142,235,130,223,158,309,143,324,149,284,158,309,149,284,152,267,142,209,130,223,123,198,123,198,130,223,116,215,123,198,116,215,100,195,100,195,116,215,100,212,58,298,69,310,78,335,78,335,69,310,83,318,78,335,83,318,101,338,101,338,83,318,99,321,42,309,48,267,51,284,42,309,51,284,58,325,58,325,51,284,58,298,58,325,58,298,78,335,84,215,69,223,77,198,84,215,77,198,100,195,84,215,100,195,100,212,48,267,42,224,51,249,51,249,42,224,57,209,51,249,57,209,58,234,58,234,57,209,77,198,58,234,77,198,69,223,28,267,32,244,32,290,32,290,32,244,42,224,32,290,42,224,42,309,42,309,42,224,48,267,
-319,121,319,154,188,154,188,251,155,251,155,154,24,154,24,121,155,121,155,17,188,17,188,121,16383,16383,319,-43,319,-10,24,-10,24,-43,148,177,139,181,134,175,124,169,110,167,54,167,95,208,112,226,125,241,133,255,137,269,138,283,136,301,127,316,114,328,97,335,75,338,
-188,251,155,251,188,17,188,17,155,251,155,154,188,17,155,154,155,121,155,121,155,154,24,154,155,121,24,154,24,121,188,121,319,121,188,154,24,-10,24,-43,319,-43,24,-10,319,-43,319,-10,188,154,319,121,319,154,188,17,155,121,155,17,
-148,177,139,181,134,175,124,169,110,167,54,167,95,208,112,226,125,241,133,255,137,269,138,283,136,301,127,316,114,328,97,335,75,338,53,336,35,329,21,317,10,301,1,278,13,271,20,284,28,295,37,302,46,307,57,308,68,306,78,301,86,292,91,282,93,270,91,260,86,247,78,233,67,217,54,201,3,147,3,135,128,135,102,256,114,263,123,271,129,279,131,288,132,296,130,310,122,321,110,330,95,336,78,338,61,336,46,331,33,322,22,309,11,291,23,281,31,293,39,301,47,306,56,309,66,310,76,309,83,306,89,301,93,295,94,286,92,276,87,267,78,259,65,252,46,244,46,230,52,231,59,231,60,232,76,230,88,225,97,216,103,205,105,190,
-54,201,3,147,54,167,54,201,54,167,95,208,54,201,95,208,67,217,13,271,20,284,21,317,21,317,20,284,28,295,21,317,28,295,35,329,35,329,28,295,37,302,35,329,37,302,53,336,53,336,37,302,46,307,53,336,46,307,57,308,57,308,68,306,75,338,75,338,68,306,78,301,75,338,78,301,97,335,97,335,78,301,86,292,97,335,86,292,91,282,10,301,1,278,13,271,10,301,13,271,21,317,91,260,95,208,93,270,93,270,95,208,97,335,97,335,95,208,112,226,97,335,112,226,114,328,114,328,112,226,125,241,114,328,125,241,127,316,127,316,125,241,133,255,127,316,133,255,136,301,136,301,133,255,137,269,136,301,137,269,138,283,97,335,91,282,93,270,75,338,53,336,57,308,95,208,91,260,86,247,95,208,86,247,78,233,95,208,78,233,67,217,129,172,124,169,128,135,128,135,124,169,117,168,128,135,117,168,110,167,128,135,110,167,54,167,128,135,54,167,3,147,148,177,139,181,134,175,148,177,134,175,129,172,148,177,129,172,128,135,128,135,3,147,3,135,
-102,256,114,263,123,271,129,279,131,288,132,296,130,310,122,321,110,330,95,336,78,338,61,336,46,331,33,322,22,309,11,291,23,281,31,293,39,301,47,306,56,309,66,310,76,309,83,306,89,301,93,295,94,286,92,276,87,267,78,259,65,252,46,244,46,230,52,231,59,231,60,232,76,230,88,225,97,216,103,205,105,190,103,179,99,169,92,162,82,157,71,155,66,155,61,156,57,158,52,161,40,169,32,173,28,174,25,175,19,174,14,172,10,169,8,165,7,159,9,150,15,142,25,136,37,132,52,131,83,134,109,144,129,159,141,177,146,200,144,214,139,227,130,239,118,248,102,254,46,253,66,253,143,302,149,306,153,310,156,314,158,318,158,329,155,333,152,336,147,338,141,339,133,337,129,335,125,332,120,328,215,225,171,225,171,57,164,46,155,38,144,31,131,27,116,26,102,28,90,34,81,45,76,59,74,78,74,225,30,225,30,27,29,14,26,-5,22,-28,19,-51,18,-69,19,-82,22,-93,26,-101,32,-106,40,-108,48,-106,55,-102,60,-94,63,-83,64,-69,62,-51,58,-29,52,-6,48,14,46,32,55,18,66,8,77,1,91,-3,107,-4,123,-2,137,2,150,11,162,24,172,40,174,40,176,24,182,11,191,2,201,-2,211,-4,222,-3,231,0,239,4,247,12,256,23,256,28,
-66,155,61,156,83,134,83,134,61,156,57,158,83,134,57,158,52,131,52,131,57,158,52,161,52,131,52,161,46,165,56,231,59,231,65,252,65,252,59,231,60,232,60,232,76,230,65,252,65,252,76,230,78,259,65,252,46,244,52,231,65,252,52,231,56,231,23,281,31,293,33,322,33,322,31,293,39,301,33,322,39,301,46,331,46,331,39,301,47,306,46,331,47,306,61,336,61,336,47,306,56,309,61,336,56,309,66,310,66,310,76,309,78,338,78,338,76,309,83,306,78,338,83,306,95,336,95,336,83,306,89,301,95,336,89,301,93,295,22,309,11,291,23,281,22,309,23,281,33,322,103,179,99,169,109,144,109,144,99,169,92,162,109,144,92,162,83,134,83,134,92,162,82,157,83,134,82,157,71,155,71,155,66,155,83,134,95,336,94,286,97,216,95,336,97,216,110,330,110,330,97,216,102,256,110,330,102,256,114,263,78,338,61,336,66,310,130,310,122,321,123,271,130,310,123,271,129,279,130,310,129,279,131,288,130,310,131,288,132,296,122,321,110,330,114,263,122,321,114,263,123,271,102,254,102,256,97,216,102,254,97,216,103,205,102,254,103,205,118,248,92,276,87,267,88,225,92,276,88,225,97,216,92,276,97,216,94,286,78,259,76,230,88,225,78,259,88,225,87,267,141,177,146,200,144,214,141,177,144,214,139,227,141,177,139,227,130,239,141,177,130,239,129,159,103,179,109,144,105,190,105,190,109,144,118,248,118,248,109,144,129,159,118,248,129,159,130,239,105,190,118,248,103,205,40,169,36,171,37,132,40,169,37,132,52,131,40,169,52,131,46,165,37,132,36,171,32,173,37,132,32,173,28,174,37,132,28,174,25,175,37,132,25,175,25,136,19,174,14,172,15,142,19,174,15,142,25,136,19,174,25,136,25,175,10,169,8,165,9,150,10,169,9,150,15,142,10,169,15,142,14,172,52,231,46,244,46,230,9,150,8,165,7,159,95,336,93,295,94,286,
-46,253,66,253,143,302,149,306,153,310,156,314,158,318,158,329,155,333,152,336,147,338,141,339,133,337,129,335,125,332,120,328,215,225,171,225,171,57,164,46,155,38,144,31,131,27,116,26,102,28,90,34,81,45,76,59,74,78,74,225,30,225,30,27,
-141,339,143,302,147,338,147,338,143,302,149,306,147,338,149,306,152,336,152,336,149,306,153,310,152,336,153,310,155,333,155,333,153,310,156,314,155,333,156,314,158,329,158,329,156,314,158,318,158,329,158,318,158,323,143,302,141,339,137,338,143,302,137,338,133,337,143,302,133,337,129,335,143,302,129,335,125,332,143,302,125,332,120,328,143,302,120,328,66,253,66,253,120,328,46,253,
-215,225,171,225,171,57,164,46,155,38,144,31,131,27,116,26,102,28,90,34,81,45,76,59,74,78,74,225,30,225,30,27,29,14,26,-5,22,-28,19,-51,18,-69,19,-82,22,-93,26,-101,32,-106,40,-108,48,-106,55,-102,60,-94,63,-83,64,-69,62,-51,58,-29,52,-6,48,14,46,32,55,18,66,8,77,1,91,-3,107,-4,123,-2,137,2,150,11,162,24,172,40,174,40,176,24,182,11,191,2,201,-2,211,-4,222,-3,231,0,239,4,247,12,256,23,256,28,249,22,244,18,239,15,235,14,230,13,224,15,220,19,217,26,215,36,215,48,266,-76,266,-65,247,-62,234,-58,227,-50,223,-38,222,-20,222,271,223,290,227,304,234,313,247,318,266,321,266,331,134,331,95,327,66,316,46,297,34,270,30,235,34,199,46,172,66,154,93,142,127,137,127,-14,126,-35,123,-49,115,-58,102,-63,83,-65,83,-76,160,-76,160,320,189,320,189,-76,16383,16383,127,147,105,153,88,164,77,182,70,206,68,237,70,266,75,289,86,305,103,315,127,320,90,127,89,135,85,143,79,149,71,154,63,155,54,154,46,150,40,144,37,136,35,127,37,118,40,111,46,105,54,101,63,99,71,101,79,105,85,111,89,118,
-46,32,46,32,46,32,46,32,74,225,30,225,46,32,30,225,32,-106,46,32,32,-106,40,-108,46,32,40,-108,48,-106,76,59,74,78,77,1,77,1,74,78,66,8,66,8,74,78,74,225,66,8,74,225,55,18,55,18,74,225,46,32,30,225,30,27,32,-106,32,-106,30,27,29,14,32,-106,29,14,26,-101,26,-101,29,14,26,-5,26,-101,26,-5,22,-28,18,-69,19,-82,19,-51,19,-51,19,-82,22,-93,19,-51,22,-93,22,-28,22,-28,22,-93,26,-101,171,225,171,57,172,40,172,40,171,57,164,46,172,40,164,46,162,24,162,24,164,46,155,38,162,24,155,38,150,11,150,11,155,38,144,31,150,11,144,31,137,2,137,2,144,31,131,27,137,2,131,27,123,-2,123,-2,131,27,116,26,123,-2,116,26,107,-4,107,-4,116,26,102,28,107,-4,102,28,91,-3,91,-3,102,28,90,34,91,-3,90,34,81,45,81,45,76,59,77,1,81,45,77,1,91,-3,215,225,171,225,172,40,215,225,172,40,174,40,215,225,174,40,176,24,215,225,176,24,182,11,215,225,182,11,191,2,215,225,191,2,201,-2,215,225,201,-2,211,-4,215,225,211,-4,215,48,249,22,244,18,247,12,247,12,244,18,239,15,247,12,239,15,239,4,239,4,239,15,235,14,239,4,235,14,231,0,231,0,235,14,230,13,249,22,247,12,256,23,249,22,256,23,256,28,224,15,220,19,222,-3,224,15,222,-3,231,0,224,15,231,0,230,13,215,48,211,-4,215,36,215,36,211,-4,222,-3,215,36,222,-3,217,26,217,26,222,-3,220,19,48,14,48,-106,52,-6,52,-6,48,-106,55,-102,52,-6,55,-102,58,-29,58,-29,55,-102,60,-94,58,-29,60,-94,62,-51,62,-51,60,-94,63,-83,62,-51,63,-83,64,-69,46,32,48,-106,48,14,
-266,-76,266,-65,247,-62,234,-58,227,-50,223,-38,222,-20,222,271,223,290,227,304,234,313,247,318,266,321,266,331,134,331,95,327,66,316,46,297,34,270,30,235,34,199,46,172,66,154,93,142,127,137,127,-14,126,-35,123,-49,115,-58,102,-63,83,-65,83,-76,160,-76,160,320,189,320,189,-76,16383,16383,127,147,105,153,88,164,77,182,70,206,68,237,70,266,75,289,86,305,103,315,127,320,90,127,89,135,85,143,79,149,71,154,63,155,54,154,46,150,40,144,37,136,35,127,37,118,40,111,46,105,54,101,63,99,71,101,79,105,85,111,89,118,90,127,87,0,70,0,49,-49,52,-51,55,-50,57,-50,60,-49,66,-49,76,-50,84,-52,89,-55,92,-60,93,-67,92,-74,88,-81,83,-85,75,-88,65,-89,59,-89,47,-87,40,-86,33,-83,26,-98,35,-102,51,-106,59,-106,68,-107,
-123,-49,115,-58,160,-76,160,-76,115,-58,102,-63,160,-76,102,-63,83,-65,134,331,95,327,103,315,134,331,103,315,127,320,134,331,127,320,127,137,134,331,127,137,160,-76,134,331,160,-76,160,320,134,331,160,320,266,331,127,320,127,147,127,137,105,153,88,164,93,142,93,142,88,164,77,182,93,142,77,182,66,154,66,154,77,182,70,206,66,154,70,206,68,237,68,237,70,266,66,316,66,316,70,266,75,289,66,316,75,289,95,327,95,327,75,289,86,305,95,327,86,305,103,315,66,316,46,297,46,172,66,316,46,172,66,154,66,316,66,154,68,237,247,318,266,321,266,331,247,318,266,331,234,313,234,313,266,331,189,320,234,313,189,320,227,304,227,304,189,320,223,290,234,-58,227,-50,189,-76,189,-76,227,-50,223,-38,189,-76,223,-38,189,320,189,320,223,-38,222,-20,189,320,222,-20,222,271,160,-76,127,137,127,-14,160,-76,127,-14,126,-35,160,-76,126,-35,123,-49,266,-76,266,-65,247,-62,266,-76,247,-62,234,-58,266,-76,234,-58,189,-76,105,153,93,142,127,137,105,153,127,137,127,147,34,199,46,172,46,297,34,199,46,297,34,270,34,199,34,270,30,235,160,-76,83,-65,83,-76,266,331,160,320,189,320,223,290,189,320,222,271,
-90,127,89,135,85,143,79,149,71,154,63,155,54,154,46,150,40,144,37,136,35,127,37,118,40,111,46,105,54,101,63,99,71,101,79,105,85,111,89,118,90,127,87,0,70,0,49,-49,52,-51,55,-50,57,-50,60,-49,66,-49,76,-50,84,-52,89,-55,92,-60,93,-67,92,-74,88,-81,83,-85,75,-88,65,-89,59,-89,47,-87,40,-86,
-35,127,37,118,37,136,37,136,37,118,40,111,37,136,40,111,40,144,40,144,40,111,46,105,40,144,46,105,46,150,46,150,46,105,54,101,46,150,54,101,54,154,54,154,54,101,62,99,54,154,62,99,63,155,63,155,62,99,71,101,63,155,71,101,71,154,71,154,71,101,79,105,71,154,79,105,79,149,79,149,79,105,85,111,79,149,85,111,85,143,85,143,85,111,89,118,85,143,89,118,89,135,89,135,89,118,90,127,
-87,0,70,0,49,-49,52,-51,55,-50,57,-50,60,-49,66,-49,76,-50,84,-52,89,-55,92,-60,93,-67,92,-74,88,-81,83,-85,75,-88,65,-89,59,-89,47,-87,40,-86,33,-83,26,-98,35,-102,51,-106,59,-106,68,-107,89,-105,107,-99,120,-91,128,-79,131,-64,129,-52,123,-43,114,-36,102,-32,88,-30,80,-30,77,-31,75,-31,124,135,124,147,113,148,105,150,99,154,96,159,95,166,95,336,89,338,30,310,30,299,36,302,41,304,45,305,52,305,54,301,55,297,55,157,52,153,47,150,40,148,28,147,28,135,152,271,148,293,139,312,123,326,103,335,79,338,54,335,33,325,17,310,6,291,3,267,6,244,16,225,32,210,52,200,75,197,100,201,
-59,-106,68,-107,59,-89,59,-89,68,-107,65,-89,75,-88,65,-89,68,-107,75,-88,68,-107,89,-105,57,-50,60,-49,70,0,70,0,60,-49,63,-49,70,0,63,-49,66,-49,66,-49,76,-50,70,0,70,0,76,-50,75,-31,70,0,75,-31,87,0,70,0,49,-49,52,-51,70,0,52,-51,55,-50,70,0,55,-50,57,-50,131,-64,129,-52,128,-79,128,-79,129,-52,123,-43,128,-79,123,-43,120,-91,120,-91,123,-43,114,-36,120,-91,114,-36,107,-99,107,-99,114,-36,102,-32,107,-99,102,-32,93,-67,93,-67,102,-32,92,-60,89,-55,92,-60,102,-32,89,-55,102,-32,88,-30,89,-55,88,-30,85,-30,89,-55,85,-30,84,-52,84,-52,85,-30,82,-30,84,-52,82,-30,80,-30,84,-52,80,-30,77,-31,84,-52,77,-31,76,-50,107,-99,93,-67,92,-74,107,-99,92,-74,89,-105,89,-105,92,-74,88,-81,89,-105,88,-81,83,-85,33,-83,35,-102,40,-86,40,-86,35,-102,43,-104,40,-86,43,-104,47,-87,47,-87,43,-104,51,-106,47,-87,51,-106,53,-88,53,-88,51,-106,59,-106,53,-88,59,-106,59,-89,35,-102,33,-83,26,-98,75,-88,89,-105,83,-85,75,-31,76,-50,77,-31,
-124,135,124,147,113,148,105,150,99,154,96,159,95,166,95,336,89,338,30,310,30,299,36,302,41,304,45,305,52,305,54,301,55,297,55,157,52,153,47,150,40,148,28,147,28,135,152,271,148,293,139,312,123,326,103,335,79,338,54,335,33,325,17,310,6,291,3,267,6,244,16,225,32,210,52,200,75,197,100,201,121,211,138,227,148,247,152,271,16383,16383,116,258,
-52,153,47,150,124,135,124,135,47,150,40,148,124,135,40,148,28,147,41,304,45,305,89,338,89,338,45,305,48,305,89,338,48,305,50,305,50,305,52,305,89,338,89,338,52,305,53,303,89,338,53,303,54,301,113,148,105,150,124,135,124,135,105,150,99,154,124,135,99,154,55,164,55,164,99,154,96,159,55,164,96,159,55,291,55,297,55,291,89,338,55,297,89,338,54,301,36,302,41,304,89,338,36,302,89,338,30,310,36,302,30,310,30,299,95,166,95,336,89,338,95,166,89,338,55,291,95,166,55,291,96,159,55,157,52,153,124,135,55,157,124,135,55,164,124,135,28,147,28,135,113,148,124,135,124,147,
-152,271,148,293,139,312,123,326,103,335,79,338,54,335,33,325,17,310,6,291,3,267,6,244,16,225,32,210,52,200,75,197,100,201,121,211,138,227,148,247,152,271,16383,16383,116,258,114,242,110,230,102,221,93,216,80,214,73,214,66,216,56,224,52,230,44,250,42,261,40,273,40,285,41,297,46,307,53,315,63,320,74,321,88,318,99,310,108,297,114,279,116,258,229,111,189,147,174,161,143,192,130,204,124,208,122,208,121,207,119,206,118,204,118,203,119,199,122,193,127,185,134,176,143,165,150,155,158,145,167,134,176,122,185,111,143,58,134,47,127,38,122,31,119,25,118,22,118,19,119,18,121,17,123,17,130,21,142,32,158,46,174,61,189,75,16383,16383,132,111,92,147,62,177,46,192,34,204,27,208,26,208,24,207,23,206,
-44,250,52,200,48,240,48,240,52,200,52,230,56,224,52,230,52,200,56,224,52,200,75,197,42,261,40,273,33,325,42,261,33,325,32,210,42,261,32,210,52,200,42,261,52,200,44,250,33,325,40,285,41,297,33,325,41,297,54,335,54,335,41,297,46,307,54,335,46,307,53,315,3,267,6,244,6,291,6,291,6,244,16,225,6,291,16,225,17,310,17,310,16,225,32,210,17,310,32,210,33,325,103,335,79,338,88,318,88,318,79,338,74,321,63,320,74,321,79,338,63,320,79,338,54,335,114,242,110,230,121,211,121,211,110,230,102,221,121,211,102,221,100,201,100,201,102,221,93,216,100,201,93,216,80,214,80,214,73,214,75,197,75,197,73,214,66,216,75,197,66,216,61,220,152,271,148,293,148,247,148,247,148,293,139,312,148,247,139,312,138,227,138,227,139,312,123,326,138,227,123,326,121,211,121,211,123,326,116,258,88,318,99,310,103,335,103,335,99,310,108,297,103,335,108,297,123,326,123,326,108,297,114,279,123,326,114,279,116,258,80,214,75,197,100,201,54,335,53,315,63,320,114,242,121,211,116,258,56,224,75,197,61,220,33,325,40,273,40,285,
-229,111,189,147,174,161,143,192,130,204,124,208,122,208,121,207,119,206,118,204,118,203,119,199,122,193,127,185,134,176,143,165,150,155,158,145,167,134,176,122,185,111,143,58,134,47,127,38,122,31,119,25,118,22,118,19,119,18,121,17,123,17,130,21,142,32,158,46,174,61,189,75,16383,16383,132,111,92,147,62,177,46,192,34,204,27,208,26,208,24,207,23,206,22,204,22,203,23,199,26,193,31,185,38,176,46,165,53,155,61,145,70,134,79,122,89,111,46,58,38,47,31,38,26,31,23,25,22,22,22,19,23,18,25,17,27,17,33,21,45,32,61,46,77,61,92,75,357,45,357,74,329,74,329,203,305,203,204,70,204,45,294,45,294,0,329,0,329,45,16383,16383,294,74,227,74,294,163,16383,16383,316,338,293,338,66,-6,91,-6,16383,16383,112,135,112,147,100,148,92,150,87,154,84,159,83,166,83,336,76,338,22,310,22,299,29,302,34,304,38,305,45,305,47,301,47,157,44,153,40,150,32,148,21,147,21,135,371,42,362,46,357,40,352,36,346,34,340,33,333,32,276,32,318,73,335,91,347,106,355,120,360,134,361,148,358,166,350,181,337,193,320,200,298,203,275,201,257,194,243,182,232,165,223,143,235,136,243,149,251,159,259,167,269,171,280,173,
-92,75,132,111,92,147,92,75,92,147,89,111,92,75,89,111,77,61,53,155,61,145,62,177,62,177,61,145,70,134,62,177,70,134,78,161,78,161,70,134,79,122,78,161,79,122,92,147,92,147,79,122,89,111,53,155,62,177,46,165,46,165,62,177,46,192,46,165,46,192,38,176,38,176,46,192,34,204,38,176,34,204,31,185,31,185,34,204,27,208,31,185,27,208,26,193,26,193,27,208,26,208,26,193,26,208,24,207,23,206,22,204,23,199,23,206,23,199,26,193,23,206,26,193,24,207,189,75,229,111,189,147,189,75,189,147,185,111,189,75,185,111,174,61,150,155,158,145,158,177,158,177,158,145,167,134,158,177,167,134,174,161,174,161,167,134,176,122,174,161,176,122,189,147,189,147,176,122,185,111,150,155,158,177,143,165,143,165,158,177,143,192,143,165,143,192,134,176,134,176,143,192,130,204,134,176,130,204,127,185,127,185,130,204,124,208,127,185,124,208,122,208,122,193,127,185,122,208,122,193,122,208,121,207,122,193,121,207,119,206,122,193,119,206,119,199,118,204,118,203,119,199,118,204,119,199,119,206,119,18,121,17,122,31,122,31,121,17,123,17,122,31,123,17,127,38,127,38,123,17,130,21,127,38,130,21,134,47,134,47,130,21,142,32,134,47,142,32,143,58,143,58,142,32,158,46,143,58,158,46,185,111,185,111,158,46,174,61,119,25,118,22,118,20,119,25,118,20,118,19,119,25,118,19,119,18,119,25,119,18,122,31,23,18,25,17,26,31,26,31,25,17,27,17,26,31,27,17,31,38,31,38,27,17,33,21,31,38,33,21,38,47,38,47,33,21,45,32,38,47,45,32,46,58,46,58,45,32,61,46,46,58,61,46,89,111,89,111,61,46,77,61,23,25,22,22,22,20,23,25,22,20,22,19,23,25,22,19,23,18,23,25,23,18,26,31,23,199,22,204,22,203,
-357,45,357,74,329,74,329,203,305,203,204,70,204,45,294,45,294,0,329,0,329,45,16383,16383,294,74,227,74,294,163,16383,16383,316,338,293,338,66,-6,91,-6,16383,16383,112,135,112,147,100,148,92,150,87,154,84,159,83,166,83,336,76,338,22,310,22,299,29,302,34,304,38,305,45,305,47,301,47,157,44,153,40,150,32,148,21,147,21,135,371,42,362,46,357,40,352,36,346,34,340,33,333,32,276,32,318,73,335,91,347,106,355,120,360,134,361,148,358,166,350,181,337,193,320,200,298,203,275,201,257,194,243,182,232,165,223,143,235,136,243,149,251,159,259,167,269,171,280,173,291,171,301,166,308,158,313,147,315,135,313,125,308,112,301,98,290,82,276,66,225,12,225,0,351,0,
-204,45,294,45,204,70,204,70,294,45,227,74,204,70,227,74,305,203,305,203,227,74,294,163,305,203,294,163,329,0,329,0,294,163,294,74,329,0,294,74,294,45,294,45,294,74,227,74,305,203,329,0,329,203,329,74,329,45,357,45,329,74,357,45,357,74,293,338,66,-6,91,-6,293,338,91,-6,316,338,44,153,40,150,112,135,112,135,40,150,32,148,112,135,32,148,21,147,34,304,38,305,76,338,76,338,38,305,41,305,76,338,41,305,43,305,43,305,45,305,76,338,76,338,45,305,46,303,76,338,46,303,47,301,100,148,92,150,112,135,112,135,92,150,87,154,112,135,87,154,47,164,47,164,87,154,84,159,47,164,84,159,47,291,47,297,47,291,76,338,47,297,76,338,47,301,29,302,34,304,76,338,29,302,76,338,22,310,29,302,22,310,22,299,83,166,83,336,76,338,83,166,76,338,47,291,83,166,47,291,84,159,47,157,44,153,112,135,47,157,112,135,47,164,112,135,21,147,21,135,100,148,112,135,112,147,329,0,294,45,294,0,
-371,42,362,46,357,40,352,36,346,34,340,33,333,32,276,32,318,73,335,91,347,106,355,120,360,134,361,148,358,166,350,181,337,193,320,200,298,203,275,201,257,194,243,182,232,165,223,143,235,136,243,149,251,159,259,167,269,171,280,173,291,171,301,166,308,158,313,147,315,135,313,125,308,112,301,98,290,82,276,66,225,12,225,0,351,0,16383,16383,297,338,275,338,48,-6,73,-6,16383,16383,108,135,108,147,97,148,89,150,84,154,81,159,80,166,80,336,73,338,19,310,19,299,26,302,31,304,35,305,42,305,44,301,44,297,45,291,45,164,44,157,41,153,37,150,29,148,18,147,18,135,359,45,359,74,331,74,331,203,308,203,206,70,206,45,296,45,296,0,331,0,331,45,16383,16383,296,74,229,74,296,163,16383,16383,319,338,296,338,69,-6,94,-6,16383,16383,102,256,114,263,123,271,129,279,131,288,132,296,130,310,122,321,110,330,95,336,78,338,61,336,46,331,33,322,22,309,11,291,23,281,31,293,39,301,47,306,56,309,66,310,76,309,83,306,89,301,93,295,94,286,92,276,87,267,78,259,65,252,46,244,46,230,52,231,59,231,60,232,76,230,88,225,97,216,103,205,105,190,103,179,99,169,92,162,82,157,71,155,66,155,61,156,57,158,52,161,40,169,32,173,28,174,
-308,112,301,98,318,73,318,73,301,98,290,82,318,73,290,82,276,66,276,66,225,12,276,32,276,32,225,12,351,0,276,32,351,0,333,32,340,33,333,32,351,0,340,33,351,0,346,34,346,34,351,0,352,36,235,136,243,149,243,182,243,182,243,149,251,159,243,182,251,159,257,194,257,194,251,159,259,167,257,194,259,167,275,201,275,201,259,167,269,171,275,201,269,171,280,173,280,173,291,171,298,203,298,203,291,171,301,166,298,203,301,166,320,200,320,200,301,166,308,158,320,200,308,158,313,147,232,165,223,143,235,136,232,165,235,136,243,182,371,42,362,46,357,40,371,42,357,40,352,36,371,42,352,36,351,0,275,338,48,-6,73,-6,275,338,73,-6,297,338,41,153,37,150,108,135,108,135,37,150,29,148,108,135,29,148,18,147,31,304,35,305,73,338,73,338,35,305,38,305,73,338,38,305,40,305,40,305,42,305,73,338,73,338,42,305,43,303,73,338,43,303,44,301,97,148,89,150,108,135,108,135,89,150,84,154,108,135,84,154,45,164,45,164,84,154,81,159,45,164,81,159,45,291,44,297,45,291,73,338,44,297,73,338,44,301,26,302,31,304,73,338,26,302,73,338,19,310,26,302,19,310,19,299,80,166,80,336,73,338,80,166,73,338,45,291,80,166,45,291,81,159,313,125,318,73,315,135,315,135,318,73,320,200,320,200,318,73,335,91,320,200,335,91,337,193,337,193,335,91,347,106,337,193,347,106,350,181,350,181,347,106,355,120,350,181,355,120,358,166,358,166,355,120,360,134,358,166,360,134,361,148,320,200,313,147,315,135,298,203,275,201,280,173,276,66,276,32,318,73,44,157,41,153,108,135,44,157,108,135,45,164,108,135,18,147,18,135,97,148,108,135,108,147,308,112,318,73,313,125,351,0,225,12,225,0,
-359,45,359,74,331,74,331,203,308,203,206,70,206,45,296,45,296,0,331,0,331,45,16383,16383,296,74,229,74,296,163,16383,16383,319,338,296,338,69,-6,94,-6,16383,16383,102,256,114,263,123,271,129,279,131,288,132,296,130,310,122,321,110,330,95,336,78,338,61,336,46,331,33,322,22,309,11,291,23,281,31,293,39,301,47,306,56,309,66,310,76,309,83,306,89,301,93,295,94,286,92,276,87,267,78,259,65,252,46,244,46,230,52,231,59,231,60,232,76,230,88,225,97,216,103,205,105,190,103,179,99,169,92,162,82,157,71,155,66,155,61,156,57,158,52,161,40,169,32,173,28,174,25,175,19,174,14,172,10,169,8,165,7,159,9,150,15,142,25,136,37,132,52,131,83,134,109,144,129,159,141,177,146,200,144,214,139,227,130,239,118,248,102,254,130,208,129,216,125,223,119,229,112,232,103,233,95,232,87,229,82,223,78,217,77,208,78,199,82,192,87,186,95,182,103,180,112,182,119,186,125,192,129,199,130,208,16383,16383,100,147,96,128,91,112,85,97,77,84,68,70,46,42,31,20,22,2,17,-13,15,-30,16,-42,18,-52,22,-62,27,-71,33,-79,45,-89,58,-97,74,-103,90,-107,107,-108,133,-104,155,-94,173,-79,184,-59,188,-35,187,-24,184,-16,179,-10,173,-6,164,-5,157,-5,151,-8,147,-12,144,-18,143,-25,145,-33,147,-37,150,-42,154,-46,160,-54,161,-57,162,-59,162,-62,160,-71,153,-80,142,-87,130,-91,116,-93,98,-90,83,-81,71,-69,64,-52,61,-34,62,-19,64,-4,67,11,72,27,79,44,93,75,101,99,106,118,108,133,108,147,225,378,153,453,148,457,144,460,140,462,132,464,125,463,120,461,117,458,
-206,45,296,45,206,70,206,70,296,45,229,74,206,70,229,74,308,203,308,203,229,74,296,163,308,203,296,163,331,0,331,0,296,163,296,74,331,0,296,74,296,45,296,45,296,74,229,74,308,203,331,0,331,203,331,74,331,45,359,45,331,74,359,45,359,74,296,338,69,-6,94,-6,296,338,94,-6,319,338,66,155,61,156,83,134,83,134,61,156,57,158,83,134,57,158,52,131,52,131,57,158,52,161,52,131,52,161,46,165,56,231,59,231,65,252,65,252,59,231,60,232,60,232,76,230,65,252,65,252,76,230,78,259,65,252,46,244,52,231,65,252,52,231,56,231,23,281,31,293,33,322,33,322,31,293,39,301,33,322,39,301,46,331,46,331,39,301,47,306,46,331,47,306,61,336,61,336,47,306,56,309,61,336,56,309,66,310,66,310,76,309,78,338,78,338,76,309,83,306,78,338,83,306,95,336,95,336,83,306,89,301,95,336,89,301,93,295,22,309,11,291,23,281,22,309,23,281,33,322,103,179,99,169,109,144,109,144,99,169,92,162,109,144,92,162,83,134,83,134,92,162,82,157,83,134,82,157,71,155,71,155,66,155,83,134,95,336,94,286,97,216,95,336,97,216,110,330,110,330,97,216,102,256,110,330,102,256,114,263,78,338,61,336,66,310,130,310,122,321,123,271,130,310,123,271,129,279,130,310,129,279,131,288,130,310,131,288,132,296,122,321,110,330,114,263,122,321,114,263,123,271,102,254,102,256,97,216,102,254,97,216,103,205,102,254,103,205,118,248,92,276,87,267,88,225,92,276,88,225,97,216,92,276,97,216,94,286,78,259,76,230,88,225,78,259,88,225,87,267,141,177,146,200,144,214,141,177,144,214,139,227,141,177,139,227,130,239,141,177,130,239,129,159,103,179,109,144,105,190,105,190,109,144,118,248,118,248,109,144,129,159,118,248,129,159,130,239,105,190,118,248,103,205,40,169,36,171,37,132,40,169,37,132,52,131,40,169,52,131,46,165,37,132,36,171,32,173,37,132,32,173,28,174,37,132,28,174,25,175,37,132,25,175,25,136,19,174,14,172,15,142,19,174,15,142,25,136,19,174,25,136,25,175,10,169,8,165,9,150,10,169,9,150,15,142,10,169,15,142,14,172,52,231,46,244,46,230,9,150,8,165,7,159,95,336,93,295,94,286,331,0,296,45,296,0,
-130,208,129,216,125,223,119,229,112,232,103,233,95,232,87,229,82,223,78,217,77,208,78,199,82,192,87,186,95,182,103,180,112,182,119,186,125,192,129,199,130,208,16383,16383,100,147,96,128,91,112,85,97,77,84,68,70,46,42,31,20,22,2,17,-13,15,-30,16,-42,18,-52,22,-62,27,-71,33,-79,45,-89,58,-97,74,-103,90,-107,107,-108,133,-104,155,-94,173,-79,184,-59,188,-35,187,-24,184,-16,179,-10,173,-6,164,-5,157,-5,151,-8,147,-12,144,-18,143,-25,145,-33,147,-37,150,-42,154,-46,160,-54,161,-57,162,-59,162,-62,160,-71,153,-80,142,-87,130,-91,116,-93,98,-90,83,-81,71,-69,64,-52,61,-34,62,-19,64,-4,67,11,72,27,79,44,93,75,101,99,106,118,108,133,108,147,225,378,153,453,148,457,144,460,140,462,132,464,125,463,120,461,117,458,114,454,113,448,114,443,116,439,119,434,123,430,128,426,205,378,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,138,378,158,378,235,427,245,435,248,439,249,443,250,448,249,454,247,458,243,461,239,463,233,464,228,463,224,462,221,460,216,457,211,453,16383,16383,353,0,353,9,340,12,
-103,180,112,182,112,232,112,232,112,182,119,186,112,232,119,186,119,229,119,229,119,186,125,192,119,229,125,192,125,223,125,223,125,192,129,199,125,223,129,199,129,216,129,216,129,199,130,208,78,217,78,199,82,223,82,223,78,199,82,192,82,223,82,192,87,229,87,229,82,192,87,186,87,229,87,186,95,232,95,232,87,186,95,182,95,232,95,182,103,233,103,233,95,182,103,180,103,233,103,180,112,232,72,27,79,44,77,84,72,27,77,84,68,70,68,70,46,42,62,-19,62,-19,46,42,61,-34,64,-52,61,-34,58,-97,64,-52,58,-97,74,-103,68,70,62,-19,64,-4,68,70,64,-4,67,11,68,70,67,11,72,27,33,-79,45,-89,46,42,46,42,45,-89,58,-97,46,42,58,-97,61,-34,31,20,22,2,22,-62,31,20,22,-62,27,-71,31,20,27,-71,33,-79,31,20,33,-79,46,42,15,-30,16,-42,17,-13,17,-13,16,-42,18,-52,17,-13,18,-52,22,2,22,2,18,-52,22,-62,108,147,100,147,101,99,108,147,101,99,106,118,108,147,106,118,108,133,96,128,91,112,93,75,96,128,93,75,101,99,96,128,101,99,100,147,85,97,77,84,79,44,85,97,79,44,93,75,85,97,93,75,91,112,160,-71,153,-80,155,-94,155,-94,153,-80,142,-87,155,-94,142,-87,133,-104,133,-104,142,-87,130,-91,133,-104,130,-91,116,-93,116,-93,98,-90,107,-108,107,-108,98,-90,90,-107,83,-81,71,-69,74,-103,83,-81,74,-103,90,-107,83,-81,90,-107,98,-90,147,-37,150,-42,151,-8,151,-8,150,-42,154,-46,151,-8,154,-46,157,-5,157,-5,154,-46,157,-50,157,-5,157,-50,164,-5,164,-5,157,-50,160,-54,164,-5,160,-54,161,-57,143,-25,144,-29,144,-18,144,-18,144,-29,145,-33,144,-18,145,-33,147,-12,147,-12,145,-33,147,-37,147,-12,147,-37,151,-8,173,-6,173,-79,179,-10,179,-10,173,-79,184,-59,179,-10,184,-59,184,-16,184,-16,184,-59,188,-35,184,-16,188,-35,187,-24,155,-94,173,-79,160,-71,160,-71,173,-79,162,-62,164,-5,162,-62,173,-79,164,-5,173,-79,173,-6,116,-93,107,-108,133,-104,164,-5,161,-57,162,-59,164,-5,162,-59,162,-62,64,-52,74,-103,71,-69,78,199,78,217,77,208,
-225,378,153,453,148,457,144,460,140,462,132,464,125,463,120,461,117,458,114,454,113,448,114,443,116,439,119,434,123,430,128,426,205,378,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,138,378,158,378,235,427,245,435,248,439,249,443,250,448,249,454,247,458,243,461,239,463,233,464,228,463,224,462,221,460,216,457,211,453,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,
-205,378,225,378,153,453,205,378,153,453,148,457,205,378,148,457,144,460,205,378,144,460,140,462,205,378,140,462,136,463,205,378,136,463,132,464,205,378,132,464,128,426,113,448,114,443,114,454,114,454,114,443,116,439,114,454,116,439,117,458,117,458,116,439,119,434,117,458,119,434,120,461,120,461,119,434,123,430,120,461,123,430,125,463,125,463,123,430,128,426,125,463,128,426,132,464,55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0,
-138,378,158,378,235,427,245,435,248,439,249,443,250,448,249,454,247,458,243,461,239,463,233,464,228,463,224,462,221,460,216,457,211,453,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,257,378,194,462,163,462,101,378,118,378,179,430,239,378,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,248,444,243,434,238,427,233,422,227,420,221,419,216,419,211,420,206,422,200,424,
-233,464,235,427,239,463,239,463,235,427,240,431,239,463,240,431,243,461,243,461,240,431,245,435,243,461,245,435,247,458,247,458,245,435,248,439,247,458,248,439,249,454,249,454,248,439,249,443,249,454,249,443,250,448,235,427,233,464,228,463,235,427,228,463,224,462,235,427,224,462,221,460,235,427,221,460,216,457,235,427,216,457,211,453,235,427,211,453,158,378,55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0,158,378,211,453,138,378,
-257,378,194,462,163,462,101,378,118,378,179,430,239,378,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,248,444,243,434,238,427,233,422,227,420,221,419,216,419,211,420,206,422,200,424,195,426,182,432,175,436,161,440,154,441,147,441,133,439,121,433,111,423,103,409,97,391,112,391,115,399,120,406,125,410,131,413,137,414,141,414,149,412,157,408,169,403,180,398,189,394,196,392,202,391,209,391,224,393,237,399,247,409,255,424,262,444,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,
-101,378,118,378,163,462,163,462,118,378,179,430,163,462,179,430,194,462,194,462,179,430,239,378,194,462,239,378,257,378,55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0,
-248,444,243,434,238,427,233,422,227,420,221,419,216,419,211,420,206,422,200,424,195,426,182,432,175,436,161,440,154,441,147,441,133,439,121,433,111,423,103,409,97,391,112,391,115,399,120,406,125,410,131,413,137,414,141,414,149,412,157,408,169,403,180,398,189,394,196,392,202,391,209,391,224,393,237,399,247,409,255,424,262,444,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,254,411,253,419,249,426,244,431,237,435,229,436,221,435,214,431,209,426,206,419,204,411,205,403,209,397,214,391,221,388,228,387,236,388,244,391,249,397,253,403,254,411,16383,16383,155,411,153,419,150,426,144,431,137,435,129,436,122,435,115,431,110,426,106,419,105,411,106,403,110,397,115,391,121,388,129,387,137,388,144,391,150,397,153,403,155,411,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,
-115,399,120,406,121,433,121,433,120,406,125,410,121,433,125,410,133,439,133,439,125,410,131,413,133,439,131,413,137,414,137,414,141,414,147,441,147,441,141,414,145,413,147,441,145,413,149,412,112,391,115,399,121,433,112,391,121,433,111,423,112,391,111,423,103,409,112,391,103,409,97,391,147,441,149,412,154,441,154,441,149,412,153,410,154,441,153,410,157,408,157,408,169,403,161,440,161,440,169,403,168,438,147,441,133,439,137,414,161,440,154,441,157,408,168,438,169,403,175,436,175,436,169,403,180,398,175,436,180,398,182,432,182,432,180,398,189,394,182,432,189,394,195,426,195,426,189,394,196,392,195,426,196,392,200,424,200,424,196,392,202,391,200,424,202,391,206,422,206,422,202,391,209,391,206,422,209,391,211,420,211,420,209,391,224,393,211,420,224,393,216,419,216,419,224,393,221,419,227,420,221,419,224,393,227,420,224,393,237,399,248,444,243,434,247,409,248,444,247,409,255,424,248,444,255,424,262,444,238,427,233,422,237,399,238,427,237,399,247,409,238,427,247,409,243,434,55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0,227,420,237,399,233,422,
-254,411,253,419,249,426,244,431,237,435,229,436,221,435,214,431,209,426,206,419,204,411,205,403,209,397,214,391,221,388,228,387,236,388,244,391,249,397,253,403,254,411,16383,16383,155,411,153,419,150,426,144,431,137,435,129,436,122,435,115,431,110,426,106,419,105,411,106,403,110,397,115,391,121,388,129,387,137,388,144,391,150,397,153,403,155,411,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,229,430,227,446,220,460,209,471,196,478,180,480,164,478,151,471,140,460,133,447,130,431,132,415,139,401,150,391,163,384,179,381,195,384,209,391,220,401,227,415,229,430,16383,16383,213,431,211,420,206,411,199,404,190,400,179,398,169,400,160,404,153,411,148,420,147,431,148,441,153,450,160,457,169,462,179,464,190,462,199,457,206,450,211,441,213,431,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,
-204,411,205,403,206,419,206,419,205,403,209,397,206,419,209,397,209,426,209,426,209,397,214,391,209,426,214,391,214,431,214,431,214,391,221,388,214,431,221,388,221,435,221,435,221,388,228,387,221,435,228,387,229,436,229,436,228,387,236,388,229,436,236,388,237,435,237,435,236,388,244,391,237,435,244,391,244,431,244,431,244,391,249,397,244,431,249,397,249,426,249,426,249,397,253,403,249,426,253,403,253,419,253,419,253,403,254,411,105,411,106,403,106,419,106,419,106,403,110,397,106,419,110,397,110,426,110,426,110,397,115,391,110,426,115,391,115,431,115,431,115,391,121,388,115,431,121,388,122,435,122,435,121,388,129,387,122,435,129,387,129,436,129,436,129,387,137,388,129,436,137,388,137,435,137,435,137,388,144,391,137,435,144,391,144,431,144,431,144,391,150,397,144,431,150,397,150,426,150,426,150,397,153,403,150,426,153,403,153,419,153,419,153,403,155,411,55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0,
-229,430,227,446,220,460,209,471,196,478,180,480,164,478,151,471,140,460,133,447,130,431,132,415,139,401,150,391,163,384,179,381,195,384,209,391,220,401,227,415,229,430,16383,16383,213,431,211,420,206,411,199,404,190,400,179,398,169,400,160,404,153,411,148,420,147,431,148,441,153,450,160,457,169,462,179,464,190,462,199,457,206,450,211,441,213,431,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,431,84,420,84,404,56,389,37,372,26,349,20,320,19,268,19,257,22,252,26,249,34,248,47,248,165,319,165,337,163,350,158,360,149,366,135,370,114,381,114,381,232,370,232,367,211,359,197,346,189,326,184,300,183,248,183,248,295,249,301,251,306,253,310,257,312,262,313,305,313,341,312,367,308,382,299,392,283,397,261,408,261,408,331,126,331,126,321,143,320,155,318,164,315,169,310,171,305,171,302,170,300,168,294,166,291,44,49,36,33,28,23,21,16,11,12,0,9,0,0,99,0,99,9,87,11,77,13,70,16,66,20,65,24,66,33,71,48,80,68,93,95,111,130,199,130,199,56,198,39,195,27,189,18,179,13,164,11,155,9,155,0,410,0,16383,16383,199,150,120,150,199,309,307,65,285,47,264,32,242,23,220,17,
-211,420,206,411,209,391,209,391,206,411,199,404,209,391,199,404,195,384,195,384,199,404,190,400,195,384,190,400,179,381,179,381,190,400,179,398,180,480,179,464,190,462,180,480,190,462,196,478,196,478,190,462,199,457,196,478,199,457,209,471,209,471,199,457,206,450,209,471,206,450,211,441,229,430,227,446,227,415,227,415,227,446,220,460,227,415,220,460,220,401,220,401,220,460,213,431,211,441,213,431,220,460,211,441,220,460,209,471,211,420,209,391,220,401,211,420,220,401,213,431,153,450,160,457,164,478,164,478,160,457,169,462,164,478,169,462,180,480,180,480,169,462,179,464,151,471,140,460,147,431,151,471,147,431,148,441,151,471,148,441,153,450,151,471,153,450,164,478,153,411,148,420,150,391,150,391,148,420,147,431,169,400,160,404,163,384,169,400,163,384,179,381,169,400,179,381,179,398,153,411,150,391,163,384,153,411,163,384,160,404,130,431,132,415,133,447,133,447,132,415,139,401,133,447,139,401,140,460,140,460,139,401,150,391,140,460,150,391,147,431,55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0,
-431,84,420,84,404,56,389,37,372,26,349,20,320,19,268,19,257,22,252,26,249,34,248,47,248,165,319,165,337,163,350,158,360,149,366,135,370,114,381,114,381,232,370,232,367,211,359,197,346,189,326,184,300,183,248,183,248,295,249,301,251,306,253,310,257,312,262,313,305,313,341,312,367,308,382,299,392,283,397,261,408,261,408,331,126,331,126,321,143,320,155,318,164,315,169,310,171,305,171,302,170,300,168,294,166,291,44,49,36,33,28,23,21,16,11,12,0,9,0,0,99,0,99,9,87,11,77,13,70,16,66,20,65,24,66,33,71,48,80,68,93,95,111,130,199,130,199,56,198,39,195,27,189,18,179,13,164,11,155,9,155,0,410,0,16383,16383,199,150,120,150,199,309,307,65,285,47,264,32,242,23,220,17,196,15,175,17,155,21,137,29,120,40,105,54,93,72,84,94,77,118,73,145,72,173,77,222,93,262,118,292,151,311,191,318,221,313,249,300,272,280,289,255,299,225,310,225,305,338,295,338,293,332,285,324,280,322,275,321,271,322,268,322,263,323,259,325,254,326,240,330,225,334,210,336,196,338,181,338,160,337,140,333,120,327,101,319,84,308,59,287,40,262,25,233,17,200,14,165,16,135,21,107,30,82,43,60,58,41,73,27,90,15,109,6,129,0,151,-4,132,-49,136,-51,139,-50,141,-50,144,-49,150,-49,160,-50,168,-52,173,-55,175,-60,176,-67,175,-74,172,-81,166,-85,158,-88,149,-89,143,-89,131,-87,124,-86,117,-83,109,-98,118,-102,134,-106,
-87,11,77,13,99,0,99,0,77,13,70,16,99,0,70,16,36,33,36,33,70,16,66,20,36,33,66,20,44,49,44,49,66,20,65,24,71,48,80,68,166,291,166,291,80,68,93,95,166,291,93,95,111,130,111,130,199,130,120,150,120,150,199,130,199,150,195,27,189,18,410,0,410,0,189,18,179,13,410,0,179,13,164,11,166,291,111,130,120,150,166,291,120,150,199,309,166,291,199,309,168,294,262,313,408,331,199,309,199,309,408,331,169,310,199,309,169,310,171,305,171,305,171,302,199,309,199,309,171,302,170,300,199,309,170,300,169,297,360,149,366,135,367,211,367,211,366,135,370,114,367,211,370,114,370,232,370,232,370,114,381,114,370,232,381,114,381,232,300,183,319,165,326,184,326,184,319,165,337,163,326,184,337,163,346,189,346,189,337,163,350,158,346,189,350,158,359,197,359,197,350,158,360,149,359,197,360,149,367,211,199,309,249,34,248,47,248,183,248,165,319,165,248,183,319,165,300,183,408,331,262,313,305,313,408,331,305,313,341,312,408,331,341,312,367,308,408,331,367,308,382,299,408,331,382,299,392,283,408,331,392,283,397,261,408,331,397,261,408,261,199,309,248,47,248,295,199,309,248,295,249,301,199,309,249,301,251,306,199,309,251,306,253,310,199,309,253,310,257,312,199,309,257,312,262,313,408,331,126,331,143,320,408,331,143,320,155,318,408,331,155,318,164,315,408,331,164,315,169,310,389,37,372,26,410,0,410,0,372,26,349,20,410,0,349,20,320,19,410,0,431,84,420,84,410,0,420,84,404,56,410,0,404,56,389,37,199,56,198,39,257,22,257,22,198,39,195,27,257,22,195,27,268,19,268,19,195,27,410,0,268,19,410,0,283,19,283,19,410,0,320,19,199,150,199,130,252,26,199,150,252,26,249,34,199,150,249,34,199,309,199,56,257,22,252,26,199,56,252,26,199,130,155,9,155,0,410,0,155,9,410,0,164,11,44,49,65,24,66,33,44,49,66,33,71,48,44,49,71,48,166,291,99,0,36,33,28,23,99,0,28,23,21,16,99,0,21,16,11,12,99,0,11,12,0,9,99,0,0,9,0,0,87,11,99,0,99,9,168,294,199,309,169,297,143,320,126,331,126,321,
-307,65,285,47,264,32,242,23,220,17,196,15,175,17,155,21,137,29,120,40,105,54,93,72,84,94,77,118,73,145,72,173,77,222,93,262,118,292,151,311,191,318,221,313,249,300,272,280,289,255,299,225,310,225,305,338,295,338,293,332,285,324,280,322,275,321,271,322,268,322,263,323,259,325,254,326,240,330,225,334,210,336,196,338,181,338,160,337,140,333,120,327,101,319,84,308,59,287,40,262,25,233,17,200,14,165,16,135,21,107,30,82,43,60,58,41,73,27,90,15,109,6,129,0,151,-4,132,-49,136,-51,139,-50,141,-50,144,-49,150,-49,160,-50,168,-52,173,-55,175,-60,176,-67,175,-74,172,-81,166,-85,158,-88,149,-89,143,-89,131,-87,124,-86,117,-83,109,-98,118,-102,134,-106,142,-106,151,-107,173,-105,190,-99,203,-91,211,-79,214,-64,212,-52,206,-43,198,-36,186,-32,171,-30,163,-30,161,-31,158,-31,168,-6,180,-6,213,-4,244,3,272,16,297,34,316,56,201,378,128,453,124,457,119,460,115,462,107,464,101,463,96,461,92,458,90,454,89,448,89,443,91,439,94,434,104,426,181,378,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,123,378,142,378,219,427,225,431,229,435,232,439,234,443,234,454,231,458,228,461,223,463,217,464,209,462,205,460,201,457,196,453,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,
-84,94,77,118,90,15,90,15,77,118,73,145,90,15,73,145,73,27,73,27,73,145,72,173,59,287,72,173,84,308,158,-31,175,17,155,21,158,-31,155,21,151,-4,151,-4,155,21,137,29,151,-4,137,29,129,0,129,0,137,29,120,40,129,0,120,40,109,6,109,6,120,40,105,54,142,-106,151,-107,143,-89,143,-89,151,-107,149,-89,158,-88,149,-89,151,-107,158,-88,151,-107,173,-105,141,-50,144,-49,151,-4,151,-4,144,-49,147,-49,151,-4,147,-49,150,-49,150,-49,160,-50,151,-4,151,-4,132,-49,136,-51,151,-4,136,-51,139,-50,151,-4,139,-50,141,-50,196,15,178,-6,180,-6,196,15,180,-6,213,-4,196,15,175,17,175,-6,196,15,175,-6,178,-6,175,17,158,-31,168,-6,175,17,168,-6,171,-6,175,17,171,-6,173,-6,175,17,173,-6,175,-6,316,56,307,65,297,34,297,34,307,65,285,47,297,34,285,47,272,16,272,16,285,47,264,32,272,16,264,32,244,3,244,3,264,32,242,23,244,3,242,23,220,17,220,17,196,15,213,-4,220,17,213,-4,244,3,191,318,181,338,160,337,191,318,160,337,151,311,191,318,196,338,181,338,72,173,77,222,84,308,84,308,77,222,93,262,84,308,93,262,101,319,101,319,93,262,118,292,101,319,118,292,120,327,120,327,118,292,151,311,120,327,151,311,140,333,140,333,151,311,160,337,210,336,221,313,225,334,225,334,221,313,249,300,225,334,249,300,240,330,240,330,249,300,254,326,221,313,210,336,196,338,221,313,196,338,191,318,289,328,285,324,289,255,289,255,285,324,280,322,289,255,280,322,275,321,275,321,271,322,272,280,272,280,271,322,268,322,272,280,268,322,263,323,272,280,263,323,259,325,272,280,259,325,254,326,272,280,254,326,249,300,299,225,310,225,305,338,299,225,305,338,295,338,299,225,295,338,293,332,299,225,293,332,289,255,275,321,272,280,289,255,214,-64,212,-52,211,-79,211,-79,212,-52,206,-43,211,-79,206,-43,203,-91,203,-91,206,-43,198,-36,203,-91,198,-36,190,-99,190,-99,198,-36,186,-32,190,-99,186,-32,176,-67,176,-67,186,-32,175,-60,173,-55,175,-60,186,-32,173,-55,186,-32,171,-30,173,-55,171,-30,168,-30,173,-55,168,-30,168,-52,168,-52,168,-30,166,-30,168,-52,166,-30,163,-30,168,-52,163,-30,161,-31,168,-52,161,-31,160,-50,158,-31,151,-4,160,-50,158,-31,160,-50,161,-31,190,-99,176,-67,175,-74,190,-99,175,-74,173,-105,173,-105,175,-74,172,-81,173,-105,172,-81,166,-85,117,-83,118,-102,124,-86,124,-86,118,-102,126,-104,124,-86,126,-104,131,-87,131,-87,126,-104,134,-106,131,-87,134,-106,137,-88,137,-88,134,-106,142,-106,137,-88,142,-106,143,-89,93,72,84,94,90,15,93,72,90,15,109,6,93,72,109,6,105,54,59,287,40,262,43,60,59,287,43,60,58,41,59,287,58,41,73,27,59,287,73,27,72,173,14,165,16,135,17,200,17,200,16,135,21,107,17,200,21,107,25,233,25,233,21,107,30,82,25,233,30,82,40,262,40,262,30,82,43,60,118,-102,117,-83,109,-98,158,-88,173,-105,166,-85,289,328,289,255,293,332,
-201,378,128,453,124,457,119,460,115,462,107,464,101,463,96,461,92,458,90,454,89,448,89,443,91,439,94,434,104,426,181,378,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,123,378,142,378,219,427,225,431,229,435,232,439,234,443,234,454,231,458,228,461,223,463,217,464,209,462,205,460,201,457,196,453,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,
-181,378,201,378,128,453,181,378,128,453,124,457,181,378,124,457,119,460,181,378,119,460,115,462,181,378,115,462,111,463,181,378,111,463,107,464,181,378,107,464,104,426,89,448,89,443,90,454,90,454,89,443,91,439,90,454,91,439,92,458,92,458,91,439,94,434,92,458,94,434,96,461,96,461,94,434,99,430,96,461,99,430,101,463,101,463,99,430,104,426,101,463,104,426,107,464,45,24,38,16,276,0,276,0,38,16,25,12,276,0,25,12,6,9,49,294,50,275,106,310,49,294,106,310,45,307,45,307,106,310,111,312,45,307,111,312,271,331,271,331,111,312,118,312,45,24,117,21,49,37,49,37,117,21,108,25,49,37,108,25,50,57,50,57,108,25,102,31,50,57,102,31,50,275,50,275,102,31,100,42,50,275,100,42,100,294,100,184,100,164,176,164,100,184,176,164,176,184,198,185,176,184,198,162,198,185,198,162,213,190,213,190,198,162,213,158,213,190,213,158,222,198,222,198,213,158,222,150,222,198,222,150,229,212,229,212,222,150,229,136,229,212,229,136,233,232,233,232,229,136,233,115,233,232,233,115,244,115,271,331,118,312,184,312,271,331,184,312,213,311,271,331,213,311,234,306,271,331,234,306,247,297,271,331,247,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,50,275,100,294,101,302,50,275,101,302,103,307,50,275,103,307,106,310,271,331,6,331,25,320,271,331,25,320,38,315,271,331,38,315,45,307,255,38,234,26,276,0,276,0,234,26,206,20,276,0,206,20,169,18,276,0,299,84,285,84,276,0,285,84,271,57,276,0,271,57,255,38,276,0,169,18,151,18,276,0,151,18,132,19,276,0,132,19,117,21,276,0,117,21,45,24,276,0,6,9,6,0,25,320,6,331,6,321,176,184,176,164,198,162,233,232,244,115,244,232,
-123,378,142,378,219,427,225,431,229,435,232,439,234,443,234,454,231,458,228,461,223,463,217,464,209,462,205,460,201,457,196,453,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,242,378,179,462,148,462,86,378,103,378,164,430,224,378,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,238,411,236,419,233,426,227,431,220,435,213,436,205,435,198,431,193,426,
-217,464,219,427,223,463,223,463,219,427,225,431,223,463,225,431,228,461,228,461,225,431,229,435,228,461,229,435,231,458,231,458,229,435,232,439,231,458,232,439,234,454,234,454,232,439,234,443,234,454,234,443,234,448,219,427,217,464,213,463,219,427,213,463,209,462,219,427,209,462,205,460,219,427,205,460,201,457,219,427,201,457,196,453,219,427,196,453,142,378,45,24,38,16,276,0,276,0,38,16,25,12,276,0,25,12,6,9,49,294,50,275,106,310,49,294,106,310,45,307,45,307,106,310,111,312,45,307,111,312,271,331,271,331,111,312,118,312,45,24,117,21,49,37,49,37,117,21,108,25,49,37,108,25,50,57,50,57,108,25,102,31,50,57,102,31,50,275,50,275,102,31,100,42,50,275,100,42,100,294,100,184,100,164,176,164,100,184,176,164,176,184,198,185,176,184,198,162,198,185,198,162,213,190,213,190,198,162,213,158,213,190,213,158,222,198,222,198,213,158,222,150,222,198,222,150,229,212,229,212,222,150,229,136,229,212,229,136,233,232,233,232,229,136,233,115,233,232,233,115,244,115,271,331,118,312,184,312,271,331,184,312,213,311,271,331,213,311,234,306,271,331,234,306,247,297,271,331,247,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,50,275,100,294,101,302,50,275,101,302,103,307,50,275,103,307,106,310,271,331,6,331,25,320,271,331,25,320,38,315,271,331,38,315,45,307,255,38,234,26,276,0,276,0,234,26,206,20,276,0,206,20,169,18,276,0,299,84,285,84,276,0,285,84,271,57,276,0,271,57,255,38,276,0,169,18,151,18,276,0,151,18,132,19,276,0,132,19,117,21,276,0,117,21,45,24,276,0,6,9,6,0,25,320,6,331,6,321,176,184,176,164,198,162,233,232,244,115,244,232,142,378,196,453,123,378,
-242,378,179,462,148,462,86,378,103,378,164,430,224,378,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,238,411,236,419,233,426,227,431,220,435,213,436,205,435,198,431,193,426,189,419,188,411,189,403,193,397,198,391,204,388,212,387,220,388,227,391,233,397,236,403,238,411,16383,16383,138,411,137,419,133,426,128,431,121,435,113,436,105,435,98,431,93,426,90,419,89,411,90,403,93,397,98,391,105,388,113,387,121,388,128,391,133,397,137,403,138,411,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,
-86,378,103,378,148,462,148,462,103,378,164,430,148,462,164,430,179,462,179,462,164,430,224,378,179,462,224,378,242,378,45,24,38,16,276,0,276,0,38,16,25,12,276,0,25,12,6,9,49,294,50,275,106,310,49,294,106,310,45,307,45,307,106,310,111,312,45,307,111,312,271,331,271,331,111,312,118,312,45,24,117,21,49,37,49,37,117,21,108,25,49,37,108,25,50,57,50,57,108,25,102,31,50,57,102,31,50,275,50,275,102,31,100,42,50,275,100,42,100,294,100,184,100,164,176,164,100,184,176,164,176,184,198,185,176,184,198,162,198,185,198,162,213,190,213,190,198,162,213,158,213,190,213,158,222,198,222,198,213,158,222,150,222,198,222,150,229,212,229,212,222,150,229,136,229,212,229,136,233,232,233,232,229,136,233,115,233,232,233,115,244,115,271,331,118,312,184,312,271,331,184,312,213,311,271,331,213,311,234,306,271,331,234,306,247,297,271,331,247,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,50,275,100,294,101,302,50,275,101,302,103,307,50,275,103,307,106,310,271,331,6,331,25,320,271,331,25,320,38,315,271,331,38,315,45,307,255,38,234,26,276,0,276,0,234,26,206,20,276,0,206,20,169,18,276,0,299,84,285,84,276,0,285,84,271,57,276,0,271,57,255,38,276,0,169,18,151,18,276,0,151,18,132,19,276,0,132,19,117,21,276,0,117,21,45,24,276,0,6,9,6,0,25,320,6,331,6,321,176,184,176,164,198,162,233,232,244,115,244,232,
-238,411,236,419,233,426,227,431,220,435,213,436,205,435,198,431,193,426,189,419,188,411,189,403,193,397,198,391,204,388,212,387,220,388,227,391,233,397,236,403,238,411,16383,16383,138,411,137,419,133,426,128,431,121,435,113,436,105,435,98,431,93,426,90,419,89,411,90,403,93,397,98,391,105,388,113,387,121,388,128,391,133,397,137,403,138,411,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,134,378,62,453,57,457,53,460,49,462,41,464,35,463,29,461,26,458,23,454,22,448,23,443,25,439,28,434,32,430,37,426,114,378,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,32,378,52,378,129,427,139,435,142,439,143,443,144,448,143,454,141,458,137,461,133,463,127,464,122,463,118,462,115,460,110,457,105,453,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,161,378,98,462,67,462,5,378,22,378,83,430,143,378,16383,16383,153,0,153,9,133,11,
-113,436,113,387,121,435,121,435,113,387,121,388,121,435,121,388,128,431,128,431,121,388,128,391,128,431,128,391,133,426,133,426,128,391,133,397,133,426,133,397,137,419,137,419,133,397,137,403,137,419,137,403,138,411,89,411,90,403,90,419,90,419,90,403,93,397,90,419,93,397,93,426,93,426,93,397,98,391,93,426,98,391,98,431,98,431,98,391,105,388,98,431,105,388,105,435,105,435,105,388,113,387,105,435,113,387,113,436,45,24,38,16,276,0,276,0,38,16,25,12,276,0,25,12,6,9,49,294,50,275,106,310,49,294,106,310,45,307,45,307,106,310,111,312,45,307,111,312,271,331,271,331,111,312,118,312,188,411,189,403,189,419,189,419,189,403,193,397,189,419,193,397,193,426,193,426,193,397,198,391,193,426,198,391,198,431,198,431,198,391,204,388,198,431,204,388,205,435,205,435,204,388,212,387,205,435,212,387,213,436,213,436,212,387,220,388,213,436,220,388,220,435,220,435,220,388,227,391,220,435,227,391,227,431,227,431,227,391,233,397,227,431,233,397,233,426,233,426,233,397,236,403,233,426,236,403,236,419,236,419,236,403,238,411,45,24,117,21,49,37,49,37,117,21,108,25,49,37,108,25,50,57,50,57,108,25,102,31,50,57,102,31,50,275,50,275,102,31,100,42,50,275,100,42,100,294,100,184,100,164,176,164,100,184,176,164,176,184,198,185,176,184,198,162,198,185,198,162,213,190,213,190,198,162,213,158,213,190,213,158,222,198,222,198,213,158,222,150,222,198,222,150,229,212,229,212,222,150,229,136,229,212,229,136,233,232,233,232,229,136,233,115,233,232,233,115,244,115,271,331,118,312,184,312,271,331,184,312,213,311,271,331,213,311,234,306,271,331,234,306,247,297,271,331,247,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,50,275,100,294,101,302,50,275,101,302,103,307,50,275,103,307,106,310,271,331,6,331,25,320,271,331,25,320,38,315,271,331,38,315,45,307,255,38,234,26,276,0,276,0,234,26,206,20,276,0,206,20,169,18,276,0,299,84,285,84,276,0,285,84,271,57,276,0,271,57,255,38,276,0,169,18,151,18,276,0,151,18,132,19,276,0,132,19,117,21,276,0,117,21,45,24,276,0,6,9,6,0,25,320,6,331,6,321,176,184,176,164,198,162,233,232,244,115,244,232,
-134,378,62,453,57,457,53,460,49,462,41,464,35,463,29,461,26,458,23,454,22,448,23,443,25,439,28,434,32,430,37,426,114,378,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,32,378,52,378,129,427,139,435,142,439,143,443,144,448,143,454,141,458,137,461,133,463,127,464,122,463,118,462,115,460,110,457,105,453,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,
-114,378,134,378,62,453,114,378,62,453,57,457,114,378,57,457,53,460,114,378,53,460,49,462,114,378,49,462,45,463,114,378,45,463,41,464,114,378,41,464,37,426,22,448,23,443,23,454,23,454,23,443,25,439,23,454,25,439,26,458,26,458,25,439,28,434,26,458,28,434,29,461,29,461,28,434,32,430,29,461,32,430,35,463,35,463,32,430,37,426,35,463,37,426,41,464,52,23,44,15,157,0,157,0,44,15,30,11,157,0,30,11,9,9,157,331,9,331,30,320,157,331,30,320,44,316,157,331,44,316,53,308,157,331,53,308,57,295,157,331,57,295,122,316,157,331,122,316,136,320,157,331,136,320,157,321,122,16,114,24,57,56,57,56,114,24,109,37,57,56,109,37,57,276,57,276,109,37,108,56,57,276,108,56,108,276,57,276,108,276,109,295,57,276,109,295,113,308,57,276,113,308,122,316,57,276,122,316,57,295,157,0,157,9,137,11,157,0,137,11,122,16,157,0,122,16,56,36,157,0,56,36,52,23,157,0,9,9,9,0,56,36,122,16,57,56,30,320,9,331,9,321,
-32,378,52,378,129,427,139,435,142,439,143,443,144,448,143,454,141,458,137,461,133,463,127,464,122,463,118,462,115,460,110,457,105,453,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,161,378,98,462,67,462,5,378,22,378,83,430,143,378,16383,16383,153,0,153,9,133,11,119,16,110,24,106,37,104,56,104,276,105,295,110,308,118,316,132,320,153,321,153,331,5,331,5,321,26,320,40,316,49,308,53,295,54,276,54,56,53,36,49,23,40,15,26,11,5,9,5,0,157,411,156,419,153,426,147,431,140,435,132,436,125,435,118,431,113,426,
-127,464,129,427,133,463,133,463,129,427,134,431,133,463,134,431,137,461,137,461,134,431,139,435,137,461,139,435,141,458,141,458,139,435,142,439,141,458,142,439,143,454,143,454,142,439,143,443,143,454,143,443,144,448,129,427,127,464,122,463,129,427,122,463,118,462,129,427,118,462,115,460,129,427,115,460,110,457,129,427,110,457,105,453,129,427,105,453,52,378,52,23,44,15,157,0,157,0,44,15,30,11,157,0,30,11,9,9,157,331,9,331,30,320,157,331,30,320,44,316,157,331,44,316,53,308,157,331,53,308,57,295,157,331,57,295,122,316,157,331,122,316,136,320,157,331,136,320,157,321,122,16,114,24,57,56,57,56,114,24,109,37,57,56,109,37,57,276,57,276,109,37,108,56,57,276,108,56,108,276,57,276,108,276,109,295,57,276,109,295,113,308,57,276,113,308,122,316,57,276,122,316,57,295,157,0,157,9,137,11,157,0,137,11,122,16,157,0,122,16,56,36,157,0,56,36,52,23,157,0,9,9,9,0,56,36,122,16,57,56,30,320,9,331,9,321,52,378,105,453,32,378,
-161,378,98,462,67,462,5,378,22,378,83,430,143,378,16383,16383,153,0,153,9,133,11,119,16,110,24,106,37,104,56,104,276,105,295,110,308,118,316,132,320,153,321,153,331,5,331,5,321,26,320,40,316,49,308,53,295,54,276,54,56,53,36,49,23,40,15,26,11,5,9,5,0,157,411,156,419,153,426,147,431,140,435,132,436,125,435,118,431,113,426,109,419,108,411,109,403,113,397,118,391,124,388,132,387,140,388,147,391,153,397,156,403,157,411,16383,16383,58,411,57,419,53,426,48,431,41,435,33,436,25,435,18,431,13,426,10,419,8,411,10,403,13,397,18,391,
-5,378,22,378,67,462,67,462,22,378,83,430,67,462,83,430,98,462,98,462,83,430,143,378,98,462,143,378,161,378,49,23,40,15,153,0,153,0,40,15,26,11,153,0,26,11,5,9,153,331,5,331,26,320,153,331,26,320,40,316,153,331,40,316,49,308,153,331,49,308,53,295,153,331,53,295,118,316,153,331,118,316,132,320,153,331,132,320,153,321,119,16,110,24,54,56,54,56,110,24,106,37,54,56,106,37,54,276,54,276,106,37,104,56,54,276,104,56,104,276,54,276,104,276,105,295,54,276,105,295,110,308,54,276,110,308,118,316,54,276,118,316,53,295,153,0,153,9,133,11,153,0,133,11,119,16,153,0,119,16,53,36,153,0,53,36,49,23,153,0,5,9,5,0,53,36,119,16,54,56,26,320,5,331,5,321,
-157,411,156,419,153,426,147,431,140,435,132,436,125,435,118,431,113,426,109,419,108,411,109,403,113,397,118,391,124,388,132,387,140,388,147,391,153,397,156,403,157,411,16383,16383,58,411,57,419,53,426,48,431,41,435,33,436,25,435,18,431,13,426,10,419,8,411,10,403,13,397,18,391,25,388,32,387,40,388,47,391,53,397,57,403,58,411,16383,16383,157,0,157,9,136,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,8,331,8,321,30,320,44,316,52,308,56,295,57,276,57,56,56,36,52,23,44,15,29,11,8,9,8,0,8,331,8,321,28,319,40,315,48,307,51,295,52,276,52,180,11,180,11,157,52,157,52,55,51,36,47,24,40,16,27,12,8,9,8,0,150,0,183,2,213,7,242,16,267,27,287,41,307,60,322,83,333,109,340,137,343,167,334,224,308,269,267,303,212,324,143,331,16383,16383,103,157,176,157,176,180,103,180,103,293,104,301,106,307,111,310,117,312,127,313,152,312,175,309,194,304,212,297,227,289,249,271,266,249,278,224,285,195,288,164,285,130,278,101,266,76,249,55,227,39,211,31,194,26,175,22,153,19,128,18,118,19,111,21,106,25,104,31,103,39,244,444,240,434,
-8,411,10,403,10,419,10,419,10,403,13,397,10,419,13,397,13,426,13,426,13,397,18,391,13,426,18,391,18,431,18,431,18,391,25,388,18,431,25,388,25,435,25,435,25,388,32,387,25,435,32,387,33,436,33,436,32,387,40,388,33,436,40,388,41,435,41,435,40,388,47,391,41,435,47,391,48,431,48,431,47,391,53,397,48,431,53,397,53,426,53,426,53,397,57,403,53,426,57,403,57,419,57,419,57,403,58,411,52,23,44,15,157,0,157,0,44,15,29,11,157,0,29,11,8,9,157,331,8,331,30,320,157,331,30,320,44,316,157,331,44,316,52,308,157,331,52,308,56,295,157,331,56,295,122,316,157,331,122,316,136,320,157,331,136,320,157,321,122,16,114,24,57,56,57,56,114,24,109,37,57,56,109,37,57,276,57,276,109,37,108,56,57,276,108,56,108,276,57,276,108,276,109,295,57,276,109,295,113,308,57,276,113,308,122,316,57,276,122,316,56,295,132,436,132,387,140,435,140,435,132,387,140,388,140,435,140,388,147,431,147,431,140,388,147,391,147,431,147,391,153,426,153,426,147,391,153,397,153,426,153,397,156,419,156,419,153,397,156,403,156,419,156,403,157,411,108,411,109,403,109,419,109,419,109,403,113,397,109,419,113,397,113,426,113,426,113,397,118,391,113,426,118,391,118,431,118,431,118,391,124,388,118,431,124,388,125,435,125,435,124,388,132,387,125,435,132,387,132,436,157,0,157,9,136,11,157,0,136,11,122,16,157,0,122,16,56,36,157,0,56,36,52,23,157,0,8,9,8,0,56,36,122,16,57,56,30,320,8,331,8,321,
-8,331,8,321,28,319,40,315,48,307,51,295,52,276,52,180,11,180,11,157,52,157,52,55,51,36,47,24,40,16,27,12,8,9,8,0,150,0,183,2,213,7,242,16,267,27,287,41,307,60,322,83,333,109,340,137,343,167,334,224,308,269,267,303,212,324,143,331,16383,16383,103,157,176,157,176,180,103,180,103,293,104,301,106,307,111,310,117,312,127,313,152,312,175,309,194,304,212,297,227,289,249,271,266,249,278,224,285,195,288,164,285,130,278,101,266,76,249,55,227,39,211,31,194,26,175,22,153,19,128,18,118,19,111,21,106,25,104,31,103,39,244,444,240,434,235,427,230,422,224,420,218,419,213,419,208,420,203,422,191,426,180,432,172,436,158,440,151,441,145,441,130,439,118,433,108,423,100,409,94,391,108,391,112,399,116,406,122,410,128,413,134,414,138,414,146,412,150,410,155,408,177,398,185,394,193,392,200,391,206,391,221,393,234,399,244,409,252,424,259,444,16383,16383,353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,
-47,24,40,16,150,0,150,0,40,16,27,12,150,0,27,12,8,9,40,315,48,307,143,331,143,331,48,307,51,295,143,331,51,295,52,276,104,31,52,276,52,180,104,31,52,180,52,157,52,157,52,180,11,180,52,157,11,180,11,157,104,301,106,307,52,276,52,276,106,307,111,310,52,276,111,310,143,331,143,331,111,310,117,312,143,331,117,312,127,313,127,313,117,312,127,312,127,313,127,312,152,312,127,313,152,312,143,331,143,331,152,312,212,324,175,22,183,2,194,26,194,26,183,2,213,7,194,26,213,7,211,31,211,31,213,7,227,39,249,55,227,39,242,16,249,55,242,16,267,27,128,18,150,0,153,19,153,19,150,0,183,2,153,19,183,2,175,22,175,309,194,304,212,324,212,324,194,304,212,297,212,324,212,297,227,289,227,289,249,271,267,303,267,303,249,271,266,249,267,303,266,249,278,224,334,224,308,269,322,83,334,224,322,83,333,109,334,224,333,109,340,137,334,224,340,137,343,167,322,83,308,269,307,60,307,60,308,269,288,164,287,41,288,164,285,130,287,41,285,130,278,101,267,303,278,224,308,269,308,269,278,224,285,195,308,269,285,195,288,164,267,303,212,324,227,289,267,27,287,41,278,101,267,27,278,101,266,76,267,27,266,76,249,55,227,39,213,7,242,16,52,276,104,31,103,39,103,180,103,157,176,157,103,180,176,157,176,180,103,293,104,301,52,276,103,293,52,276,103,39,143,331,8,331,28,319,143,331,28,319,40,315,52,55,51,36,111,21,111,21,51,36,150,0,111,21,150,0,118,19,118,19,150,0,128,18,52,55,111,21,106,25,52,55,106,25,104,31,52,55,104,31,52,157,150,0,8,9,8,0,47,24,150,0,51,36,28,319,8,331,8,321,288,164,287,41,307,60,212,324,152,312,175,309,
-244,444,240,434,235,427,230,422,224,420,218,419,213,419,208,420,203,422,191,426,180,432,172,436,158,440,151,441,145,441,130,439,118,433,108,423,100,409,94,391,108,391,112,399,116,406,122,410,128,413,134,414,138,414,146,412,150,410,155,408,177,398,185,394,193,392,200,391,206,391,221,393,234,399,244,409,252,424,259,444,16383,16383,353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,103,13,90,20,82,31,78,49,76,75,76,269,297,-5,306,-5,306,274,308,289,311,299,315,307,320,313,324,315,329,318,335,319,343,320,353,321,225,378,152,453,148,457,143,460,139,462,131,464,125,463,120,461,116,458,114,454,113,448,113,443,115,439,118,434,128,426,205,378,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,129,378,150,378,227,427,232,431,236,435,239,439,241,443,242,448,
-112,399,116,406,118,433,118,433,116,406,122,410,118,433,122,410,130,439,130,439,122,410,128,413,130,439,128,413,134,414,134,414,138,414,145,441,145,441,138,414,142,413,145,441,142,413,146,412,108,391,112,399,118,433,108,391,118,433,108,423,108,391,108,423,100,409,108,391,100,409,94,391,145,441,146,412,151,441,151,441,146,412,150,410,151,441,150,410,155,408,155,408,166,403,158,440,158,440,166,403,165,438,145,441,130,439,134,414,158,440,151,441,155,408,165,438,166,403,172,436,172,436,166,403,177,398,172,436,177,398,180,432,180,432,177,398,185,394,180,432,185,394,191,426,191,426,185,394,193,392,191,426,193,392,197,424,197,424,193,392,200,391,197,424,200,391,203,422,203,422,200,391,206,391,203,422,206,391,208,420,208,420,206,391,221,393,208,420,221,393,213,419,213,419,221,393,218,419,224,420,218,419,221,393,224,420,221,393,234,399,244,444,240,434,244,409,244,444,244,409,252,424,244,444,252,424,259,444,235,427,230,422,234,399,235,427,234,399,244,409,235,427,244,409,240,434,49,30,41,19,123,0,123,0,41,19,27,13,123,0,27,13,6,9,256,319,263,317,353,331,353,331,263,317,269,313,353,331,269,313,275,309,275,309,278,303,353,331,353,331,278,303,281,295,353,331,281,295,324,315,324,315,281,295,320,313,324,315,320,313,320,312,320,312,320,313,315,307,315,307,320,313,284,274,315,307,284,274,284,259,297,-5,284,259,284,89,297,-5,284,89,91,331,353,331,324,315,329,318,353,331,329,318,335,319,353,331,335,319,343,320,353,331,343,320,353,321,306,-5,306,253,297,-5,297,-5,306,253,306,274,297,-5,306,274,284,259,284,259,306,274,308,289,284,259,308,289,311,299,283,285,284,274,320,313,283,285,320,313,281,295,247,320,256,319,353,331,247,320,353,331,235,331,247,320,235,331,235,321,91,331,6,331,19,321,91,331,19,321,29,318,91,331,29,318,37,313,91,331,37,313,46,306,91,331,46,306,55,295,91,331,55,295,76,269,91,331,76,269,297,-5,55,295,78,49,76,75,54,48,49,30,90,20,90,20,49,30,123,0,90,20,123,0,103,13,103,13,123,0,123,9,55,75,54,48,82,31,55,75,82,31,78,49,55,75,78,49,55,295,123,0,6,9,6,0,54,48,90,20,82,31,19,321,6,331,6,321,76,269,55,295,76,75,315,307,284,259,311,299,224,420,234,399,230,422,
-225,378,152,453,148,457,143,460,139,462,131,464,125,463,120,461,116,458,114,454,113,448,113,443,115,439,118,434,128,426,205,378,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,129,378,150,378,227,427,232,431,236,435,239,439,241,443,242,448,241,454,239,458,235,461,230,463,224,464,216,462,212,460,208,457,203,453,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,
-205,378,225,378,152,453,205,378,152,453,148,457,205,378,148,457,143,460,205,378,143,460,139,462,205,378,139,462,135,463,205,378,135,463,131,464,205,378,131,464,128,426,113,448,113,443,114,454,114,454,113,443,115,439,114,454,115,439,116,458,116,458,115,439,118,434,116,458,118,434,120,461,120,461,118,434,123,430,120,461,123,430,125,463,125,463,123,430,128,426,125,463,128,426,131,464,149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,81,24,74,166,46,61,223,19,234,1,235,26,130,25,180,-6,142,19,
-129,378,150,378,227,427,232,431,236,435,239,439,241,443,242,448,241,454,239,458,235,461,230,463,224,464,216,462,212,460,208,457,203,453,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,255,378,193,462,161,462,99,378,117,378,177,430,238,378,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,244,444,240,434,235,427,230,422,224,420,218,419,213,419,208,420,203,422,191,426,
-149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,224,464,227,427,230,463,230,463,227,427,232,431,230,463,232,431,235,461,235,461,232,431,236,435,235,461,236,435,239,458,239,458,236,435,239,439,239,458,239,439,241,454,241,454,239,439,241,443,241,454,241,443,242,448,227,427,224,464,220,463,227,427,220,463,216,462,227,427,216,462,212,460,227,427,212,460,208,457,227,427,208,457,203,453,227,427,203,453,150,378,81,24,74,166,46,61,150,378,203,453,129,378,223,19,234,1,235,26,130,25,180,-6,142,19,
-255,378,193,462,161,462,99,378,117,378,177,430,238,378,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,244,444,240,434,235,427,230,422,224,420,218,419,213,419,208,420,203,422,191,426,180,432,172,436,158,440,151,441,145,441,130,439,118,433,108,423,100,409,94,391,108,391,112,399,116,406,122,410,128,413,134,414,138,414,146,412,150,410,155,408,177,398,185,394,193,392,200,391,206,391,221,393,234,399,244,409,252,424,259,444,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,
-99,378,117,378,161,462,161,462,117,378,177,430,161,462,177,430,193,462,193,462,177,430,238,378,193,462,238,378,255,378,149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,81,24,74,166,46,61,223,19,234,1,235,26,130,25,180,-6,142,19,
-244,444,240,434,235,427,230,422,224,420,218,419,213,419,208,420,203,422,191,426,180,432,172,436,158,440,151,441,145,441,130,439,118,433,108,423,100,409,94,391,108,391,112,399,116,406,122,410,128,413,134,414,138,414,146,412,150,410,155,408,177,398,185,394,193,392,200,391,206,391,221,393,234,399,244,409,252,424,259,444,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,252,411,250,419,247,426,241,431,234,435,227,436,219,435,212,431,207,426,203,419,202,411,203,403,207,397,212,391,218,388,226,387,234,388,241,391,247,397,250,403,252,411,16383,16383,152,411,151,419,147,426,142,431,135,435,127,436,119,435,113,431,107,426,104,419,103,411,104,403,107,397,112,391,119,388,127,387,135,388,142,391,147,397,151,403,152,411,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,
-112,399,116,406,118,433,118,433,116,406,122,410,118,433,122,410,130,439,130,439,122,410,128,413,130,439,128,413,134,414,134,414,138,414,145,441,145,441,138,414,142,413,145,441,142,413,146,412,108,391,112,399,118,433,108,391,118,433,108,423,108,391,108,423,100,409,108,391,100,409,94,391,145,441,146,412,151,441,151,441,146,412,150,410,151,441,150,410,155,408,155,408,166,403,158,440,158,440,166,403,165,438,145,441,130,439,134,414,158,440,151,441,155,408,165,438,166,403,172,436,172,436,166,403,177,398,172,436,177,398,180,432,180,432,177,398,185,394,180,432,185,394,191,426,191,426,185,394,193,392,191,426,193,392,197,424,197,424,193,392,200,391,197,424,200,391,203,422,203,422,200,391,206,391,203,422,206,391,208,420,208,420,206,391,221,393,208,420,221,393,213,419,213,419,221,393,218,419,224,420,218,419,221,393,224,420,221,393,234,399,244,444,240,434,244,409,244,444,244,409,252,424,244,444,252,424,259,444,235,427,230,422,234,399,235,427,234,399,244,409,235,427,244,409,240,434,149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,81,24,74,166,46,61,223,19,234,1,235,26,130,25,180,-6,142,19,224,420,234,399,230,422,
-252,411,250,419,247,426,241,431,234,435,227,436,219,435,212,431,207,426,203,419,202,411,203,403,207,397,212,391,218,388,226,387,234,388,241,391,247,397,250,403,252,411,16383,16383,152,411,151,419,147,426,142,431,135,435,127,436,119,435,113,431,107,426,104,419,103,411,104,403,107,397,112,391,119,388,127,387,135,388,142,391,147,397,151,403,152,411,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,299,11,184,126,299,242,276,265,160,150,45,265,22,242,137,126,22,11,45,-11,160,103,276,-11,329,367,305,367,268,314,250,323,233,330,217,335,200,337,181,338,127,330,81,307,47,270,25,222,17,165,18,147,20,129,24,111,30,94,36,79,48,59,55,50,75,30,28,-39,52,-39,92,18,110,8,127,1,143,-3,161,-5,180,-6,234,1,279,24,314,61,336,109,344,166,343,184,340,203,336,220,331,237,325,252,319,263,313,272,305,281,296,291,285,302,16383,16383,97,61,88,80,82,99,77,119,75,141,74,165,79,218,93,261,115,293,144,313,180,320,196,319,211,315,225,309,238,300,251,287,16383,16383,263,270,272,251,279,232,284,212,286,190,287,165,282,113,268,70,246,38,217,18,180,11,164,12,149,16,135,22,122,32,109,44,227,378,154,453,149,457,145,460,141,462,137,463,132,464,126,463,121,461,118,458,115,454,114,448,115,443,117,439,120,434,124,430,129,426,
-103,411,104,403,104,419,104,419,104,403,107,397,104,419,107,397,107,426,107,426,107,397,112,391,107,426,112,391,113,431,113,431,112,391,119,388,113,431,119,388,119,435,119,435,119,388,127,387,119,435,127,387,127,436,127,436,127,387,135,388,127,436,135,388,135,435,135,435,135,388,142,391,135,435,142,391,142,431,142,431,142,391,147,397,142,431,147,397,147,426,147,426,147,397,151,403,147,426,151,403,151,419,151,419,151,403,152,411,149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,202,411,203,403,203,419,203,419,203,403,207,397,203,419,207,397,207,426,207,426,207,397,212,391,207,426,212,391,212,431,212,431,212,391,218,388,212,431,218,388,219,435,219,435,218,388,226,387,219,435,226,387,227,436,227,436,226,387,234,388,227,436,234,388,234,435,234,435,234,388,241,391,234,435,241,391,241,431,241,431,241,391,247,397,241,431,247,397,247,426,247,426,247,397,250,403,247,426,250,403,250,419,250,419,250,403,252,411,81,24,74,166,46,61,223,19,234,1,235,26,130,25,180,-6,142,19,
-299,11,184,126,299,242,276,265,160,150,45,265,22,242,137,126,22,11,45,-11,160,103,276,-11,329,367,305,367,268,314,250,323,233,330,217,335,200,337,181,338,127,330,81,307,47,270,25,222,
-184,126,299,242,276,265,184,126,276,265,160,150,184,126,160,150,276,-11,184,126,276,-11,299,11,22,11,45,-11,137,126,137,126,45,-11,160,103,137,126,160,103,160,150,160,150,160,103,276,-11,45,265,22,242,137,126,45,265,137,126,160,150,
-329,367,305,367,268,314,250,323,233,330,217,335,200,337,181,338,127,330,81,307,47,270,25,222,17,165,18,147,20,129,24,111,30,94,36,79,48,59,55,50,75,30,28,-39,52,-39,92,18,110,8,127,1,143,-3,161,-5,180,-6,234,1,279,24,314,61,336,109,344,166,343,184,340,203,336,220,331,237,325,252,319,263,313,272,305,281,296,291,285,302,16383,16383,97,61,88,80,82,99,77,119,75,141,74,165,79,218,93,261,115,293,144,313,180,320,196,319,211,315,225,309,238,300,251,287,16383,16383,263,270,272,251,279,232,284,212,286,190,287,165,282,113,268,70,246,38,217,18,180,11,164,12,149,16,135,22,122,32,109,44,227,378,154,453,149,457,145,460,141,462,137,463,132,464,126,463,121,461,118,458,115,454,114,448,115,443,117,439,120,434,124,430,129,426,206,378,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,
-48,59,55,50,81,307,81,307,55,50,64,41,81,307,64,41,74,165,74,165,75,30,75,141,75,141,75,30,77,119,282,113,268,70,279,24,279,24,268,70,246,38,279,24,246,38,234,1,234,1,246,38,217,18,234,1,217,18,180,11,180,11,164,12,180,-6,180,-6,164,12,161,-5,88,80,92,18,97,61,97,61,92,18,110,8,97,61,110,8,109,44,109,44,110,8,122,32,122,32,110,8,127,1,122,32,127,1,135,22,135,22,127,1,143,-3,135,22,143,-3,149,16,149,16,143,-3,161,-5,149,16,161,-5,164,12,92,18,88,80,82,99,92,18,82,99,77,119,92,18,77,119,75,30,92,18,75,30,52,-39,75,30,28,-39,52,-39,109,44,263,270,251,287,251,287,268,314,250,323,251,287,250,323,238,300,238,300,250,323,233,330,238,300,233,330,225,309,225,309,233,330,217,335,225,309,217,335,211,315,211,315,217,335,200,337,211,315,200,337,196,319,196,319,200,337,181,338,196,319,181,338,180,320,343,184,340,203,344,166,344,166,340,203,336,220,344,166,336,220,336,109,336,109,336,220,331,237,336,109,331,237,325,252,319,263,313,272,314,61,319,263,314,61,336,109,319,263,336,109,325,252,279,24,314,61,282,113,282,113,314,61,287,165,296,291,287,165,314,61,296,291,314,61,305,281,305,281,314,61,313,272,180,11,180,-6,234,1,263,270,272,251,268,314,268,314,272,251,285,302,268,314,285,302,305,367,305,367,285,302,329,367,285,302,272,251,279,232,285,302,279,232,284,212,285,302,284,212,286,190,285,302,286,190,296,291,251,287,97,61,109,44,93,261,115,293,127,330,127,330,115,293,144,313,127,330,144,313,181,338,181,338,144,313,180,320,81,307,74,165,79,218,81,307,79,218,93,261,81,307,93,261,127,330,47,270,25,222,30,94,47,270,30,94,36,79,47,270,36,79,42,69,47,270,42,69,48,59,47,270,48,59,81,307,25,222,17,165,18,147,25,222,18,147,20,129,25,222,20,129,24,111,25,222,24,111,30,94,296,291,286,190,287,165,268,314,251,287,263,270,75,30,74,165,64,41,
-227,378,154,453,149,457,145,460,141,462,137,463,132,464,126,463,121,461,118,458,115,454,114,448,115,443,117,439,120,434,124,430,129,426,206,378,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,132,378,152,378,229,427,234,431,238,435,241,439,243,443,244,448,243,454,241,458,237,461,233,463,227,464,222,463,218,462,214,460,210,457,205,453,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,
-206,378,227,378,154,453,206,378,154,453,149,457,206,378,149,457,145,460,206,378,145,460,141,462,206,378,141,462,137,463,206,378,137,463,132,464,206,378,132,464,129,426,114,448,115,443,115,454,115,454,115,443,117,439,115,454,117,439,118,458,118,458,117,439,120,434,118,458,120,434,121,461,121,461,120,434,124,430,121,461,124,430,126,463,126,463,124,430,129,426,126,463,129,426,132,464,105,79,106,8,109,63,109,63,106,8,121,1,109,63,121,1,115,50,115,50,121,1,125,37,135,30,125,37,138,-3,135,30,138,-3,146,24,146,24,138,-3,157,-5,146,24,157,-5,158,19,158,19,157,-5,177,-6,158,19,177,-6,173,16,173,16,177,-6,189,15,208,16,189,15,204,-5,208,16,204,-5,227,0,103,118,103,275,93,16,103,118,93,16,104,97,104,97,93,16,106,8,104,97,106,8,105,79,125,37,121,1,138,-3,283,103,282,85,290,45,290,45,282,85,279,70,290,45,279,70,278,30,278,30,279,70,273,57,278,30,273,57,265,45,265,45,254,34,264,17,264,17,254,34,247,6,241,26,225,20,227,0,241,26,227,0,247,6,241,26,247,6,254,34,353,331,237,331,257,319,353,331,257,319,270,312,353,331,270,312,279,301,353,331,279,301,318,311,353,331,318,311,331,318,353,331,331,318,353,321,305,258,306,282,297,62,305,258,297,62,302,81,305,258,302,81,305,104,305,258,305,104,305,131,290,45,297,62,306,282,290,45,306,282,283,257,290,45,283,257,283,125,290,45,283,125,283,103,310,300,318,311,282,283,310,300,282,283,283,257,310,300,283,257,306,282,265,45,264,17,278,30,189,15,177,-6,204,-5,128,319,148,321,148,331,128,319,148,331,115,314,115,314,148,331,51,297,115,314,51,297,52,280,53,95,52,280,52,124,58,69,66,48,104,293,104,293,66,48,78,30,104,293,78,30,103,275,103,275,78,30,93,16,104,293,108,306,52,280,104,293,52,280,53,95,104,293,53,95,58,69,148,331,7,331,27,319,148,331,27,319,40,315,148,331,40,315,47,308,148,331,47,308,51,297,27,319,7,331,7,321,115,314,52,280,108,306,257,319,237,331,237,321,318,311,279,301,282,283,208,16,227,0,225,20,
-132,378,152,378,229,427,234,431,238,435,241,439,243,443,244,448,243,454,241,458,237,461,233,463,227,464,222,463,218,462,214,460,210,457,205,453,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,256,378,193,462,162,462,100,378,117,378,177,430,238,378,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,252,411,250,419,247,426,241,431,234,435,227,436,219,435,212,431,207,426,203,419,202,411,
-105,79,106,8,109,63,109,63,106,8,121,1,109,63,121,1,115,50,115,50,121,1,125,37,135,30,125,37,138,-3,135,30,138,-3,146,24,146,24,138,-3,157,-5,146,24,157,-5,158,19,158,19,157,-5,177,-6,158,19,177,-6,173,16,173,16,177,-6,189,15,208,16,189,15,204,-5,208,16,204,-5,227,0,103,118,103,275,93,16,103,118,93,16,104,97,104,97,93,16,106,8,104,97,106,8,105,79,125,37,121,1,138,-3,227,464,229,427,233,463,233,463,229,427,234,431,233,463,234,431,237,461,237,461,234,431,238,435,237,461,238,435,241,458,241,458,238,435,241,439,241,458,241,439,243,454,243,454,241,439,243,443,243,454,243,443,244,448,229,427,227,464,222,463,229,427,222,463,218,462,229,427,218,462,214,460,229,427,214,460,210,457,229,427,210,457,205,453,229,427,205,453,152,378,283,103,282,85,290,45,290,45,282,85,279,70,290,45,279,70,278,30,278,30,279,70,273,57,278,30,273,57,265,45,265,45,254,34,264,17,264,17,254,34,247,6,241,26,225,20,227,0,241,26,227,0,247,6,241,26,247,6,254,34,353,331,237,331,257,319,353,331,257,319,270,312,353,331,270,312,279,301,353,331,279,301,318,311,353,331,318,311,331,318,353,331,331,318,353,321,305,258,306,282,297,62,305,258,297,62,302,81,305,258,302,81,305,104,305,258,305,104,305,131,290,45,297,62,306,282,290,45,306,282,283,257,290,45,283,257,283,125,290,45,283,125,283,103,310,300,318,311,282,283,310,300,282,283,283,257,310,300,283,257,306,282,265,45,264,17,278,30,189,15,177,-6,204,-5,128,319,148,321,148,331,128,319,148,331,115,314,115,314,148,331,51,297,115,314,51,297,52,280,53,95,52,280,52,124,58,69,66,48,104,293,104,293,66,48,78,30,104,293,78,30,103,275,103,275,78,30,93,16,104,293,108,306,52,280,104,293,52,280,53,95,104,293,53,95,58,69,148,331,7,331,27,319,148,331,27,319,40,315,148,331,40,315,47,308,148,331,47,308,51,297,27,319,7,331,7,321,115,314,52,280,108,306,257,319,237,331,237,321,318,311,279,301,282,283,208,16,227,0,225,20,152,378,205,453,132,378,
-256,378,193,462,162,462,100,378,117,378,177,430,238,378,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,252,411,250,419,247,426,241,431,234,435,227,436,219,435,212,431,207,426,203,419,202,411,203,403,207,397,212,391,218,388,226,387,234,388,241,391,247,397,250,403,252,411,16383,16383,152,411,151,419,147,426,142,431,135,435,127,436,119,435,113,431,107,426,104,419,103,411,104,403,107,397,112,391,119,388,127,387,135,388,142,391,147,397,151,403,152,411,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,
-100,378,117,378,162,462,162,462,117,378,177,430,162,462,177,430,193,462,193,462,177,430,238,378,193,462,238,378,256,378,105,79,106,8,109,63,109,63,106,8,121,1,109,63,121,1,115,50,115,50,121,1,125,37,135,30,125,37,138,-3,135,30,138,-3,146,24,146,24,138,-3,157,-5,146,24,157,-5,158,19,158,19,157,-5,177,-6,158,19,177,-6,173,16,173,16,177,-6,189,15,208,16,189,15,204,-5,208,16,204,-5,227,0,103,118,103,275,93,16,103,118,93,16,104,97,104,97,93,16,106,8,104,97,106,8,105,79,125,37,121,1,138,-3,283,103,282,85,290,45,290,45,282,85,279,70,290,45,279,70,278,30,278,30,279,70,273,57,278,30,273,57,265,45,265,45,254,34,264,17,264,17,254,34,247,6,241,26,225,20,227,0,241,26,227,0,247,6,241,26,247,6,254,34,353,331,237,331,257,319,353,331,257,319,270,312,353,331,270,312,279,301,353,331,279,301,318,311,353,331,318,311,331,318,353,331,331,318,353,321,305,258,306,282,297,62,305,258,297,62,302,81,305,258,302,81,305,104,305,258,305,104,305,131,290,45,297,62,306,282,290,45,306,282,283,257,290,45,283,257,283,125,290,45,283,125,283,103,310,300,318,311,282,283,310,300,282,283,283,257,310,300,283,257,306,282,265,45,264,17,278,30,189,15,177,-6,204,-5,128,319,148,321,148,331,128,319,148,331,115,314,115,314,148,331,51,297,115,314,51,297,52,280,53,95,52,280,52,124,58,69,66,48,104,293,104,293,66,48,78,30,104,293,78,30,103,275,103,275,78,30,93,16,104,293,108,306,52,280,104,293,52,280,53,95,104,293,53,95,58,69,148,331,7,331,27,319,148,331,27,319,40,315,148,331,40,315,47,308,148,331,47,308,51,297,27,319,7,331,7,321,115,314,52,280,108,306,257,319,237,331,237,321,318,311,279,301,282,283,208,16,227,0,225,20,
-252,411,250,419,247,426,241,431,234,435,227,436,219,435,212,431,207,426,203,419,202,411,203,403,207,397,212,391,218,388,226,387,234,388,241,391,247,397,250,403,252,411,16383,16383,152,411,151,419,147,426,142,431,135,435,127,436,119,435,113,431,107,426,104,419,103,411,104,403,107,397,112,391,119,388,127,387,135,388,142,391,147,397,151,403,152,411,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,133,378,153,378,230,427,240,435,243,439,244,443,245,448,244,454,242,458,238,461,234,463,228,464,223,463,219,462,216,460,211,457,206,453,16383,16383,352,331,243,331,243,321,256,321,266,319,272,316,275,312,276,306,276,302,274,294,272,290,270,285,197,174,124,285,121,289,118,294,116,299,115,304,115,308,116,312,119,316,123,318,130,320,138,321,151,321,151,331,11,331,11,321,24,319,37,313,50,299,68,277,92,243,157,147,157,61,156,39,152,25,144,16,129,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,151,282,266,297,288,310,303,322,313,336,319,352,321,101,266,101,268,100,269,100,271,101,292,105,306,113,314,127,319,147,321,147,331,8,331,8,321,27,319,39,314,46,307,49,294,50,276,50,60,49,39,46,25,39,17,27,12,8,9,8,0,148,0,148,9,128,11,114,16,106,23,102,36,101,55,101,80,109,80,115,79,136,79,158,80,177,82,194,85,210,90,
-202,411,203,403,203,419,203,419,203,403,207,397,203,419,207,397,207,426,207,426,207,397,212,391,207,426,212,391,212,431,212,431,212,391,218,388,212,431,218,388,219,435,219,435,218,388,226,387,219,435,226,387,227,436,227,436,226,387,234,388,227,436,234,388,234,435,234,435,234,388,241,391,234,435,241,391,241,431,241,431,241,391,247,397,241,431,247,397,247,426,247,426,247,397,250,403,247,426,250,403,250,419,250,419,250,403,252,411,103,411,104,403,104,419,104,419,104,403,107,397,104,419,107,397,107,426,107,426,107,397,112,391,107,426,112,391,113,431,113,431,112,391,119,388,113,431,119,388,119,435,119,435,119,388,127,387,119,435,127,387,127,436,127,436,127,387,135,388,127,436,135,388,135,435,135,435,135,388,142,391,135,435,142,391,142,431,142,431,142,391,147,397,142,431,147,397,147,426,147,426,147,397,151,403,147,426,151,403,151,419,151,419,151,403,152,411,105,79,106,8,109,63,109,63,106,8,121,1,109,63,121,1,115,50,115,50,121,1,125,37,135,30,125,37,138,-3,135,30,138,-3,146,24,146,24,138,-3,157,-5,146,24,157,-5,158,19,158,19,157,-5,177,-6,158,19,177,-6,173,16,173,16,177,-6,189,15,208,16,189,15,204,-5,208,16,204,-5,227,0,103,118,103,275,93,16,103,118,93,16,104,97,104,97,93,16,106,8,104,97,106,8,105,79,125,37,121,1,138,-3,283,103,282,85,290,45,290,45,282,85,279,70,290,45,279,70,278,30,278,30,279,70,273,57,278,30,273,57,265,45,265,45,254,34,264,17,264,17,254,34,247,6,241,26,225,20,227,0,241,26,227,0,247,6,241,26,247,6,254,34,353,331,237,331,257,319,353,331,257,319,270,312,353,331,270,312,279,301,353,331,279,301,318,311,353,331,318,311,331,318,353,331,331,318,353,321,305,258,306,282,297,62,305,258,297,62,302,81,305,258,302,81,305,104,305,258,305,104,305,131,290,45,297,62,306,282,290,45,306,282,283,257,290,45,283,257,283,125,290,45,283,125,283,103,310,300,318,311,282,283,310,300,282,283,283,257,310,300,283,257,306,282,265,45,264,17,278,30,189,15,177,-6,204,-5,128,319,148,321,148,331,128,319,148,331,115,314,115,314,148,331,51,297,115,314,51,297,52,280,53,95,52,280,52,124,58,69,66,48,104,293,104,293,66,48,78,30,104,293,78,30,103,275,103,275,78,30,93,16,104,293,108,306,52,280,104,293,52,280,53,95,104,293,53,95,58,69,148,331,7,331,27,319,148,331,27,319,40,315,148,331,40,315,47,308,148,331,47,308,51,297,27,319,7,331,7,321,115,314,52,280,108,306,257,319,237,331,237,321,318,311,279,301,282,283,208,16,227,0,225,20,
-133,378,153,378,230,427,240,435,243,439,244,443,245,448,244,454,242,458,238,461,234,463,228,464,223,463,219,462,216,460,211,457,206,453,16383,16383,352,331,243,331,243,321,256,321,266,319,272,316,275,312,276,306,276,302,274,294,272,290,270,285,197,174,124,285,121,289,118,294,116,299,115,304,115,308,116,312,119,316,123,318,130,320,138,321,151,321,151,331,11,331,11,321,24,319,37,313,50,299,68,277,92,243,157,147,157,61,156,39,152,25,144,16,129,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,151,282,266,297,288,310,303,322,313,336,319,352,321,101,266,101,268,100,269,100,271,101,292,105,306,113,314,127,319,147,321,147,331,8,331,8,321,27,319,39,314,46,307,49,294,50,276,50,60,49,39,46,25,39,17,27,12,8,9,8,0,148,0,148,9,128,11,114,16,106,23,102,36,101,55,101,80,109,80,115,79,136,79,158,80,177,82,194,85,210,90,223,96,239,107,253,121,263,138,269,156,271,175,265,206,248,231,221,250,185,262,141,266,16383,16383,101,230,101,237,103,242,106,245,110,247,117,247,154,244,182,236,201,221,213,200,217,172,213,146,202,126,185,111,161,102,129,99,113,99,107,100,101,100,36,42,36,28,33,19,
-121,289,118,294,157,147,157,147,118,294,116,299,157,147,116,299,92,243,92,243,116,299,115,304,92,243,115,304,115,308,115,308,116,312,92,243,151,331,11,331,24,319,151,331,24,319,37,313,151,331,37,313,50,299,151,331,50,299,123,318,151,331,123,318,130,320,151,331,130,320,138,321,151,331,138,321,151,321,123,318,50,299,119,316,119,316,50,299,68,277,119,316,68,277,116,312,116,312,68,277,92,243,209,55,209,151,197,174,209,55,197,174,210,36,210,36,197,174,157,147,210,36,157,147,215,23,215,23,157,147,157,61,215,23,157,61,224,15,224,15,157,61,156,39,224,15,156,39,260,0,260,0,156,39,152,25,260,0,152,25,144,16,275,298,274,294,282,266,282,266,274,294,272,290,282,266,272,290,270,285,270,285,197,174,209,151,352,331,243,331,256,321,352,331,256,321,266,319,352,331,266,319,272,316,352,331,272,316,275,312,352,331,275,312,276,306,352,331,276,306,322,313,352,331,322,313,336,319,352,331,336,319,352,321,276,306,282,266,297,288,276,306,297,288,310,303,276,306,310,303,322,313,282,266,276,306,276,302,282,266,276,302,275,298,270,285,209,151,282,266,228,464,230,427,234,463,234,463,230,427,235,431,234,463,235,431,238,461,238,461,235,431,240,435,238,461,240,435,242,458,242,458,240,435,243,439,242,458,243,439,244,454,244,454,243,439,244,443,244,454,244,443,245,448,230,427,228,464,223,463,230,427,223,463,219,462,230,427,219,462,216,460,230,427,216,460,211,457,230,427,211,457,206,453,230,427,206,453,153,378,239,11,224,15,260,0,239,11,260,0,260,9,129,12,107,9,260,0,129,12,260,0,144,16,124,285,121,289,157,147,124,285,157,147,197,174,260,0,107,9,107,0,153,378,206,453,133,378,256,321,243,331,243,321,24,319,11,331,11,321,
-101,266,101,268,100,269,100,271,101,292,105,306,113,314,127,319,147,321,147,331,8,331,8,321,27,319,39,314,46,307,49,294,50,276,50,60,49,39,46,25,39,17,27,12,8,9,8,0,148,0,148,9,128,11,114,16,106,23,102,36,101,55,101,80,109,80,115,79,136,79,158,80,177,82,194,85,210,90,223,96,239,107,253,121,263,138,269,156,271,175,265,206,248,231,221,250,185,262,141,266,16383,16383,101,230,101,237,103,242,106,245,110,247,117,247,154,244,182,236,201,221,213,200,217,172,213,146,202,126,185,111,161,102,129,99,113,99,107,100,101,100,36,42,36,28,33,19,28,13,19,9,6,7,6,0,79,0,79,275,81,293,86,308,95,319,107,326,122,328,137,325,150,316,159,302,165,282,167,258,165,237,159,220,150,207,137,199,119,195,114,194,110,193,107,191,105,189,105,184,107,182,110,180,115,179,121,179,145,173,163,161,176,140,184,111,187,75,186,61,185,48,182,36,179,26,175,19,172,15,164,11,160,10,155,10,150,11,146,12,143,15,142,19,141,25,140,36,138,42,135,48,130,52,125,55,118,56,111,55,105,51,100,46,97,40,96,32,98,20,105,10,115,2,129,-2,145,-3,173,0,198,14,
-50,276,102,36,50,276,50,276,102,36,101,55,50,276,101,55,100,271,100,271,101,292,50,276,50,276,101,292,105,306,50,276,105,306,113,314,147,331,8,331,27,319,147,331,27,319,39,314,147,331,39,314,46,307,147,331,46,307,49,294,147,331,49,294,113,314,147,331,113,314,127,319,147,331,127,319,147,321,50,276,113,314,49,294,101,237,103,242,101,266,101,266,103,242,106,245,101,266,106,245,141,266,141,266,106,245,110,247,141,266,110,247,117,247,117,247,154,244,141,266,141,266,154,244,185,262,201,221,213,200,221,250,221,250,213,200,217,172,223,96,217,172,213,146,185,262,154,244,182,236,185,262,182,236,201,221,185,262,201,221,221,250,265,206,248,231,253,121,265,206,253,121,263,138,265,206,263,138,269,156,265,206,269,156,271,175,248,231,221,250,223,96,248,231,223,96,239,107,248,231,239,107,253,121,136,79,158,80,161,102,161,102,158,80,177,82,161,102,177,82,185,111,185,111,177,82,194,85,185,111,194,85,202,126,202,126,194,85,210,90,202,126,210,90,213,146,213,146,210,90,223,96,161,102,129,99,136,79,136,79,129,99,128,79,128,79,129,99,124,99,128,79,124,99,122,79,122,79,124,99,118,99,122,79,118,99,115,79,115,79,118,99,113,99,115,79,113,99,109,80,109,80,113,99,107,100,109,80,107,100,101,100,101,266,101,100,101,230,101,266,101,230,101,237,101,267,101,268,101,55,101,267,101,55,101,100,101,267,101,100,101,266,101,100,101,80,109,80,148,0,148,9,128,11,148,0,128,11,114,16,148,0,114,16,49,39,148,0,49,39,46,25,148,0,46,25,39,17,148,0,39,17,27,12,148,0,27,12,8,9,148,0,8,9,8,0,101,55,101,268,100,269,101,55,100,269,100,270,101,55,100,270,100,271,50,60,49,39,114,16,50,60,114,16,106,23,50,60,106,23,102,36,50,60,102,36,50,276,217,172,223,96,221,250,27,319,8,331,8,321,
-36,42,36,28,33,19,28,13,19,9,6,7,6,0,79,0,79,275,81,293,86,308,95,319,107,326,122,328,137,325,150,316,159,302,165,282,167,258,165,237,159,220,150,207,137,199,119,195,114,194,110,193,107,191,105,189,105,184,107,182,110,180,115,179,121,179,145,173,163,161,176,140,184,111,187,75,186,61,185,48,182,36,179,26,175,19,172,15,164,11,160,10,155,10,150,11,146,12,143,15,142,19,141,25,140,36,138,42,135,48,130,52,125,55,118,56,111,55,105,51,100,46,97,40,96,32,98,20,105,10,115,2,129,-2,145,-3,173,0,198,14,217,35,229,62,234,93,233,110,229,125,223,139,214,152,203,163,193,170,183,176,172,181,158,185,142,189,169,203,189,216,202,230,208,246,210,266,207,291,195,312,178,328,154,338,126,342,93,337,68,324,50,301,40,269,36,227,158,253,86,328,81,332,77,335,73,337,65,339,59,338,53,336,50,333,47,329,46,323,47,318,49,314,52,309,56,305,61,301,138,253,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,
-33,19,28,13,79,0,79,0,28,13,19,9,79,0,19,9,6,7,158,185,142,189,145,173,145,173,142,189,137,199,145,173,137,199,121,179,121,179,137,199,119,195,121,179,119,195,115,179,115,179,119,195,114,194,115,179,114,194,110,180,110,180,114,194,110,193,110,180,110,193,107,182,107,182,110,193,107,191,107,182,107,191,105,184,105,184,107,191,105,189,105,184,105,189,105,187,81,293,86,308,93,337,93,337,86,308,95,319,93,337,95,319,126,342,126,342,95,319,107,326,126,342,107,326,122,328,122,328,137,325,126,342,126,342,137,325,154,338,165,237,169,203,167,258,167,258,169,203,178,328,178,328,169,203,189,216,178,328,189,216,195,312,195,312,189,216,202,230,195,312,202,230,207,291,207,291,202,230,208,246,207,291,208,246,210,266,137,325,150,316,154,338,154,338,150,316,159,302,154,338,159,302,178,328,178,328,159,302,165,282,178,328,165,282,167,258,150,207,142,189,169,203,150,207,169,203,159,220,159,220,169,203,165,237,229,62,234,93,233,110,229,62,233,110,229,125,229,62,229,125,223,139,229,62,223,139,217,35,223,139,214,152,217,35,217,35,214,152,203,163,217,35,203,163,198,14,198,14,203,163,193,170,198,14,193,170,187,75,187,75,193,170,184,111,198,14,187,75,186,61,198,14,186,61,185,48,198,14,185,48,182,36,198,14,182,36,179,26,198,14,179,26,175,19,198,14,175,19,173,0,141,25,140,36,138,42,141,25,138,42,145,-3,141,25,145,-3,142,19,68,324,50,301,79,0,68,324,79,0,79,275,68,324,79,275,81,293,68,324,81,293,93,337,79,0,50,301,40,269,79,0,40,269,36,227,79,0,36,227,36,42,79,0,36,42,36,28,79,0,36,28,33,19,168,13,164,11,173,0,173,0,164,11,160,10,173,0,160,10,155,10,155,10,150,11,173,0,173,0,150,11,146,12,173,0,146,12,145,-3,145,-3,146,12,143,15,145,-3,143,15,142,19,168,13,173,0,172,15,172,15,173,0,175,19,138,42,135,48,145,-3,145,-3,135,48,130,52,145,-3,130,52,129,-2,129,-2,130,52,125,55,129,-2,125,55,118,56,115,2,129,-2,118,56,115,2,118,56,111,55,115,2,111,55,105,51,115,2,105,51,105,10,100,46,97,40,98,20,100,46,98,20,105,10,100,46,105,10,105,51,158,185,163,161,172,181,172,181,163,161,176,140,172,181,176,140,183,176,183,176,176,140,184,111,183,176,184,111,193,170,158,185,145,173,163,161,98,20,97,40,96,32,79,0,6,7,6,0,142,189,150,207,137,199,
-158,253,86,328,81,332,77,335,73,337,65,339,59,338,53,336,50,333,47,329,46,323,47,318,49,314,52,309,56,305,61,301,138,253,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,60,253,79,253,156,302,162,306,166,310,169,314,171,318,171,329,168,333,165,336,160,338,154,339,146,337,142,335,138,332,133,328,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,190,253,
-138,253,158,253,86,328,138,253,86,328,81,332,138,253,81,332,77,335,138,253,77,335,73,337,138,253,73,337,69,338,138,253,69,338,65,339,138,253,65,339,61,301,46,323,47,318,47,329,47,329,47,318,49,314,47,329,49,314,50,333,50,333,49,314,52,309,50,333,52,309,53,336,53,336,52,309,56,305,53,336,56,305,59,338,59,338,56,305,61,301,59,338,61,301,65,339,37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,184,56,186,-3,185,44,29,167,29,183,28,175,
-60,253,79,253,156,302,162,306,166,310,169,314,171,318,171,329,168,333,165,336,160,338,154,339,146,337,142,335,138,332,133,328,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,190,253,128,337,97,337,35,253,52,253,113,305,174,253,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,180,319,175,309,170,302,165,297,160,295,153,294,149,294,144,295,138,297,
-37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,154,339,156,302,160,338,160,338,156,302,162,306,160,338,162,306,165,336,165,336,162,306,166,310,165,336,166,310,168,333,168,333,166,310,169,314,168,333,169,314,171,329,171,329,169,314,171,318,171,329,171,318,171,323,156,302,154,339,150,338,156,302,150,338,146,337,156,302,146,337,142,335,156,302,142,335,138,332,156,302,138,332,133,328,156,302,133,328,79,253,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,79,253,133,328,60,253,184,56,186,-3,185,44,29,167,29,183,28,175,
-190,253,128,337,97,337,35,253,52,253,113,305,174,253,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,180,319,175,309,170,302,165,297,160,295,153,294,149,294,144,295,138,297,133,299,127,301,115,307,108,311,94,315,87,316,80,316,66,314,54,308,43,298,35,284,30,266,44,266,48,274,52,281,57,285,63,288,70,289,73,289,81,287,86,285,90,283,102,278,112,273,121,269,128,267,135,266,142,266,157,268,169,274,180,284,188,299,195,319,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,
-35,253,52,253,97,337,97,337,52,253,113,305,97,337,113,305,128,337,128,337,113,305,174,253,128,337,174,253,190,253,37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,184,56,186,-3,185,44,29,167,29,183,28,175,
-180,319,175,309,170,302,165,297,160,295,153,294,149,294,144,295,138,297,133,299,127,301,115,307,108,311,94,315,87,316,80,316,66,314,54,308,43,298,35,284,30,266,44,266,48,274,52,281,57,285,63,288,70,289,73,289,81,287,86,285,90,283,102,278,112,273,121,269,128,267,135,266,142,266,157,268,169,274,180,284,188,299,195,319,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,186,286,185,294,182,301,176,306,169,310,161,311,154,310,147,306,142,301,138,294,137,286,138,278,142,272,147,266,153,263,161,262,169,263,176,266,182,272,185,278,186,286,16383,16383,87,286,86,294,82,301,77,306,70,310,62,311,54,310,48,306,42,301,39,294,37,286,39,278,42,272,47,266,54,263,61,262,69,263,76,266,82,272,86,278,87,286,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,
-48,274,52,281,54,308,54,308,52,281,57,285,54,308,57,285,66,314,66,314,57,285,63,288,66,314,63,288,70,289,70,289,73,289,80,316,80,316,73,289,77,288,80,316,77,288,81,287,44,266,48,274,54,308,44,266,54,308,43,298,44,266,43,298,35,284,44,266,35,284,30,266,37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,80,316,81,287,87,316,87,316,81,287,86,285,87,316,86,285,90,283,90,283,102,278,94,315,94,315,102,278,101,313,80,316,66,314,70,289,94,315,87,316,90,283,101,313,102,278,108,311,108,311,102,278,112,273,108,311,112,273,115,307,115,307,112,273,121,269,115,307,121,269,127,301,127,301,121,269,128,267,127,301,128,267,133,299,133,299,128,267,135,266,133,299,135,266,138,297,138,297,135,266,142,266,138,297,142,266,144,295,144,295,142,266,157,268,144,295,157,268,149,294,149,294,157,268,153,294,160,295,153,294,157,268,160,295,157,268,169,274,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,180,319,175,309,180,284,180,319,180,284,188,299,180,319,188,299,195,319,170,302,165,297,169,274,170,302,169,274,180,284,170,302,180,284,175,309,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,29,167,29,183,28,175,160,295,169,274,165,297,184,56,186,-3,185,44,
-186,286,185,294,182,301,176,306,169,310,161,311,154,310,147,306,142,301,138,294,137,286,138,278,142,272,147,266,153,263,161,262,169,263,176,266,182,272,185,278,186,286,16383,16383,87,286,86,294,82,301,77,306,70,310,62,311,54,310,48,306,42,301,39,294,37,286,39,278,42,272,47,266,54,263,61,262,69,263,76,266,82,272,86,278,87,286,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,162,306,159,322,152,336,142,347,128,354,113,357,97,354,83,347,72,336,65,323,63,307,65,291,72,277,83,267,96,260,112,257,128,260,141,267,152,277,159,291,162,306,16383,16383,145,307,143,296,139,287,132,280,122,276,112,274,101,276,92,280,85,287,81,296,79,307,81,317,86,326,93,333,102,338,112,339,122,338,131,333,139,326,143,317,145,307,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,
-161,311,161,262,169,310,169,310,161,262,169,263,169,310,169,263,176,306,176,306,169,263,176,266,176,306,176,266,182,301,182,301,176,266,182,272,182,301,182,272,185,294,185,294,182,272,185,278,185,294,185,278,186,286,137,286,138,278,138,294,138,294,138,278,142,272,138,294,142,272,142,301,142,301,142,272,147,266,142,301,147,266,147,306,147,306,147,266,153,263,147,306,153,263,154,310,154,310,153,263,161,262,154,310,161,262,161,311,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,37,286,39,278,39,294,39,294,39,278,42,272,39,294,42,272,42,301,42,301,42,272,47,266,42,301,47,266,48,306,48,306,47,266,54,263,48,306,54,263,54,310,54,310,54,263,61,262,54,310,61,262,62,311,62,311,61,262,69,263,62,311,69,263,70,310,70,310,69,263,76,266,70,310,76,266,77,306,77,306,76,266,82,272,77,306,82,272,82,301,82,301,82,272,86,278,82,301,86,278,86,294,86,294,86,278,87,286,37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,29,167,29,183,28,175,184,56,186,-3,185,44,
-162,306,159,322,152,336,142,347,128,354,113,357,97,354,83,347,72,336,65,323,63,307,65,291,72,277,83,267,96,260,112,257,128,260,141,267,152,277,159,291,162,306,16383,16383,145,307,143,296,139,287,132,280,122,276,112,274,101,276,92,280,85,287,81,296,79,307,81,317,86,326,93,333,102,338,112,339,122,338,131,333,139,326,143,317,145,307,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,310,77,296,58,283,44,269,35,254,30,238,28,226,30,215,33,205,38,197,45,190,54,185,65,181,78,179,93,178,112,177,138,308,138,302,173,292,199,277,216,255,227,228,230,215,229,203,227,192,222,181,216,169,206,157,216,147,222,136,227,123,229,109,230,84,227,62,220,45,208,34,193,30,176,31,168,34,161,38,156,44,153,52,152,59,153,66,156,70,161,73,167,74,175,74,185,73,188,73,196,74,203,79,208,86,213,96,216,107,217,119,215,127,210,133,202,136,189,137,172,137,141,73,123,48,112,32,99,24,84,20,68,19,50,22,32,30,17,42,6,58,0,77,-2,91,-1,105,1,119,7,134,17,153,31,164,18,175,8,188,1,202,-1,218,-2,230,-2,243,0,254,3,266,9,276,17,285,24,293,33,300,44,308,58,316,75,16383,16383,177,153,180,177,186,194,194,206,206,212,221,214,235,212,246,206,254,194,259,177,261,153,16383,16383,137,100,138,90,140,68,146,46,146,45,147,45,147,44,143,38,134,31,121,25,108,21,95,19,83,21,74,28,67,37,64,49,63,63,64,79,71,92,85,103,106,114,137,127,199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,
-143,296,139,287,141,267,141,267,139,287,132,280,141,267,132,280,128,260,128,260,132,280,122,276,128,260,122,276,112,257,112,257,122,276,112,274,63,307,65,291,65,323,65,323,65,291,72,277,65,323,72,277,72,336,72,336,72,277,83,267,72,336,83,267,79,307,79,307,83,347,72,336,37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,113,357,112,339,122,338,113,357,122,338,128,354,128,354,122,338,131,333,128,354,131,333,142,347,142,347,131,333,139,326,142,347,139,326,143,317,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,162,306,159,322,159,291,159,291,159,322,152,336,159,291,152,336,152,277,152,277,152,336,145,307,143,317,145,307,152,336,143,317,152,336,142,347,143,296,141,267,152,277,143,296,152,277,145,307,86,326,93,333,97,354,97,354,93,333,102,338,97,354,102,338,113,357,113,357,102,338,112,339,83,347,79,307,81,317,83,347,81,317,86,326,83,347,86,326,97,354,101,276,92,280,96,260,101,276,96,260,112,257,101,276,112,257,112,274,85,287,81,296,83,267,85,287,83,267,96,260,85,287,96,260,92,280,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,79,307,83,267,81,296,184,56,186,-3,185,44,29,167,29,183,28,175,
-310,77,296,58,283,44,269,35,254,30,238,28,226,30,215,33,205,38,197,45,190,54,185,65,181,78,179,93,178,112,177,138,308,138,302,173,292,199,277,216,255,227,228,230,215,229,203,227,192,222,181,216,169,206,157,216,147,222,136,227,123,229,109,230,84,227,62,220,45,208,34,193,30,176,31,168,34,161,38,156,44,153,52,152,59,153,66,156,70,161,73,167,74,175,74,185,73,188,73,196,74,203,79,208,86,213,96,216,107,217,119,215,127,210,133,202,136,189,137,172,137,141,73,123,48,112,32,99,24,84,20,68,19,50,22,32,30,17,42,6,58,0,77,-2,91,-1,105,1,119,7,134,17,153,31,164,18,175,8,188,1,202,-1,218,-2,230,-2,243,0,254,3,266,9,276,17,285,24,293,33,300,44,308,58,316,75,16383,16383,177,153,180,177,186,194,194,206,206,212,221,214,235,212,246,206,254,194,259,177,261,153,16383,16383,137,100,138,90,140,68,146,46,146,45,147,45,147,44,143,38,134,31,121,25,108,21,95,19,83,21,74,28,67,37,64,49,63,63,64,79,71,92,85,103,106,114,137,127,199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,195,166,198,172,199,179,195,195,184,209,167,220,146,227,122,230,108,229,94,226,80,220,67,213,55,204,40,189,28,172,19,152,14,130,12,106,16,72,27,43,45,20,68,4,96,-3,77,-49,80,-51,83,-50,85,-50,88,-49,94,-49,104,-50,112,-52,117,-55,120,-60,121,-67,120,-74,116,-81,111,-85,103,-88,94,-89,88,-89,82,-88,75,-87,69,-86,61,-83,54,-98,63,-102,79,-106,87,-106,96,-107,117,-105,135,-99,148,-91,156,-79,158,-64,157,-52,151,-43,142,-36,130,-32,116,-30,108,-30,105,-31,103,-31,113,-4,136,0,156,9,174,24,190,46,206,74,155,253,83,328,78,332,74,335,69,337,61,339,55,338,50,336,46,333,44,329,43,323,44,318,46,314,49,309,53,305,58,301,135,253,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,
-73,196,73,196,73,196,73,196,74,203,62,220,73,196,62,220,66,156,73,196,66,156,70,161,143,38,134,31,134,17,134,17,134,31,121,25,134,17,121,25,119,7,119,7,121,25,108,21,119,7,108,21,105,1,105,1,108,21,95,19,105,1,95,19,91,-1,91,-1,95,19,83,21,91,-1,83,21,77,-2,77,-2,83,21,74,28,77,-2,74,28,67,37,63,63,58,0,64,49,64,49,58,0,77,-2,64,49,77,-2,67,37,74,203,79,208,84,227,84,227,79,208,86,213,84,227,86,213,109,230,109,230,86,213,96,216,109,230,96,216,107,217,107,217,119,215,109,230,109,230,119,215,123,229,175,8,177,138,169,206,175,8,169,206,164,18,164,18,169,206,157,216,164,18,157,216,153,31,153,31,157,216,147,44,147,45,147,44,147,222,147,222,147,44,157,216,147,222,136,227,136,189,147,222,136,189,137,172,147,222,137,172,137,127,147,222,137,127,138,90,147,222,138,90,139,79,147,222,139,79,140,68,147,222,140,68,143,57,147,222,143,57,146,46,147,222,146,46,146,45,147,222,146,45,147,45,137,141,137,127,137,172,136,227,123,229,127,210,136,227,127,210,133,202,136,227,133,202,136,189,228,230,221,214,235,212,228,230,235,212,255,227,255,227,235,212,246,206,255,227,246,206,254,194,177,153,180,177,181,216,181,216,180,177,186,194,181,216,186,194,192,222,192,222,186,194,194,206,192,222,194,206,203,227,203,227,194,206,206,212,203,227,206,212,215,229,215,229,206,212,221,214,215,229,221,214,228,230,277,216,261,153,308,138,308,138,261,153,177,153,308,138,177,153,177,138,169,206,177,138,177,153,169,206,177,153,181,216,259,177,261,153,277,216,259,177,277,216,255,227,259,177,255,227,254,194,292,199,277,216,308,138,292,199,308,138,302,173,226,30,215,33,218,-2,218,-2,215,33,205,38,218,-2,205,38,202,-1,202,-1,205,38,197,45,202,-1,197,45,190,54,190,54,185,65,188,1,188,1,185,65,181,78,188,1,181,78,179,93,175,8,188,1,179,93,175,8,179,93,178,112,175,8,178,112,177,138,218,-2,230,-2,226,30,226,30,230,-2,238,28,254,30,238,28,243,0,254,30,243,0,254,3,190,54,188,1,202,-1,285,24,293,33,296,58,296,58,293,33,300,44,296,58,300,44,310,77,310,77,300,44,308,58,310,77,308,58,316,75,254,3,266,9,269,35,269,35,266,9,276,17,269,35,276,17,283,44,283,44,276,17,285,24,283,44,285,24,296,58,238,28,230,-2,243,0,143,38,134,17,153,31,143,38,153,31,147,44,64,79,71,92,73,123,73,123,71,92,85,103,73,123,85,103,137,141,137,141,85,103,106,114,137,141,106,114,137,127,42,6,58,0,48,112,48,112,58,0,63,63,48,112,63,63,64,79,20,68,22,32,24,84,24,84,22,32,30,17,24,84,30,17,32,99,32,99,30,17,42,6,32,99,42,6,48,112,38,156,44,153,45,208,45,208,44,153,52,152,45,208,52,152,62,220,62,220,52,152,59,153,62,220,59,153,66,156,34,193,30,176,31,168,34,193,31,168,34,161,34,193,34,161,38,156,34,193,38,156,45,208,74,185,73,188,73,167,74,185,73,167,74,175,74,185,74,175,74,180,73,167,73,188,73,192,73,167,73,192,73,196,73,167,73,196,70,161,62,220,74,203,84,227,22,32,20,68,19,50,48,112,64,79,73,123,138,90,137,127,137,100,254,30,254,3,269,35,123,229,119,215,127,210,
-199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,195,166,198,172,199,179,195,195,184,209,167,220,146,227,122,230,108,229,94,226,80,220,67,213,55,204,40,189,28,172,19,152,14,130,12,106,16,72,27,43,45,20,68,4,96,-3,77,-49,80,-51,83,-50,85,-50,88,-49,94,-49,104,-50,112,-52,117,-55,120,-60,121,-67,120,-74,116,-81,111,-85,103,-88,94,-89,88,-89,82,-88,75,-87,69,-86,61,-83,54,-98,63,-102,79,-106,87,-106,96,-107,117,-105,135,-99,148,-91,156,-79,158,-64,157,-52,151,-43,142,-36,130,-32,116,-30,108,-30,105,-31,103,-31,113,-4,136,0,156,9,174,24,190,46,206,74,155,253,83,328,78,332,74,335,69,337,61,339,55,338,50,336,46,333,44,329,43,323,44,318,46,314,49,309,53,305,58,301,135,253,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,58,253,78,253,155,302,161,306,165,310,168,314,170,318,170,323,169,329,167,333,163,336,158,338,152,339,148,338,145,337,141,335,137,332,132,328,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,
-81,49,65,69,68,4,68,4,65,69,54,96,68,4,54,96,45,20,45,20,54,96,51,128,55,204,51,128,54,157,55,204,54,157,63,181,87,-106,96,-107,88,-89,88,-89,96,-107,94,-89,103,-88,94,-89,96,-107,103,-88,96,-107,117,-105,96,-3,94,-49,104,-50,96,-3,104,-50,103,-31,96,-3,103,-31,103,36,103,36,103,-31,113,-4,96,-3,77,-49,80,-51,96,-3,80,-51,83,-50,96,-3,83,-50,85,-50,96,-3,85,-50,88,-49,96,-3,88,-49,91,-49,96,-3,91,-49,94,-49,185,60,172,46,174,24,174,24,172,46,159,38,174,24,159,38,156,9,156,9,159,38,144,33,156,9,144,33,136,0,136,0,144,33,128,31,113,-4,136,0,128,31,113,-4,128,31,103,36,81,49,68,4,96,-3,81,49,96,-3,103,36,136,212,141,208,146,227,146,227,141,208,145,201,146,227,145,201,148,191,148,191,151,180,167,220,167,220,151,180,154,172,167,220,154,172,159,166,122,230,119,215,128,215,122,230,128,215,146,227,146,227,128,215,136,212,195,195,184,209,189,161,195,195,189,161,195,166,195,195,195,166,198,172,195,195,198,172,199,179,184,209,167,220,169,158,184,209,169,158,175,157,184,209,175,157,183,158,184,209,183,158,189,161,167,220,159,166,163,161,167,220,163,161,169,158,167,220,146,227,148,191,190,46,206,74,199,78,190,46,199,78,185,60,190,46,185,60,174,24,96,211,119,215,108,229,96,211,108,229,94,226,96,211,94,226,80,220,96,211,80,220,78,200,67,213,55,204,63,181,67,213,63,181,78,200,67,213,78,200,80,220,45,20,51,128,55,204,45,20,55,204,40,189,45,20,40,189,28,172,45,20,28,172,27,43,19,152,14,130,16,72,19,152,16,72,27,43,19,152,27,43,28,172,158,-64,157,-52,156,-79,156,-79,157,-52,151,-43,156,-79,151,-43,148,-91,148,-91,151,-43,142,-36,148,-91,142,-36,135,-99,135,-99,142,-36,130,-32,135,-99,130,-32,121,-67,121,-67,130,-32,120,-60,117,-55,120,-60,130,-32,117,-55,130,-32,116,-30,117,-55,116,-30,113,-30,117,-55,113,-30,112,-52,112,-52,113,-30,110,-30,112,-52,110,-30,108,-30,112,-52,108,-30,105,-31,112,-52,105,-31,104,-50,135,-99,121,-67,120,-74,135,-99,120,-74,117,-105,117,-105,120,-74,116,-81,117,-105,116,-81,111,-85,61,-83,63,-102,69,-86,69,-86,63,-102,71,-104,69,-86,71,-104,75,-87,75,-87,71,-104,79,-106,75,-87,79,-106,82,-88,82,-88,79,-106,87,-106,82,-88,87,-106,88,-89,63,-102,61,-83,54,-98,103,-88,117,-105,111,-85,103,-31,104,-50,105,-31,119,215,122,230,108,229,16,72,14,130,12,106,
-155,253,83,328,78,332,74,335,69,337,61,339,55,338,50,336,46,333,44,329,43,323,44,318,46,314,49,309,53,305,58,301,135,253,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,58,253,78,253,155,302,161,306,165,310,168,314,170,318,170,323,169,329,167,333,163,336,158,338,152,339,148,338,145,337,141,335,137,332,132,328,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,
-56,85,75,0,62,71,62,71,75,0,71,57,80,47,71,57,75,0,80,47,75,0,108,-4,52,100,50,118,49,15,52,100,49,15,75,0,52,100,75,0,56,85,12,108,17,70,17,148,17,148,17,70,29,39,17,148,29,39,31,182,31,182,29,39,49,15,31,182,49,15,49,138,49,138,49,15,50,118,135,253,155,253,83,328,135,253,83,328,78,332,135,253,78,332,74,335,135,253,74,335,69,337,135,253,69,337,65,338,135,253,65,338,61,339,135,253,61,339,58,301,43,323,44,318,44,329,44,329,44,318,46,314,44,329,46,314,46,333,46,333,46,314,49,309,46,333,49,309,50,336,50,336,49,309,53,305,50,336,53,305,55,338,55,338,53,305,58,301,55,338,58,301,61,339,133,228,116,230,120,210,120,210,116,230,103,212,87,210,103,212,116,230,87,210,116,230,81,224,190,62,176,48,181,26,181,26,176,48,162,37,181,26,162,37,160,9,160,9,162,37,146,31,160,9,146,31,136,-1,136,-1,146,31,127,30,203,138,201,153,198,166,203,138,198,166,195,177,203,138,195,177,190,186,203,138,190,186,185,195,203,138,185,195,175,207,203,138,175,207,163,217,203,138,163,217,151,155,203,138,151,155,50,155,203,138,50,155,49,138,141,192,147,176,149,224,149,224,147,176,151,155,149,224,151,155,163,217,198,49,212,79,204,82,198,49,204,82,190,62,198,49,190,62,181,26,114,31,101,34,108,-4,114,31,108,-4,136,-1,114,31,136,-1,127,30,90,39,80,47,108,-4,90,39,108,-4,101,34,133,228,120,210,133,203,133,228,133,203,141,192,133,228,141,192,149,224,50,155,55,175,52,207,52,207,55,175,63,191,52,207,63,191,81,224,81,224,63,191,74,203,81,224,74,203,87,210,52,207,31,182,49,138,52,207,49,138,50,155,
-58,253,78,253,155,302,161,306,165,310,168,314,170,318,170,323,169,329,167,333,163,336,158,338,152,339,148,338,145,337,141,335,137,332,132,328,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,190,253,127,337,97,337,35,253,51,253,112,305,173,253,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,186,286,185,294,181,301,176,306,169,310,161,311,153,310,147,306,141,301,138,294,137,286,
-203,138,201,153,198,166,203,138,198,166,195,177,203,138,195,177,190,186,203,138,190,186,185,195,203,138,185,195,175,207,203,138,175,207,163,217,203,138,163,217,151,155,203,138,151,155,50,155,203,138,50,155,49,138,141,192,147,176,149,224,149,224,147,176,151,155,149,224,151,155,163,217,152,339,155,302,158,338,158,338,155,302,161,306,158,338,161,306,163,336,163,336,161,306,165,310,163,336,165,310,167,333,167,333,165,310,168,314,167,333,168,314,169,329,169,329,168,314,170,318,169,329,170,318,170,323,155,302,152,339,148,338,155,302,148,338,145,337,155,302,145,337,141,335,155,302,141,335,137,332,155,302,137,332,132,328,155,302,132,328,78,253,52,100,50,118,49,15,49,15,50,118,49,138,49,15,49,138,31,182,49,15,31,182,29,39,29,39,31,182,17,148,29,39,17,148,17,70,17,70,17,148,12,108,133,228,116,230,120,210,120,210,116,230,103,212,87,210,103,212,116,230,87,210,116,230,81,224,190,62,176,48,181,26,181,26,176,48,162,37,181,26,162,37,160,9,160,9,162,37,146,31,160,9,146,31,136,-1,136,-1,146,31,127,30,198,49,212,79,204,82,198,49,204,82,190,62,198,49,190,62,181,26,114,31,101,34,108,-4,114,31,108,-4,136,-1,114,31,136,-1,127,30,101,34,90,39,108,-4,108,-4,90,39,80,47,108,-4,80,47,75,0,75,0,80,47,71,57,133,228,120,210,133,203,133,228,133,203,141,192,133,228,141,192,149,224,50,155,55,175,52,207,52,207,55,175,63,191,52,207,63,191,81,224,81,224,63,191,74,203,81,224,74,203,87,210,52,207,31,182,49,138,52,207,49,138,50,155,75,0,71,57,62,71,75,0,62,71,56,85,75,0,56,85,52,100,75,0,52,100,49,15,78,253,132,328,58,253,
-190,253,127,337,97,337,35,253,51,253,112,305,173,253,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,186,286,185,294,181,301,176,306,169,310,161,311,153,310,147,306,141,301,138,294,137,286,138,278,141,272,146,266,153,263,161,262,169,263,176,266,181,272,185,278,186,286,16383,16383,86,286,85,294,82,301,76,306,69,310,61,311,54,310,47,306,42,301,38,294,37,286,38,278,41,272,47,266,53,263,61,262,69,263,76,266,81,272,85,278,86,286,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,
-35,253,51,253,97,337,97,337,51,253,112,305,97,337,112,305,127,337,127,337,112,305,173,253,127,337,173,253,190,253,52,100,50,118,49,15,49,15,50,118,49,138,49,15,49,138,31,182,49,15,31,182,29,39,29,39,31,182,17,148,29,39,17,148,17,70,17,70,17,148,12,108,133,228,116,230,120,210,120,210,116,230,103,212,87,210,103,212,116,230,87,210,116,230,81,224,190,62,176,48,181,26,181,26,176,48,162,37,181,26,162,37,160,9,160,9,162,37,146,31,160,9,146,31,136,-1,136,-1,146,31,127,30,203,138,201,153,198,166,203,138,198,166,195,177,203,138,195,177,190,186,203,138,190,186,185,195,203,138,185,195,175,207,203,138,175,207,163,217,203,138,163,217,151,155,203,138,151,155,50,155,203,138,50,155,49,138,141,192,147,176,149,224,149,224,147,176,151,155,149,224,151,155,163,217,198,49,212,79,204,82,198,49,204,82,190,62,198,49,190,62,181,26,114,31,101,34,108,-4,114,31,108,-4,136,-1,114,31,136,-1,127,30,101,34,90,39,108,-4,108,-4,90,39,80,47,108,-4,80,47,75,0,75,0,80,47,71,57,133,228,120,210,133,203,133,228,133,203,141,192,133,228,141,192,149,224,50,155,55,175,52,207,52,207,55,175,63,191,52,207,63,191,81,224,81,224,63,191,74,203,81,224,74,203,87,210,52,207,31,182,49,138,52,207,49,138,50,155,75,0,71,57,62,71,75,0,62,71,56,85,75,0,56,85,52,100,75,0,52,100,49,15,
-186,286,185,294,181,301,176,306,169,310,161,311,153,310,147,306,141,301,138,294,137,286,138,278,141,272,146,266,153,263,161,262,169,263,176,266,181,272,185,278,186,286,16383,16383,86,286,85,294,82,301,76,306,69,310,61,311,54,310,47,306,42,301,38,294,37,286,38,278,41,272,47,266,53,263,61,262,69,263,76,266,81,272,85,278,86,286,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,115,253,42,328,38,332,33,335,29,337,21,339,15,338,10,336,6,333,4,329,3,323,3,318,5,314,8,309,18,301,95,253,16383,16383,122,0,122,7,105,9,94,14,88,21,85,34,84,52,84,228,82,230,5,203,5,195,15,197,26,197,33,196,37,193,40,187,42,178,42,33,38,20,32,13,20,9,3,7,3,0,25,253,45,253,122,302,127,306,131,310,134,314,136,318,137,323,136,329,134,333,130,336,125,338,119,339,111,337,107,335,103,332,98,328,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,87,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,8,0,147,253,84,337,54,337,-7,253,8,253,69,305,130,253,16383,16383,110,0,110,7,93,9,83,14,77,21,74,34,73,52,73,228,
-203,138,201,153,198,166,203,138,198,166,195,177,203,138,195,177,190,186,203,138,190,186,185,195,203,138,185,195,175,207,203,138,175,207,163,217,203,138,163,217,151,155,203,138,151,155,50,155,203,138,50,155,49,138,141,192,147,176,149,224,149,224,147,176,151,155,149,224,151,155,163,217,137,286,138,278,138,294,138,294,138,278,141,272,138,294,141,272,141,301,141,301,141,272,146,266,141,301,146,266,147,306,147,306,146,266,153,263,147,306,153,263,153,310,153,310,153,263,161,262,153,310,161,262,161,311,161,311,161,262,169,263,161,311,169,263,169,310,169,310,169,263,176,266,169,310,176,266,176,306,176,306,176,266,181,272,176,306,181,272,181,301,181,301,181,272,185,278,181,301,185,278,185,294,185,294,185,278,186,286,37,286,38,278,38,294,38,294,38,278,41,272,38,294,41,272,42,301,42,301,41,272,47,266,42,301,47,266,47,306,47,306,47,266,53,263,47,306,53,263,54,310,54,310,53,263,61,262,54,310,61,262,61,311,61,311,61,262,69,263,61,311,69,263,69,310,69,310,69,263,76,266,69,310,76,266,76,306,76,306,76,266,81,272,76,306,81,272,82,301,82,301,81,272,85,278,82,301,85,278,85,294,85,294,85,278,86,286,52,100,50,118,49,15,49,15,50,118,49,138,49,15,49,138,31,182,49,15,31,182,29,39,29,39,31,182,17,148,29,39,17,148,17,70,17,70,17,148,12,108,133,228,116,230,120,210,120,210,116,230,103,212,87,210,103,212,116,230,87,210,116,230,81,224,190,62,176,48,181,26,181,26,176,48,162,37,181,26,162,37,160,9,160,9,162,37,146,31,160,9,146,31,136,-1,136,-1,146,31,127,30,198,49,212,79,204,82,198,49,204,82,190,62,198,49,190,62,181,26,114,31,101,34,108,-4,114,31,108,-4,136,-1,114,31,136,-1,127,30,101,34,90,39,108,-4,108,-4,90,39,80,47,108,-4,80,47,75,0,75,0,80,47,71,57,133,228,120,210,133,203,133,228,133,203,141,192,133,228,141,192,149,224,50,155,55,175,52,207,52,207,55,175,63,191,52,207,63,191,81,224,81,224,63,191,74,203,81,224,74,203,87,210,52,207,31,182,49,138,52,207,49,138,50,155,75,0,71,57,62,71,75,0,62,71,56,85,75,0,56,85,52,100,75,0,52,100,49,15,
-115,253,42,328,38,332,33,335,29,337,21,339,15,338,10,336,6,333,4,329,3,323,3,318,5,314,8,309,18,301,95,253,16383,16383,122,0,122,7,105,9,94,14,88,21,85,34,84,52,84,228,82,230,5,203,5,195,15,197,26,197,33,196,37,193,40,187,42,178,42,33,38,20,32,13,20,9,3,7,3,0,25,253,45,253,122,302,127,306,131,310,134,314,136,318,137,323,136,329,134,333,130,336,125,338,119,339,111,337,107,335,103,332,98,328,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,87,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,
-95,253,115,253,42,328,95,253,42,328,38,332,95,253,38,332,33,335,95,253,33,335,29,337,95,253,29,337,25,338,95,253,25,338,21,339,95,253,21,339,18,301,3,323,3,318,4,329,4,329,3,318,5,314,4,329,5,314,6,333,6,333,5,314,8,309,6,333,8,309,10,336,10,336,8,309,13,305,10,336,13,305,15,338,15,338,13,305,18,301,15,338,18,301,21,339,38,20,32,13,122,0,122,0,32,13,20,9,122,0,20,9,3,7,15,197,19,197,82,230,82,230,19,197,23,197,82,230,23,197,26,197,26,197,33,196,82,230,82,230,33,196,37,193,82,230,37,193,40,187,38,20,122,0,42,33,42,33,122,0,94,14,42,33,94,14,42,52,42,52,94,14,88,21,42,52,88,21,42,166,42,178,42,166,82,230,42,178,82,230,40,187,10,196,15,197,82,230,10,196,82,230,5,203,10,196,5,203,5,195,84,52,84,228,82,230,84,52,82,230,42,166,84,52,42,166,85,34,105,9,94,14,122,0,105,9,122,0,122,7,122,0,3,7,3,0,42,166,88,21,85,34,
-25,253,45,253,122,302,127,306,131,310,134,314,136,318,137,323,136,329,134,333,130,336,125,338,119,339,111,337,107,335,103,332,98,328,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,87,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,8,0,147,253,84,337,54,337,-7,253,8,253,69,305,130,253,16383,16383,110,0,110,7,93,9,83,14,77,21,74,34,73,52,73,228,70,230,-6,203,-6,195,0,196,3,197,15,197,21,196,26,193,29,187,31,178,31,52,30,33,27,20,21,13,9,9,-7,7,-7,0,144,286,143,294,139,301,133,306,127,310,119,311,111,310,104,306,
-119,339,122,302,125,338,125,338,122,302,127,306,125,338,127,306,130,336,130,336,127,306,131,310,130,336,131,310,134,333,134,333,131,310,134,314,134,333,134,314,136,329,136,329,134,314,136,318,136,329,136,318,137,323,122,302,119,339,115,338,122,302,115,338,111,337,122,302,111,337,107,335,122,302,107,335,103,332,122,302,103,332,98,328,122,302,98,328,45,253,43,20,37,13,127,0,127,0,37,13,25,9,127,0,25,9,8,7,20,197,24,197,87,230,87,230,24,197,28,197,87,230,28,197,31,197,31,197,38,196,87,230,87,230,38,196,42,193,87,230,42,193,45,187,43,20,127,0,47,33,47,33,127,0,99,14,47,33,99,14,47,52,47,52,99,14,93,21,47,52,93,21,47,166,47,178,47,166,87,230,47,178,87,230,45,187,15,196,20,197,87,230,15,196,87,230,10,203,15,196,10,203,10,195,89,52,89,228,87,230,89,52,87,230,47,166,89,52,47,166,90,34,110,9,99,14,127,0,110,9,127,0,127,7,127,0,8,7,8,0,47,166,93,21,90,34,45,253,98,328,25,253,
-147,253,84,337,54,337,-7,253,8,253,69,305,130,253,16383,16383,110,0,110,7,93,9,83,14,77,21,74,34,73,52,73,228,70,230,-6,203,-6,195,0,196,3,197,15,197,21,196,26,193,29,187,31,178,31,52,30,33,27,20,21,13,9,9,-7,7,-7,0,144,286,143,294,139,301,133,306,127,310,119,311,111,310,104,306,99,301,96,294,94,286,96,278,99,272,104,266,111,263,118,262,126,263,133,266,139,272,143,278,144,286,16383,16383,45,286,43,294,40,301,34,306,27,310,20,311,12,310,5,306,0,301,-3,294,-4,286,
--7,253,8,253,54,337,54,337,8,253,69,305,54,337,69,305,84,337,84,337,69,305,130,253,84,337,130,253,147,253,27,20,21,13,110,0,110,0,21,13,9,9,110,0,9,9,-7,7,3,197,8,197,70,230,70,230,8,197,11,197,70,230,11,197,15,197,15,197,21,196,70,230,70,230,21,196,26,193,70,230,26,193,29,187,31,166,31,52,77,21,31,166,77,21,74,34,31,166,74,34,73,52,31,166,73,52,70,230,31,166,70,230,31,178,0,196,3,197,70,230,0,196,70,230,-6,203,0,196,-6,203,-6,195,73,52,73,228,70,230,110,0,110,7,93,9,110,0,93,9,83,14,110,0,83,14,30,33,110,0,30,33,27,20,31,52,30,33,83,14,31,52,83,14,77,21,110,0,-7,7,-7,0,70,230,29,187,31,178,
-144,286,143,294,139,301,133,306,127,310,119,311,111,310,104,306,99,301,96,294,94,286,96,278,99,272,104,266,111,263,118,262,126,263,133,266,139,272,143,278,144,286,16383,16383,45,286,43,294,40,301,34,306,27,310,20,311,12,310,5,306,0,301,-3,294,-4,286,-3,278,0,272,5,266,11,263,19,262,27,263,34,266,40,272,43,278,45,286,16383,16383,113,0,113,7,97,9,86,14,80,21,77,34,76,52,76,228,74,230,-2,203,-2,195,2,196,7,197,18,197,25,196,29,193,32,187,34,178,35,166,35,52,34,33,31,20,24,13,12,9,-4,7,-4,0,212,328,195,343,148,318,135,326,122,332,107,337,90,340,71,342,50,329,66,326,80,323,93,318,105,311,118,302,57,270,74,255,135,287,151,272,163,256,172,239,179,220,184,200,170,212,159,221,148,226,136,229,123,230,89,224,59,208,35,182,20,148,15,108,20,70,35,38,58,15,88,0,123,-4,145,-2,165,3,182,13,196,26,209,44,218,60,225,79,231,99,234,120,235,142,233,179,225,215,211,248,192,278,166,304,16383,16383,190,101,187,69,179,44,167,25,151,13,132,9,104,18,83,41,70,73,62,108,60,141,62,165,70,185,83,201,99,212,118,216,142,211,
-31,20,113,0,34,33,34,33,113,0,86,14,34,33,86,14,35,52,35,52,86,14,80,21,35,52,80,21,35,166,35,166,80,21,77,34,35,166,77,34,76,52,74,230,-2,203,2,196,74,230,2,196,7,197,74,230,7,197,11,197,74,230,11,197,15,197,74,230,15,197,18,197,74,230,18,197,25,196,74,230,25,196,29,193,74,230,29,193,32,187,74,230,32,187,34,178,74,230,34,178,35,166,74,230,35,166,76,52,74,230,76,52,76,228,94,286,96,278,96,294,96,294,96,278,99,272,96,294,99,272,99,301,99,301,99,272,104,266,99,301,104,266,104,306,104,306,104,266,111,263,104,306,111,263,111,310,111,310,111,263,118,262,111,310,118,262,119,311,119,311,118,262,126,263,119,311,126,263,127,310,127,310,126,263,133,266,127,310,133,266,133,306,133,306,133,266,139,272,133,306,139,272,139,301,139,301,139,272,143,278,139,301,143,278,143,294,143,294,143,278,144,286,97,9,86,14,113,0,97,9,113,0,113,7,113,0,31,20,24,13,113,0,24,13,12,9,113,0,12,9,-4,7,113,0,-4,7,-4,0,-4,286,-3,278,-3,294,-3,294,-3,278,0,272,-3,294,0,272,0,301,0,301,0,272,5,266,0,301,5,266,5,306,5,306,5,266,11,263,5,306,11,263,12,310,12,310,11,263,19,262,12,310,19,262,20,311,20,311,19,262,27,263,20,311,27,263,27,310,27,310,27,263,34,266,27,310,34,266,34,306,34,306,34,266,40,272,34,306,40,272,40,301,40,301,40,272,43,278,40,301,43,278,43,294,43,294,43,278,45,286,2,196,-2,203,-2,195,
-212,328,195,343,148,318,135,326,122,332,107,337,90,340,71,342,50,329,66,326,80,323,93,318,105,311,118,302,57,270,74,255,135,287,151,272,163,256,172,239,179,220,184,200,170,212,159,221,148,226,136,229,123,230,89,224,59,208,35,182,20,148,15,108,20,70,35,38,58,15,88,0,123,-4,145,-2,165,3,182,13,196,26,209,44,218,60,225,79,231,99,234,120,235,142,233,179,225,215,211,248,192,278,166,304,16383,16383,190,101,187,69,179,44,167,25,151,13,132,9,104,18,83,41,70,73,62,108,60,141,62,165,70,185,83,201,99,212,118,216,142,211,162,195,177,171,187,139,190,101,196,319,191,309,186,302,181,297,176,295,170,294,165,294,160,295,154,297,149,299,143,301,131,307,124,311,110,315,103,316,96,316,82,314,70,308,59,298,51,284,46,266,60,266,64,274,68,281,73,285,79,288,85,289,89,289,97,287,102,285,106,283,118,278,128,273,137,269,144,267,151,266,158,266,173,268,185,274,195,284,203,299,210,319,16383,16383,243,0,243,7,230,9,221,13,216,19,213,29,212,42,212,153,210,180,202,201,190,217,174,227,153,230,139,229,125,224,111,216,96,205,81,190,80,190,80,228,76,230,50,220,37,216,23,212,8,208,8,199,10,200,13,200,16,201,22,201,30,200,
-136,229,123,230,142,211,142,211,123,230,118,216,99,212,118,216,123,230,99,212,123,230,89,224,122,332,118,302,135,287,122,332,135,287,135,326,135,326,135,287,151,272,135,326,151,272,148,318,148,318,151,272,166,304,148,318,166,304,195,343,195,343,166,304,212,328,107,337,90,340,93,318,107,337,93,318,105,311,107,337,105,311,118,302,107,337,118,302,122,332,50,329,66,326,71,342,71,342,66,326,80,323,71,342,80,323,90,340,90,340,80,323,93,318,187,69,179,44,182,13,182,13,179,44,167,25,182,13,167,25,165,3,165,3,167,25,151,13,165,3,151,13,145,-2,145,-2,151,13,132,9,145,-2,132,9,123,-4,123,-4,132,9,104,18,123,-4,104,18,88,0,88,0,104,18,83,41,88,0,83,41,70,73,88,0,70,73,58,15,58,15,70,73,62,108,58,15,62,108,60,141,60,141,62,165,59,208,59,208,62,165,70,185,59,208,70,185,89,224,89,224,70,185,83,201,89,224,83,201,99,212,15,108,20,70,20,148,20,148,20,70,35,38,20,148,35,38,35,182,35,182,35,38,58,15,35,182,58,15,59,208,59,208,58,15,60,141,151,272,163,256,166,304,166,304,163,256,172,239,166,304,172,239,192,278,192,278,172,239,179,220,192,278,179,220,184,200,118,302,57,270,74,255,118,302,74,255,135,287,184,200,187,139,192,278,192,278,187,139,190,101,196,26,190,101,187,69,233,179,225,215,225,79,233,179,225,79,231,99,233,179,231,99,234,120,233,179,234,120,235,142,196,26,209,44,211,248,211,248,209,44,218,60,211,248,218,60,225,215,225,215,218,60,225,79,192,278,190,101,196,26,192,278,196,26,211,248,187,139,184,200,177,171,177,171,184,200,170,212,177,171,170,212,162,195,162,195,170,212,159,221,162,195,159,221,148,226,148,226,136,229,142,211,148,226,142,211,162,195,187,69,182,13,196,26,
-196,319,191,309,186,302,181,297,176,295,170,294,165,294,160,295,154,297,149,299,143,301,131,307,124,311,110,315,103,316,96,316,82,314,70,308,59,298,51,284,46,266,60,266,64,274,68,281,73,285,79,288,85,289,89,289,97,287,102,285,106,283,118,278,128,273,137,269,144,267,151,266,158,266,173,268,185,274,195,284,203,299,210,319,16383,16383,243,0,243,7,230,9,221,13,216,19,213,29,212,42,212,153,210,180,202,201,190,217,174,227,153,230,139,229,125,224,111,216,96,205,81,190,80,190,80,228,76,230,50,220,37,216,23,212,8,208,8,199,10,200,13,200,16,201,22,201,30,200,35,197,38,191,40,181,40,47,39,32,37,21,31,14,22,9,9,7,9,0,114,0,114,7,101,9,92,13,86,18,83,26,82,36,82,174,95,186,105,194,115,199,124,202,133,203,147,201,157,195,164,185,169,171,170,152,170,52,169,35,166,23,161,15,152,10,139,7,138,0,166,253,94,328,89,332,84,335,80,337,72,339,66,338,61,336,57,333,55,329,54,323,55,318,57,314,60,309,64,305,69,301,146,253,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,77,253,97,253,174,302,180,306,184,310,187,314,189,318,189,323,188,329,186,333,182,336,177,338,171,339,163,337,160,335,156,332,151,328,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,
-37,21,31,14,114,0,114,0,31,14,22,9,114,0,22,9,9,7,13,200,16,201,23,212,23,212,16,201,19,201,23,212,19,201,22,201,22,201,30,200,23,212,23,212,30,200,37,216,23,212,8,208,10,200,23,212,10,200,13,200,30,200,35,197,37,216,37,216,35,197,38,191,37,216,38,191,50,220,50,220,38,191,40,181,50,220,40,181,40,169,83,26,40,169,40,47,83,26,40,47,86,18,86,18,40,47,92,13,80,228,76,230,80,190,80,190,76,230,82,36,80,190,82,36,81,190,81,190,82,36,82,174,81,190,82,174,96,205,96,205,82,174,95,186,96,205,95,186,105,194,64,274,68,281,70,308,70,308,68,281,73,285,70,308,73,285,82,314,82,314,73,285,79,288,82,314,79,288,85,289,85,289,89,289,96,316,96,316,89,289,93,288,96,316,93,288,97,287,60,266,64,274,70,308,60,266,70,308,59,298,60,266,59,298,51,284,60,266,51,284,46,266,96,316,97,287,103,316,103,316,97,287,102,285,103,316,102,285,106,283,106,283,118,278,110,315,110,315,118,278,117,313,96,316,82,314,85,289,110,315,103,316,106,283,117,313,118,278,124,311,124,311,118,278,128,273,124,311,128,273,131,307,131,307,128,273,137,269,131,307,137,269,143,301,143,301,137,269,144,267,143,301,144,267,149,299,149,299,144,267,151,266,149,299,151,266,154,297,154,297,151,266,158,266,154,297,158,266,160,295,160,295,158,266,173,268,160,295,173,268,165,294,165,294,173,268,170,294,176,295,170,294,173,268,176,295,173,268,185,274,96,205,105,194,111,216,111,216,105,194,115,199,111,216,115,199,125,224,125,224,115,199,124,202,125,224,124,202,133,203,133,203,147,201,139,229,139,229,147,201,153,230,82,36,76,230,63,225,82,36,63,225,83,26,139,229,125,224,133,203,166,23,161,15,243,0,243,0,161,15,152,10,243,0,152,10,139,7,157,195,164,185,174,227,174,227,164,185,169,171,174,227,169,171,170,152,216,19,170,152,170,52,216,19,170,52,221,13,221,13,170,52,169,35,221,13,169,35,243,0,243,0,169,35,166,23,153,230,147,201,157,195,153,230,157,195,174,227,212,42,212,153,210,180,212,42,210,180,202,201,212,42,202,201,213,29,230,9,221,13,243,0,230,9,243,0,243,7,213,29,202,201,190,217,213,29,190,217,174,227,213,29,174,227,170,152,213,29,170,152,216,19,196,319,191,309,195,284,196,319,195,284,203,299,196,319,203,299,210,319,186,302,181,297,185,274,186,302,185,274,195,284,186,302,195,284,191,309,114,0,114,7,101,9,114,0,101,9,92,13,114,0,92,13,39,32,114,0,39,32,37,21,50,220,40,169,83,26,50,220,83,26,63,225,10,200,8,208,8,199,114,0,9,7,9,0,39,32,92,13,40,47,176,295,185,274,181,297,243,0,139,7,138,0,
-166,253,94,328,89,332,84,335,80,337,72,339,66,338,61,336,57,333,55,329,54,323,55,318,57,314,60,309,64,305,69,301,146,253,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,77,253,97,253,174,302,180,306,184,310,187,314,189,318,189,323,188,329,186,333,182,336,177,338,171,339,163,337,160,335,156,332,151,328,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,
-146,253,166,253,94,328,146,253,94,328,89,332,146,253,89,332,84,335,146,253,84,335,80,337,146,253,80,337,76,338,146,253,76,338,72,339,146,253,72,339,69,301,54,323,55,318,55,329,55,329,55,318,57,314,55,329,57,314,57,333,57,333,57,314,60,309,57,333,60,309,61,336,61,336,60,309,64,305,61,336,64,305,66,338,66,338,64,305,69,301,66,338,69,301,72,339,64,91,58,17,69,70,69,70,58,17,88,1,69,70,88,1,76,51,76,51,88,1,86,34,93,25,86,34,88,1,93,25,88,1,123,-4,162,225,127,230,130,215,130,215,127,230,118,216,98,212,118,216,127,230,98,212,127,230,90,225,187,70,180,44,191,17,191,17,180,44,168,25,191,17,168,25,160,1,160,1,168,25,151,13,160,1,151,13,131,9,131,9,120,10,123,-4,123,-4,120,10,110,13,123,-4,110,13,101,18,140,211,149,206,162,225,162,225,149,206,158,199,162,225,158,199,165,191,165,191,174,177,191,210,191,210,174,177,181,161,191,210,181,161,186,142,230,154,215,186,215,43,230,154,215,43,230,76,230,154,230,76,235,116,187,70,191,17,190,102,190,102,191,17,191,210,191,210,191,17,215,43,191,210,215,43,215,186,191,210,186,142,189,122,191,210,189,122,190,102,191,210,162,225,165,191,131,9,123,-4,160,1,58,17,61,113,60,137,60,137,62,164,58,209,58,209,62,164,70,186,58,209,70,186,90,225,90,225,70,186,82,202,90,225,82,202,98,212,58,17,60,137,58,209,58,17,58,209,35,42,35,42,58,209,35,185,35,42,35,185,20,75,20,75,35,185,20,153,20,75,20,153,15,114,61,113,58,17,64,91,162,225,130,215,140,211,93,25,123,-4,101,18,
-77,253,97,253,174,302,180,306,184,310,187,314,189,318,189,323,188,329,186,333,182,336,177,338,171,339,163,337,160,335,156,332,151,328,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,200,253,138,337,107,337,45,253,62,253,123,305,184,253,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,190,319,185,309,181,302,176,297,170,295,164,294,159,294,154,295,149,297,137,301,
-171,339,174,302,177,338,177,338,174,302,180,306,177,338,180,306,182,336,182,336,180,306,184,310,182,336,184,310,186,333,186,333,184,310,187,314,186,333,187,314,188,329,188,329,187,314,189,318,188,329,189,318,189,323,174,302,171,339,167,338,174,302,167,338,163,337,174,302,163,337,160,335,174,302,160,335,156,332,174,302,156,332,151,328,174,302,151,328,97,253,64,91,58,17,69,70,69,70,58,17,88,1,69,70,88,1,76,51,76,51,88,1,86,34,93,25,86,34,88,1,93,25,88,1,123,-4,162,225,127,230,130,215,130,215,127,230,118,216,98,212,118,216,127,230,98,212,127,230,90,225,187,70,180,44,191,17,191,17,180,44,168,25,191,17,168,25,160,1,160,1,168,25,151,13,160,1,151,13,131,9,131,9,120,10,123,-4,123,-4,120,10,110,13,123,-4,110,13,101,18,140,211,149,206,162,225,162,225,149,206,158,199,162,225,158,199,165,191,165,191,174,177,191,210,191,210,174,177,181,161,191,210,181,161,186,142,230,154,215,186,215,43,230,154,215,43,230,76,230,154,230,76,235,116,187,70,191,17,190,102,190,102,191,17,191,210,191,210,191,17,215,43,191,210,215,43,215,186,191,210,186,142,189,122,191,210,189,122,190,102,191,210,162,225,165,191,131,9,123,-4,160,1,58,17,61,113,60,137,60,137,62,164,58,209,58,209,62,164,70,186,58,209,70,186,90,225,90,225,70,186,82,202,90,225,82,202,98,212,58,17,60,137,58,209,58,17,58,209,35,42,35,42,58,209,35,185,35,42,35,185,20,75,20,75,35,185,20,153,20,75,20,153,15,114,61,113,58,17,64,91,162,225,130,215,140,211,93,25,123,-4,101,18,97,253,151,328,77,253,
-200,253,138,337,107,337,45,253,62,253,123,305,184,253,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,190,319,185,309,181,302,176,297,170,295,164,294,159,294,154,295,149,297,137,301,126,307,118,311,104,315,97,316,90,316,76,314,64,308,54,298,46,284,40,266,55,266,58,274,63,281,68,285,73,288,80,289,84,289,92,287,100,283,112,278,123,273,131,269,139,267,145,266,152,266,168,268,180,274,190,284,198,299,205,319,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,
-45,253,62,253,107,337,107,337,62,253,123,305,107,337,123,305,138,337,138,337,123,305,184,253,138,337,184,253,200,253,64,91,58,17,69,70,69,70,58,17,88,1,69,70,88,1,76,51,76,51,88,1,86,34,93,25,86,34,88,1,93,25,88,1,123,-4,162,225,127,230,130,215,130,215,127,230,118,216,98,212,118,216,127,230,98,212,127,230,90,225,187,70,180,44,191,17,191,17,180,44,168,25,191,17,168,25,160,1,160,1,168,25,151,13,160,1,151,13,131,9,131,9,120,10,123,-4,123,-4,120,10,110,13,123,-4,110,13,101,18,140,211,149,206,162,225,162,225,149,206,158,199,162,225,158,199,165,191,165,191,174,177,191,210,191,210,174,177,181,161,191,210,181,161,186,142,230,154,215,186,215,43,230,154,215,43,230,76,230,154,230,76,235,116,187,70,191,17,190,102,190,102,191,17,191,210,191,210,191,17,215,43,191,210,215,43,215,186,191,210,186,142,189,122,191,210,189,122,190,102,191,210,162,225,165,191,131,9,123,-4,160,1,58,17,61,113,60,137,60,137,62,164,58,209,58,209,62,164,70,186,58,209,70,186,90,225,90,225,70,186,82,202,90,225,82,202,98,212,58,17,60,137,58,209,58,17,58,209,35,42,35,42,58,209,35,185,35,42,35,185,20,75,20,75,35,185,20,153,20,75,20,153,15,114,61,113,58,17,64,91,162,225,130,215,140,211,93,25,123,-4,101,18,
-190,319,185,309,181,302,176,297,170,295,164,294,159,294,154,295,149,297,137,301,126,307,118,311,104,315,97,316,90,316,76,314,64,308,54,298,46,284,40,266,55,266,58,274,63,281,68,285,73,288,80,289,84,289,92,287,100,283,112,278,123,273,131,269,139,267,145,266,152,266,168,268,180,274,190,284,198,299,205,319,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,197,286,196,294,192,301,186,306,180,310,172,311,164,310,157,306,152,301,149,294,147,286,149,278,152,272,157,266,164,263,171,262,179,263,186,266,192,272,196,278,197,286,16383,16383,98,286,96,294,93,301,87,306,80,310,73,311,65,310,58,306,53,301,49,294,48,286,49,278,53,272,58,266,64,263,72,262,80,263,87,266,93,272,96,278,98,286,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,
-58,274,63,281,64,308,64,308,63,281,68,285,64,308,68,285,76,314,76,314,68,285,73,288,76,314,73,288,80,289,80,289,84,289,90,316,90,316,84,289,88,288,90,316,88,288,92,287,55,266,58,274,64,308,55,266,64,308,54,298,55,266,54,298,46,284,55,266,46,284,40,266,90,316,92,287,97,316,97,316,92,287,96,285,97,316,96,285,100,283,100,283,112,278,104,315,104,315,112,278,111,313,90,316,76,314,80,289,104,315,97,316,100,283,111,313,112,278,118,311,118,311,112,278,123,273,118,311,123,273,126,307,126,307,123,273,131,269,126,307,131,269,137,301,137,301,131,269,139,267,137,301,139,267,143,299,143,299,139,267,145,266,143,299,145,266,149,297,149,297,145,266,152,266,149,297,152,266,154,295,154,295,152,266,168,268,154,295,168,268,159,294,159,294,168,268,164,294,170,295,164,294,168,268,170,295,168,268,180,274,190,319,185,309,190,284,190,319,190,284,198,299,190,319,198,299,205,319,181,302,176,297,180,274,181,302,180,274,190,284,181,302,190,284,185,309,64,91,58,17,69,70,69,70,58,17,88,1,69,70,88,1,76,51,76,51,88,1,86,34,93,25,86,34,88,1,93,25,88,1,123,-4,162,225,127,230,130,215,130,215,127,230,118,216,98,212,118,216,127,230,98,212,127,230,90,225,187,70,180,44,191,17,191,17,180,44,168,25,191,17,168,25,160,1,160,1,168,25,151,13,160,1,151,13,131,9,131,9,120,10,123,-4,123,-4,120,10,110,13,123,-4,110,13,101,18,140,211,149,206,162,225,162,225,149,206,158,199,162,225,158,199,165,191,165,191,174,177,191,210,191,210,174,177,181,161,191,210,181,161,186,142,230,154,215,186,215,43,230,154,215,43,230,76,230,154,230,76,235,116,187,70,191,17,190,102,190,102,191,17,191,210,191,210,191,17,215,43,191,210,215,43,215,186,191,210,186,142,189,122,191,210,189,122,190,102,191,210,162,225,165,191,131,9,123,-4,160,1,58,17,61,113,60,137,60,137,62,164,58,209,58,209,62,164,70,186,58,209,70,186,90,225,90,225,70,186,82,202,90,225,82,202,98,212,58,17,60,137,58,209,58,17,58,209,35,42,35,42,58,209,35,185,35,42,35,185,20,75,20,75,35,185,20,153,20,75,20,153,15,114,61,113,58,17,64,91,162,225,130,215,140,211,93,25,123,-4,101,18,170,295,180,274,176,297,
-197,286,196,294,192,301,186,306,180,310,172,311,164,310,157,306,152,301,149,294,147,286,149,278,152,272,157,266,164,263,171,262,179,263,186,266,192,272,196,278,197,286,16383,16383,98,286,96,294,93,301,87,306,80,310,73,311,65,310,58,306,53,301,49,294,48,286,49,278,53,272,58,266,64,263,72,262,80,263,87,266,93,272,96,278,98,286,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,169,229,168,238,164,246,158,252,150,256,142,258,133,256,125,252,119,246,115,239,113,230,115,221,119,214,125,208,132,204,141,203,150,204,158,208,164,214,168,221,169,229,16383,16383,267,110,267,143,15,143,15,110,16383,16383,169,22,168,31,164,38,158,45,150,49,142,50,133,49,125,45,119,39,115,31,113,22,115,14,119,6,125,0,132,-3,141,-4,150,-3,158,0,164,6,168,13,169,22,219,276,199,276,171,221,161,224,152,227,143,229,134,230,124,230,88,224,58,208,35,184,20,152,15,113,15,100,17,87,20,74,30,50,35,42,40,36,46,29,53,22,63,14,26,-55,45,-55,77,6,87,1,105,-3,114,-4,123,-4,159,1,190,18,214,44,229,78,235,117,233,141,227,162,218,181,204,198,186,213,16383,16383,79,46,72,63,66,81,63,99,60,118,60,138,62,164,70,186,82,202,
-48,286,49,278,49,294,49,294,49,278,53,272,49,294,53,272,53,301,53,301,53,272,58,266,53,301,58,266,58,306,58,306,58,266,64,263,58,306,64,263,65,310,65,310,64,263,72,262,65,310,72,262,73,311,73,311,72,262,80,263,73,311,80,263,80,310,80,310,80,263,87,266,80,310,87,266,87,306,87,306,87,266,93,272,87,306,93,272,93,301,93,301,93,272,96,278,93,301,96,278,96,294,96,294,96,278,98,286,64,91,58,17,69,70,69,70,58,17,88,1,69,70,88,1,76,51,76,51,88,1,86,34,93,25,86,34,88,1,93,25,88,1,123,-4,162,225,127,230,130,215,130,215,127,230,118,216,98,212,118,216,127,230,98,212,127,230,90,225,147,286,149,278,149,294,149,294,149,278,152,272,149,294,152,272,152,301,152,301,152,272,157,266,152,301,157,266,157,306,157,306,157,266,164,263,157,306,164,263,164,310,164,310,164,263,171,262,164,310,171,262,172,311,172,311,171,262,179,263,172,311,179,263,180,310,180,310,179,263,186,266,180,310,186,266,186,306,186,306,186,266,192,272,186,306,192,272,192,301,192,301,192,272,196,278,192,301,196,278,196,294,196,294,196,278,197,286,187,70,180,44,191,17,191,17,180,44,168,25,191,17,168,25,160,1,160,1,168,25,151,13,160,1,151,13,131,9,131,9,120,10,123,-4,123,-4,120,10,110,13,123,-4,110,13,101,18,140,211,149,206,162,225,162,225,149,206,158,199,162,225,158,199,165,191,165,191,174,177,191,210,191,210,174,177,181,161,191,210,181,161,186,142,230,154,215,186,215,43,230,154,215,43,230,76,230,154,230,76,235,116,187,70,191,17,190,102,190,102,191,17,191,210,191,210,191,17,215,43,191,210,215,43,215,186,191,210,186,142,189,122,191,210,189,122,190,102,191,210,162,225,165,191,131,9,123,-4,160,1,58,17,61,113,60,137,60,137,62,164,58,209,58,209,62,164,70,186,58,209,70,186,90,225,90,225,70,186,82,202,90,225,82,202,98,212,58,17,60,137,58,209,58,17,58,209,35,42,35,42,58,209,35,185,35,42,35,185,20,75,20,75,35,185,20,153,20,75,20,153,15,114,61,113,58,17,64,91,162,225,130,215,140,211,93,25,123,-4,101,18,
-169,229,168,238,164,246,158,252,150,256,142,258,133,256,125,252,119,246,115,239,113,230,115,221,119,214,125,208,132,204,141,203,150,204,158,208,164,214,168,221,169,229,16383,16383,267,110,267,143,15,143,15,110,16383,16383,169,22,168,31,164,38,158,45,150,49,142,50,133,49,125,45,119,39,115,31,113,22,115,14,119,6,125,0,132,-3,141,-4,150,-3,158,0,164,6,168,13,169,22,219,276,199,276,171,221,161,224,152,227,143,229,134,230,124,230,88,224,58,208,35,184,20,152,15,113,15,100,17,87,20,74,30,50,35,42,40,36,46,29,53,22,63,14,26,-55,45,-55,77,6,87,1,105,-3,114,-4,123,-4,159,1,190,18,214,44,229,78,235,117,233,141,227,162,218,181,204,198,186,213,16383,16383,79,46,72,63,66,81,63,99,60,118,60,138,62,164,70,186,
-113,230,115,221,115,239,115,239,115,221,119,214,115,239,119,214,119,246,119,246,119,214,125,208,119,246,125,208,125,252,125,252,125,208,132,204,125,252,132,204,133,256,133,256,132,204,141,203,133,256,141,203,142,258,142,258,141,203,150,204,142,258,150,204,150,256,150,256,150,204,158,208,150,256,158,208,158,252,158,252,158,208,164,214,158,252,164,214,164,246,164,246,164,214,168,221,164,246,168,221,168,238,168,238,168,221,169,229,15,143,15,110,267,110,15,143,267,110,267,143,113,22,115,14,115,31,115,31,115,14,119,6,115,31,119,6,119,39,119,39,119,6,125,0,119,39,125,0,125,45,125,45,125,0,132,-3,125,45,132,-3,133,49,133,49,132,-3,141,-4,133,49,141,-4,142,50,142,50,141,-4,150,-3,142,50,150,-3,150,49,150,49,150,-3,158,0,150,49,158,0,158,45,158,45,158,0,164,6,158,45,164,6,164,38,164,38,164,6,168,13,164,38,168,13,168,31,168,31,168,13,169,22,
-219,276,199,276,171,221,161,224,152,227,143,229,134,230,124,230,88,224,58,208,35,184,20,152,15,113,15,100,17,87,20,74,30,50,35,42,40,36,46,29,53,22,63,14,26,-55,45,-55,77,6,87,1,105,-3,114,-4,123,-4,159,1,190,18,214,44,229,78,235,117,233,141,227,162,218,181,204,198,186,213,16383,16383,79,46,72,63,66,81,63,99,60,118,60,138,62,164,70,186,82,202,99,212,118,216,127,215,135,213,143,210,151,205,158,198,16383,16383,170,183,178,167,183,152,187,136,189,120,190,102,187,69,180,44,168,25,151,13,131,9,121,10,112,12,104,16,97,22,89,30,170,253,97,328,92,332,88,335,84,337,80,338,75,339,69,338,64,336,61,333,58,329,57,323,58,318,60,314,63,309,67,305,73,301,150,253,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,
-63,14,63,14,45,-55,63,14,45,-55,77,6,63,14,77,6,63,99,63,14,63,99,60,118,63,14,60,118,60,138,63,14,60,138,58,208,63,14,58,208,53,22,58,208,35,184,35,42,58,208,35,42,40,36,58,208,40,36,46,29,58,208,46,29,53,22,35,184,20,152,20,74,35,184,20,74,25,62,35,184,25,62,30,50,35,184,30,50,35,42,20,152,15,113,15,100,20,152,15,100,17,87,20,152,17,87,20,74,124,230,118,216,127,215,124,230,127,215,134,230,134,230,127,215,135,213,134,230,135,213,143,229,143,229,135,213,143,210,143,229,143,210,152,227,152,227,143,210,151,205,152,227,151,205,158,198,187,69,180,44,190,18,190,18,180,44,168,25,190,18,168,25,159,1,159,1,168,25,151,13,159,1,151,13,131,9,131,9,121,10,123,-4,123,-4,121,10,114,-4,112,12,104,16,105,-3,112,12,105,-3,114,-4,112,12,114,-4,121,10,87,1,96,-1,89,30,89,30,96,-1,97,22,97,22,96,-1,105,-3,97,22,105,-3,104,16,161,224,158,198,170,183,161,224,170,183,171,221,171,221,170,183,178,167,171,221,178,167,186,213,186,213,178,167,183,152,186,213,183,152,187,136,199,276,171,221,186,213,199,276,186,213,219,276,158,198,79,46,89,30,158,198,89,30,170,183,79,46,72,63,77,6,79,46,77,6,87,1,79,46,87,1,89,30,66,81,63,99,77,6,66,81,77,6,72,63,229,78,235,117,233,141,229,78,233,141,227,162,229,78,227,162,218,181,229,78,218,181,214,44,187,69,190,18,190,102,190,102,190,18,204,198,204,198,190,18,214,44,204,198,214,44,218,181,186,213,187,136,204,198,204,198,187,136,189,120,204,198,189,120,190,102,131,9,123,-4,159,1,70,186,82,202,88,224,88,224,82,202,99,212,88,224,99,212,124,230,124,230,99,212,118,216,60,138,62,164,58,208,58,208,62,164,70,186,58,208,70,186,88,224,45,-55,63,14,26,-55,152,227,158,198,161,224,
-170,253,97,328,92,332,88,335,84,337,80,338,75,339,69,338,64,336,61,333,58,329,57,323,58,318,60,314,63,309,67,305,73,301,150,253,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,78,253,98,253,175,302,181,306,185,310,188,314,189,318,190,323,189,329,187,333,183,336,179,338,172,339,168,338,165,337,161,335,156,332,151,328,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,
-150,253,170,253,97,328,150,253,97,328,92,332,150,253,92,332,88,335,150,253,88,335,84,337,150,253,84,337,80,338,150,253,80,338,75,339,150,253,75,339,73,301,57,323,58,318,58,329,58,329,58,318,60,314,58,329,60,314,61,333,61,333,60,314,63,309,61,333,63,309,64,336,64,336,63,309,67,305,64,336,67,305,69,338,69,338,67,305,73,301,69,338,73,301,75,339,78,225,4,225,17,216,78,225,17,216,26,213,78,225,26,213,32,207,78,225,32,207,35,197,78,225,35,197,36,185,78,225,36,185,38,38,78,225,38,38,46,20,78,225,46,20,58,6,78,225,58,6,75,-1,78,225,75,-1,78,64,164,53,162,48,168,38,168,38,162,48,159,43,168,38,159,43,155,40,155,40,147,34,153,21,153,21,147,34,139,29,153,21,139,29,138,8,138,8,139,29,130,26,138,8,130,26,123,0,123,0,130,26,121,25,123,0,121,25,113,24,113,24,102,26,109,-3,109,-3,102,26,97,-4,97,-4,102,26,92,31,97,-4,92,31,84,40,97,-4,84,40,79,51,97,-4,79,51,75,-1,78,64,75,-1,79,51,113,24,109,-3,123,0,166,184,168,38,209,225,209,225,168,38,169,38,209,225,169,38,171,-3,171,-3,169,38,169,-2,168,38,166,184,166,69,168,38,166,69,166,59,168,38,166,59,164,53,155,40,153,21,168,38,225,26,217,29,225,14,225,14,217,29,212,34,225,14,212,34,212,10,212,10,212,34,209,42,212,10,209,42,199,6,199,6,209,42,209,54,199,6,209,54,209,225,209,225,171,-3,186,1,209,225,186,1,199,6,209,225,129,225,145,215,209,225,145,215,155,212,209,225,155,212,162,206,209,225,162,206,165,197,209,225,165,197,166,184,237,25,225,26,225,14,237,25,225,14,240,18,237,25,240,18,240,25,38,38,36,185,36,59,145,215,129,225,129,217,17,216,4,225,4,218,
-78,253,98,253,175,302,181,306,185,310,188,314,189,318,190,323,189,329,187,333,183,336,179,338,172,339,168,338,165,337,161,335,156,332,151,328,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,200,253,138,337,107,337,45,253,62,253,123,305,184,253,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,196,286,195,294,192,301,186,306,179,310,171,311,164,310,157,306,152,301,148,294,147,286,
-209,225,129,225,145,215,209,225,145,215,155,212,209,225,155,212,162,206,209,225,162,206,165,197,209,225,165,197,166,184,209,225,166,184,168,38,209,225,168,38,169,38,209,225,169,38,171,-3,209,225,171,-3,186,1,209,225,186,1,199,6,209,225,199,6,209,54,166,184,166,69,168,38,237,25,225,26,225,14,237,25,225,14,240,18,237,25,240,18,240,25,209,54,199,6,209,42,209,42,199,6,212,10,209,42,212,10,212,34,212,34,212,10,225,14,212,34,225,14,217,29,217,29,225,14,225,26,172,339,175,302,179,338,179,338,175,302,181,306,179,338,181,306,183,336,183,336,181,306,185,310,183,336,185,310,187,333,187,333,185,310,188,314,187,333,188,314,189,329,189,329,188,314,189,318,189,329,189,318,190,323,175,302,172,339,168,338,175,302,168,338,165,337,175,302,165,337,161,335,175,302,161,335,156,332,175,302,156,332,151,328,175,302,151,328,98,253,78,225,4,225,17,216,78,225,17,216,26,213,78,225,26,213,32,207,78,225,32,207,35,197,78,225,35,197,36,185,78,225,36,185,38,38,78,225,38,38,46,20,78,225,46,20,58,6,78,225,58,6,75,-1,78,225,75,-1,78,64,164,53,162,48,168,38,168,38,162,48,159,43,168,38,159,43,155,40,155,40,147,34,153,21,153,21,147,34,139,29,153,21,139,29,138,8,138,8,139,29,130,26,138,8,130,26,123,0,123,0,130,26,121,25,123,0,121,25,113,24,113,24,102,26,109,-3,109,-3,102,26,97,-4,97,-4,102,26,92,31,97,-4,92,31,84,40,97,-4,84,40,79,51,97,-4,79,51,75,-1,78,64,75,-1,79,51,113,24,109,-3,123,0,166,59,164,53,168,38,166,59,168,38,166,69,155,40,153,21,168,38,38,38,36,185,36,59,171,-3,169,38,169,-2,17,216,4,225,4,218,98,253,151,328,78,253,145,215,129,225,129,217,
-200,253,138,337,107,337,45,253,62,253,123,305,184,253,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,196,286,195,294,192,301,186,306,179,310,171,311,164,310,157,306,152,301,148,294,147,286,148,278,151,272,157,266,163,263,171,262,179,263,186,266,192,272,195,278,196,286,16383,16383,97,286,96,294,92,301,87,306,80,310,72,311,64,310,58,306,52,301,49,294,47,286,49,278,52,272,57,266,64,263,71,262,79,263,86,266,92,272,96,278,97,286,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,
-209,225,129,225,145,215,209,225,145,215,155,212,209,225,155,212,162,206,209,225,162,206,165,197,209,225,165,197,166,184,209,225,166,184,168,38,209,225,168,38,169,38,209,225,169,38,171,-3,209,225,171,-3,186,1,209,225,186,1,199,6,209,225,199,6,209,54,166,184,166,69,168,38,237,25,225,26,225,14,237,25,225,14,240,18,237,25,240,18,240,25,209,54,199,6,209,42,209,42,199,6,212,10,209,42,212,10,212,34,212,34,212,10,225,14,212,34,225,14,217,29,217,29,225,14,225,26,45,253,62,253,107,337,107,337,62,253,123,305,107,337,123,305,138,337,138,337,123,305,184,253,138,337,184,253,200,253,78,225,4,225,17,216,78,225,17,216,26,213,78,225,26,213,32,207,78,225,32,207,35,197,78,225,35,197,36,185,78,225,36,185,38,38,78,225,38,38,46,20,78,225,46,20,58,6,78,225,58,6,75,-1,78,225,75,-1,78,64,164,53,162,48,168,38,168,38,162,48,159,43,168,38,159,43,155,40,155,40,147,34,153,21,153,21,147,34,139,29,153,21,139,29,138,8,138,8,139,29,130,26,138,8,130,26,123,0,123,0,130,26,121,25,123,0,121,25,113,24,113,24,102,26,109,-3,109,-3,102,26,97,-4,97,-4,102,26,92,31,97,-4,92,31,84,40,97,-4,84,40,79,51,97,-4,79,51,75,-1,78,64,75,-1,79,51,113,24,109,-3,123,0,166,59,164,53,168,38,166,59,168,38,166,69,155,40,153,21,168,38,38,38,36,185,36,59,171,-3,169,38,169,-2,17,216,4,225,4,218,145,215,129,225,129,217,
-196,286,195,294,192,301,186,306,179,310,171,311,164,310,157,306,152,301,148,294,147,286,148,278,151,272,157,266,163,263,171,262,179,263,186,266,192,272,195,278,196,286,16383,16383,97,286,96,294,92,301,87,306,80,310,72,311,64,310,58,306,52,301,49,294,47,286,49,278,52,272,57,266,64,263,71,262,79,263,86,266,92,272,96,278,97,286,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,71,253,92,253,169,302,174,306,178,310,181,314,183,318,184,323,183,329,181,333,177,336,172,338,166,339,158,337,154,335,150,332,145,328,16383,16383,238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,26,211,30,206,33,200,99,60,105,47,111,35,116,24,121,9,119,2,116,-8,112,-21,106,-34,100,-44,96,-51,85,-62,80,-65,75,-66,71,-66,69,-65,66,-64,62,-63,63,-63,57,-60,52,-58,42,-56,36,-56,30,-57,24,-60,19,-65,16,-72,15,-79,17,-88,21,-96,28,-102,38,-106,50,-108,71,-105,90,-94,106,-76,122,-49,137,-11,213,192,217,202,221,208,226,213,231,216,238,218,79,339,76,342,63,337,51,333,38,329,23,325,
-209,225,129,225,145,215,209,225,145,215,155,212,209,225,155,212,162,206,209,225,162,206,165,197,209,225,165,197,166,184,209,225,166,184,168,38,209,225,168,38,169,38,209,225,169,38,171,-3,209,225,171,-3,186,1,209,225,186,1,199,6,209,225,199,6,209,54,166,184,166,69,168,38,237,25,225,26,225,14,237,25,225,14,240,18,237,25,240,18,240,25,209,54,199,6,209,42,209,42,199,6,212,10,209,42,212,10,212,34,212,34,212,10,225,14,212,34,225,14,217,29,217,29,225,14,225,26,147,286,148,278,148,294,148,294,148,278,151,272,148,294,151,272,152,301,152,301,151,272,157,266,152,301,157,266,157,306,157,306,157,266,163,263,157,306,163,263,164,310,164,310,163,263,171,262,164,310,171,262,171,311,171,311,171,262,179,263,171,311,179,263,179,310,179,310,179,263,186,266,179,310,186,266,186,306,186,306,186,266,192,272,186,306,192,272,192,301,192,301,192,272,195,278,192,301,195,278,195,294,195,294,195,278,196,286,47,286,49,278,49,294,49,294,49,278,52,272,49,294,52,272,52,301,52,301,52,272,57,266,52,301,57,266,58,306,58,306,57,266,64,263,58,306,64,263,64,310,64,310,64,263,71,262,64,310,71,262,72,311,72,311,71,262,79,263,72,311,79,263,80,310,80,310,79,263,86,266,80,310,86,266,87,306,87,306,86,266,92,272,87,306,92,272,92,301,92,301,92,272,96,278,92,301,96,278,96,294,96,294,96,278,97,286,78,225,4,225,17,216,78,225,17,216,26,213,78,225,26,213,32,207,78,225,32,207,35,197,78,225,35,197,36,185,78,225,36,185,38,38,78,225,38,38,46,20,78,225,46,20,58,6,78,225,58,6,75,-1,78,225,75,-1,78,64,164,53,162,48,168,38,168,38,162,48,159,43,168,38,159,43,155,40,155,40,147,34,153,21,153,21,147,34,139,29,153,21,139,29,138,8,138,8,139,29,130,26,138,8,130,26,123,0,123,0,130,26,121,25,123,0,121,25,113,24,113,24,102,26,109,-3,109,-3,102,26,97,-4,97,-4,102,26,92,31,97,-4,92,31,84,40,97,-4,84,40,79,51,97,-4,79,51,75,-1,78,64,75,-1,79,51,113,24,109,-3,123,0,166,59,164,53,168,38,166,59,168,38,166,69,155,40,153,21,168,38,38,38,36,185,36,59,171,-3,169,38,169,-2,17,216,4,225,4,218,145,215,129,225,129,217,
-71,253,92,253,169,302,174,306,178,310,181,314,183,318,184,323,183,329,181,333,177,336,172,338,166,339,158,337,154,335,150,332,145,328,16383,16383,238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,26,211,30,206,33,200,99,60,105,47,111,35,116,24,121,9,119,2,116,-8,112,-21,106,-34,100,-44,96,-51,85,-62,80,-65,75,-66,71,-66,69,-65,66,-64,62,-63,63,-63,57,-60,52,-58,42,-56,36,-56,30,-57,24,-60,19,-65,16,-72,15,-79,17,-88,21,-96,28,-102,38,-106,50,-108,71,-105,90,-94,106,-76,122,-49,137,-11,213,192,217,202,221,208,226,213,231,216,238,218,79,339,76,342,63,337,51,333,38,329,23,325,4,320,4,311,8,311,9,312,13,312,23,311,30,308,35,303,37,295,37,-76,34,-86,27,-92,17,-96,2,-98,2,-107,123,-107,123,-98,104,-97,91,-93,84,-87,80,-75,79,-59,79,17,90,8,99,2,108,-1,118,-3,130,-4,164,1,193,19,215,47,230,82,235,123,231,160,221,190,204,212,180,225,151,230,135,229,120,224,106,216,92,205,79,190,16383,16383,79,166,83,175,91,184,103,192,117,198,131,200,152,196,170,185,182,166,189,140,192,107,189,75,181,49,169,29,152,16,131,11,117,13,103,19,91,27,82,36,79,45,198,286,197,294,193,301,188,306,181,310,173,311,165,310,159,306,153,301,150,294,148,286,150,278,153,272,158,266,165,263,172,262,180,263,187,266,193,272,197,278,198,286,
-166,339,169,302,172,338,172,338,169,302,174,306,172,338,174,306,177,336,177,336,174,306,178,310,177,336,178,310,181,333,181,333,178,310,181,314,181,333,181,314,183,329,183,329,181,314,183,318,183,329,183,318,184,323,169,302,166,339,162,338,169,302,162,338,158,337,169,302,158,337,154,335,169,302,154,335,150,332,169,302,150,332,145,328,169,302,145,328,92,253,90,-57,85,-62,90,-94,90,-94,85,-62,80,-65,90,-94,80,-65,75,-66,75,-66,73,-66,90,-94,90,-94,73,-66,71,-105,90,-57,106,-76,96,-51,96,-51,106,-76,100,-44,106,-34,100,-44,106,-76,106,-34,106,-76,122,-49,143,59,88,184,99,60,143,59,99,60,105,47,143,59,105,47,111,35,143,59,111,35,116,24,143,59,116,24,119,15,143,59,119,15,121,9,143,59,121,9,122,-49,143,59,122,-49,137,-11,143,59,137,-11,213,192,143,59,213,192,192,196,122,-49,121,9,119,2,99,60,88,184,86,188,99,60,86,188,84,192,99,60,84,192,82,196,99,60,82,196,81,201,99,60,81,201,33,200,33,200,81,201,81,204,81,204,82,209,33,200,33,200,82,209,85,212,33,200,85,212,109,225,109,225,85,212,90,215,109,225,90,215,98,217,194,202,193,201,213,192,213,192,193,201,193,198,213,192,193,198,192,196,238,225,171,225,179,217,238,225,179,217,186,216,238,225,186,216,190,213,238,225,190,213,193,210,238,225,193,210,194,205,238,225,194,205,226,213,238,225,226,213,231,216,238,225,231,216,238,218,194,205,213,192,217,202,194,205,217,202,221,208,194,205,221,208,226,213,194,204,194,202,213,192,194,204,213,192,194,205,122,-49,119,2,116,-8,122,-49,116,-8,112,-21,122,-49,112,-21,106,-34,71,-105,73,-66,71,-66,71,-105,71,-66,69,-65,71,-105,69,-65,66,-64,71,-105,66,-64,63,-63,71,-105,63,-63,57,-60,71,-105,57,-60,52,-58,71,-105,52,-58,50,-108,52,-58,47,-57,50,-108,50,-108,47,-57,42,-56,50,-108,42,-56,38,-106,38,-106,42,-56,36,-56,38,-106,36,-56,30,-57,38,-106,30,-57,28,-102,28,-102,30,-57,24,-60,28,-102,24,-60,21,-96,21,-96,24,-60,19,-65,21,-96,19,-65,17,-88,17,-88,19,-65,16,-72,17,-88,16,-72,15,-79,98,217,109,218,109,225,109,225,7,225,14,217,109,225,14,217,21,214,109,225,21,214,26,211,109,225,26,211,30,206,109,225,30,206,33,200,66,-64,62,-63,63,-63,14,217,7,225,7,218,90,-57,90,-94,106,-76,179,217,171,225,171,218,92,253,145,328,71,253,
-79,339,76,342,63,337,51,333,38,329,23,325,4,320,4,311,8,311,9,312,13,312,23,311,30,308,35,303,37,295,37,-76,34,-86,27,-92,17,-96,2,-98,2,-107,123,-107,123,-98,104,-97,91,-93,84,-87,80,-75,79,-59,79,17,90,8,99,2,108,-1,118,-3,130,-4,164,1,193,19,215,47,230,82,235,123,231,160,221,190,204,212,180,225,151,230,135,229,120,224,106,216,92,205,79,190,16383,16383,79,166,83,175,91,184,103,192,117,198,131,200,152,196,170,185,182,166,189,140,192,107,189,75,181,49,169,29,152,16,131,11,117,13,103,19,91,27,82,36,79,45,198,286,197,294,193,301,188,306,181,310,173,311,165,310,159,306,153,301,150,294,148,286,150,278,153,272,158,266,165,263,172,262,180,263,187,266,193,272,197,278,198,286,16383,16383,99,286,97,294,94,301,88,306,81,310,74,311,66,310,59,306,54,301,50,294,49,286,50,278,54,272,59,266,65,263,73,262,81,263,88,266,94,272,97,278,99,286,16383,16383,238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,
-34,-86,27,-92,123,-107,123,-107,27,-92,17,-96,123,-107,17,-96,2,-98,8,311,9,312,23,325,23,325,9,312,11,312,23,325,11,312,13,312,13,312,23,311,23,325,23,325,23,311,38,329,23,325,4,320,6,311,23,325,6,311,8,311,30,308,35,303,38,329,38,329,35,303,37,295,38,329,37,295,37,284,80,-75,37,284,37,-63,80,-75,37,-63,84,-87,84,-87,37,-63,91,-93,79,190,79,339,76,342,79,190,76,342,79,-59,79,190,79,-59,79,166,79,190,79,166,92,205,235,123,231,160,230,82,230,82,231,160,221,190,230,82,221,190,215,47,215,47,221,190,204,212,215,47,204,212,193,19,193,19,204,212,192,107,193,19,192,107,189,75,193,19,189,75,181,49,152,196,170,185,180,225,180,225,170,185,182,166,180,225,182,166,204,212,204,212,182,166,189,140,204,212,189,140,192,107,135,229,131,200,152,196,135,229,152,196,151,230,151,230,152,196,180,225,108,-1,118,-3,117,13,117,13,118,-3,131,11,152,16,131,11,164,1,152,16,164,1,169,29,169,29,164,1,193,19,169,29,193,19,181,49,131,11,118,-3,130,-4,131,11,130,-4,164,1,123,-107,123,-98,104,-97,123,-107,104,-97,91,-93,123,-107,91,-93,37,-76,123,-107,37,-76,34,-86,82,36,79,45,90,8,90,8,79,45,79,17,80,-75,79,-59,51,333,80,-75,51,333,38,329,63,337,51,333,79,-59,63,337,79,-59,76,342,83,175,91,184,92,205,92,205,91,184,103,192,92,205,103,192,106,216,106,216,103,192,117,198,106,216,117,198,120,224,120,224,117,198,131,200,120,224,131,200,135,229,82,36,90,8,91,27,91,27,90,8,99,2,91,27,99,2,103,19,103,19,99,2,108,-1,103,19,108,-1,117,13,92,205,79,166,83,175,6,311,4,320,4,311,123,-107,2,-98,2,-107,37,-76,91,-93,37,-63,37,284,80,-75,38,329,38,329,23,311,30,308,
-198,286,197,294,193,301,188,306,181,310,173,311,165,310,159,306,153,301,150,294,148,286,150,278,153,272,158,266,165,263,172,262,180,263,187,266,193,272,197,278,198,286,16383,16383,99,286,97,294,94,301,88,306,81,310,74,311,66,310,59,306,54,301,50,294,49,286,50,278,54,272,59,266,65,263,73,262,81,263,88,266,94,272,97,278,99,286,16383,16383,238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,26,211,30,206,33,200,99,60,105,47,111,35,116,24,121,9,119,2,116,-8,112,-21,106,-34,100,-44,96,-51,85,-62,80,-65,75,-66,71,-66,69,-65,66,-64,62,-63,63,-63,57,-60,52,-58,42,-56,36,-56,30,-57,24,-60,19,-65,16,-72,15,-79,17,-88,21,-96,28,-102,38,-106,50,-108,71,-105,90,-94,106,-76,122,-49,137,-11,213,192,217,202,221,208,226,213,231,216,238,218,256,359,256,387,100,387,100,359,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,190,253,190,281,35,281,35,253,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,
-148,286,150,278,150,294,150,294,150,278,153,272,150,294,153,272,153,301,153,301,153,272,158,266,153,301,158,266,159,306,159,306,158,266,165,263,159,306,165,263,165,310,165,310,165,263,172,262,165,310,172,262,173,311,173,311,172,262,180,263,173,311,180,263,181,310,181,310,180,263,187,266,181,310,187,266,188,306,188,306,187,266,193,272,188,306,193,272,193,301,193,301,193,272,197,278,193,301,197,278,197,294,197,294,197,278,198,286,49,286,50,278,50,294,50,294,50,278,54,272,50,294,54,272,54,301,54,301,54,272,59,266,54,301,59,266,59,306,59,306,59,266,65,263,59,306,65,263,66,310,66,310,65,263,73,262,66,310,73,262,74,311,74,311,73,262,81,263,74,311,81,263,81,310,81,310,81,263,88,266,81,310,88,266,88,306,88,306,88,266,94,272,88,306,94,272,94,301,94,301,94,272,97,278,94,301,97,278,97,294,97,294,97,278,99,286,90,-57,85,-62,90,-94,90,-94,85,-62,80,-65,90,-94,80,-65,75,-66,75,-66,73,-66,90,-94,90,-94,73,-66,71,-105,90,-57,106,-76,96,-51,96,-51,106,-76,100,-44,106,-34,100,-44,106,-76,106,-34,106,-76,122,-49,143,59,88,184,99,60,143,59,99,60,105,47,143,59,105,47,111,35,143,59,111,35,116,24,143,59,116,24,119,15,143,59,119,15,121,9,143,59,121,9,122,-49,143,59,122,-49,137,-11,143,59,137,-11,213,192,143,59,213,192,192,196,122,-49,121,9,119,2,99,60,88,184,86,188,99,60,86,188,84,192,99,60,84,192,82,196,99,60,82,196,81,201,99,60,81,201,33,200,33,200,81,201,81,204,81,204,82,209,33,200,33,200,82,209,85,212,33,200,85,212,109,225,109,225,85,212,90,215,109,225,90,215,98,217,194,202,193,201,213,192,213,192,193,201,193,198,213,192,193,198,192,196,238,225,171,225,179,217,238,225,179,217,186,216,238,225,186,216,190,213,238,225,190,213,193,210,238,225,193,210,194,205,238,225,194,205,226,213,238,225,226,213,231,216,238,225,231,216,238,218,194,205,213,192,217,202,194,205,217,202,221,208,194,205,221,208,226,213,194,204,194,202,213,192,194,204,213,192,194,205,122,-49,119,2,116,-8,122,-49,116,-8,112,-21,122,-49,112,-21,106,-34,71,-105,73,-66,71,-66,71,-105,71,-66,69,-65,71,-105,69,-65,66,-64,71,-105,66,-64,63,-63,71,-105,63,-63,57,-60,71,-105,57,-60,52,-58,71,-105,52,-58,50,-108,52,-58,47,-57,50,-108,50,-108,47,-57,42,-56,50,-108,42,-56,38,-106,38,-106,42,-56,36,-56,38,-106,36,-56,30,-57,38,-106,30,-57,28,-102,28,-102,30,-57,24,-60,28,-102,24,-60,21,-96,21,-96,24,-60,19,-65,21,-96,19,-65,17,-88,17,-88,19,-65,16,-72,17,-88,16,-72,15,-79,98,217,109,218,109,225,109,225,7,225,14,217,109,225,14,217,21,214,109,225,21,214,26,211,109,225,26,211,30,206,109,225,30,206,33,200,66,-64,62,-63,63,-63,14,217,7,225,7,218,90,-57,90,-94,106,-76,179,217,171,225,171,218,
-166,253,94,328,89,332,85,335,81,337,73,339,66,338,61,336,58,333,55,329,55,318,57,314,60,309,70,301,147,253,55,253,75,253,151,301,157,305,161,309,164,314,166,318,166,329,163,333,160,336,155,338,148,339,140,337,136,335,132,332,
-147,253,166,253,94,328,147,253,94,328,89,332,147,253,89,332,85,335,147,253,85,335,81,337,147,253,81,337,77,338,147,253,77,338,73,339,147,253,73,339,70,301,55,323,55,318,55,329,55,329,55,318,57,314,55,329,57,314,58,333,58,333,57,314,60,309,58,333,60,309,61,336,61,336,60,309,65,305,61,336,65,305,66,338,66,338,65,305,70,301,66,338,70,301,73,339,
-55,253,75,253,151,301,157,305,161,309,164,314,166,318,166,329,163,333,160,336,155,338,148,339,140,337,136,335,132,332,127,328,203,253,140,337,109,337,47,253,64,253,124,305,185,253,193,319,188,309,183,302,178,297,173,294,161,294,155,295,148,298,139,302,
-148,339,151,301,155,338,155,338,151,301,157,305,155,338,157,305,160,336,160,336,157,305,161,309,160,336,161,309,163,333,163,333,161,309,164,314,163,333,164,314,166,329,166,329,164,314,166,318,166,329,166,318,166,323,151,301,148,339,144,338,151,301,144,338,140,337,151,301,140,337,136,335,151,301,136,335,132,332,151,301,132,332,127,328,151,301,127,328,75,253,127,328,55,253,75,253,
-203,253,140,337,109,337,47,253,64,253,124,305,185,253,193,319,188,309,183,302,178,297,173,294,161,294,155,295,
-47,253,64,253,109,337,109,337,64,253,124,305,109,337,124,305,140,337,140,337,124,305,185,253,140,337,185,253,203,253,
-193,319,188,309,183,302,178,297,173,294,161,294,155,295,148,298,139,302,128,307,121,311,107,315,100,316,93,316,79,314,67,308,56,298,48,284,42,266,57,266,61,274,65,281,70,285,76,288,83,289,88,289,92,288,98,286,105,282,114,278,125,273,134,269,141,267,148,266,155,266,170,268,182,274,192,284,201,299,208,319,203,273,203,300,47,300,47,273,250,385,250,410,0,410,0,385,180,332,171,313,162,300,151,290,139,285,124,283,107,285,93,291,82,301,73,315,68,332,54,332,56,305,64,283,78,267,98,257,123,253,145,256,164,266,178,281,188,303,194,332,150,286,148,294,145,301,140,306,133,310,124,311,116,310,109,306,104,301,101,294,
-61,274,65,281,67,308,67,308,65,281,70,285,67,308,70,285,79,314,79,314,70,285,76,288,79,314,76,288,83,289,83,289,88,289,93,316,93,316,88,289,92,288,93,316,92,288,98,286,57,266,61,274,67,308,57,266,67,308,56,298,57,266,56,298,48,284,57,266,48,284,42,266,155,266,170,268,161,294,161,294,170,268,166,294,173,294,166,294,170,268,173,294,170,268,182,274,193,319,188,309,192,284,193,319,192,284,201,299,193,319,201,299,208,319,183,302,178,297,182,274,183,302,182,274,192,284,183,302,192,284,188,309,114,313,114,278,121,311,121,311,114,278,125,273,121,311,125,273,128,307,128,307,125,273,134,269,128,307,134,269,139,302,139,302,134,269,141,267,139,302,141,267,148,298,148,298,141,267,148,266,148,298,148,266,155,295,155,295,148,266,155,266,155,295,155,266,161,294,93,316,98,286,100,316,100,316,98,286,105,282,100,316,105,282,107,315,107,315,105,282,114,278,107,315,114,278,114,313,93,316,79,314,83,289,173,294,182,274,178,297,
-203,273,203,300,47,300,47,273,250,385,250,410,0,410,0,385,
-203,273,203,300,47,300,203,273,47,300,47,273,
-250,385,250,410,0,410,0,385,180,332,171,313,162,300,151,290,
-250,385,250,410,0,410,250,385,0,410,0,385,
-180,332,171,313,162,300,151,290,139,285,124,283,107,285,93,291,82,301,73,315,68,332,54,332,56,305,64,283,78,267,98,257,123,253,145,256,164,266,178,281,188,303,194,332,150,286,148,294,145,301,140,306,133,310,124,311,116,310,109,306,104,301,101,294,100,286,101,278,105,272,110,266,117,263,124,262,132,263,139,266,145,271,148,278,150,286,200,286,
-107,285,93,291,98,257,98,257,93,291,82,301,98,257,82,301,78,267,78,267,82,301,73,315,78,267,73,315,68,332,171,313,162,300,164,266,164,266,162,300,151,290,164,266,151,290,145,256,145,256,151,290,139,285,145,256,139,285,124,283,124,283,107,285,123,253,123,253,107,285,98,257,68,332,54,332,56,305,68,332,56,305,64,283,68,332,64,283,78,267,180,332,171,313,178,281,180,332,178,281,188,303,180,332,188,303,194,332,124,283,123,253,145,256,171,313,164,266,178,281,
-150,286,148,294,145,301,140,306,133,310,124,311,116,310,109,306,104,301,101,294,100,286,101,278,105,272,110,266,117,263,124,262,132,263,139,266,145,271,148,278,150,286,200,286,198,294,195,301,189,306,182,310,175,311,167,310,160,306,155,301,151,294,150,286,151,278,155,272,160,266,166,263,174,262,182,263,189,266,195,272,198,278,200,286,
-124,262,132,263,133,310,133,310,132,263,139,266,133,310,139,266,140,306,140,306,139,266,145,271,140,306,145,271,145,301,145,301,145,271,148,278,145,301,148,278,148,294,148,294,148,278,150,286,101,294,101,278,104,301,104,301,101,278,105,272,104,301,105,272,109,306,109,306,105,272,110,266,109,306,110,266,116,310,116,310,110,266,117,263,116,310,117,263,124,311,124,311,117,263,124,262,124,311,124,262,133,310,101,278,101,294,100,286,
-200,286,198,294,195,301,189,306,182,310,175,311,167,310,160,306,155,301,151,294,150,286,151,278,155,272,160,266,166,263,174,262,182,263,189,266,195,272,198,278,200,286,16383,16383,100,286,99,294,95,301,90,306,83,310,75,311,67,310,60,306,55,301,51,294,50,286,51,278,55,272,60,266,67,263,75,262,83,263,90,266,95,272,99,278,100,286,109,291,109,246,126,246,127,263,131,263,147,266,160,274,171,287,178,303,181,321,179,337,175,352,165,364,150,373,129,376,122,375,116,374,109,372,104,370,99,367,94,363,91,359,88,354,86,346,87,342,89,338,92,335,96,333,100,332,109,335,113,343,116,353,121,361,131,364,139,362,146,356,150,347,153,336,153,325,152,314,146,304,138,297,128,292,
-75,311,75,262,83,310,83,310,75,262,83,263,83,310,83,263,90,306,90,306,83,263,90,266,90,306,90,266,95,301,95,301,90,266,95,272,95,301,95,272,99,294,99,294,95,272,99,278,99,294,99,278,100,286,50,286,51,278,51,294,51,294,51,278,55,272,51,294,55,272,55,301,55,301,55,272,60,266,55,301,60,266,60,306,60,306,60,266,67,263,60,306,67,263,67,310,67,310,67,263,75,262,67,310,75,262,75,311,150,286,151,278,151,294,151,294,151,278,155,272,151,294,155,272,155,301,155,301,155,272,160,266,155,301,160,266,160,306,160,306,160,266,166,263,160,306,166,263,167,310,167,310,166,263,174,262,167,310,174,262,175,311,175,311,174,262,182,263,175,311,182,263,182,310,182,310,182,263,189,266,182,310,189,266,189,306,189,306,189,266,195,272,189,306,195,272,195,301,195,301,195,272,198,278,195,301,198,278,198,294,198,294,198,278,200,286,
-109,291,109,246,126,246,127,263,131,263,147,266,160,274,171,287,178,303,181,321,179,337,175,352,165,364,150,373,129,376,122,375,116,374,109,372,104,370,99,367,94,363,91,359,88,354,86,346,87,342,89,338,92,335,96,333,100,332,109,335,113,343,116,353,121,361,131,364,139,362,146,356,150,347,153,336,153,325,152,314,146,304,138,297,128,292,116,291,175,305,173,321,165,335,155,346,141,353,126,355,110,353,96,346,85,335,78,322,75,306,78,290,85,276,95,266,109,259,124,256,140,259,154,266,165,276,173,290,175,305,16383,16383,158,306,156,295,152,286,144,279,135,275,124,273,114,275,106,279,99,286,94,295,93,306,94,316,99,325,106,332,115,337,124,339,135,337,144,332,151,325,156,316,158,306,118,253,
-131,364,129,376,122,375,131,364,122,375,121,361,131,364,150,373,129,376,121,361,122,375,116,353,116,353,122,375,116,374,116,353,116,374,113,343,113,343,116,374,109,372,113,343,109,372,109,335,109,335,109,372,104,370,109,335,104,370,100,332,100,332,104,370,99,367,100,332,99,367,96,333,96,333,99,367,94,363,96,333,94,363,92,335,92,335,94,363,91,359,92,335,91,359,89,338,89,338,91,359,88,354,89,338,88,354,87,342,87,342,88,354,87,350,87,342,87,350,86,346,181,321,179,337,178,303,178,303,179,337,175,352,178,303,175,352,171,287,171,287,175,352,165,364,171,287,165,364,160,274,160,274,165,364,153,325,153,336,153,325,165,364,153,336,165,364,150,373,153,336,150,373,150,347,150,373,131,364,139,362,150,373,139,362,146,356,150,373,146,356,150,347,152,314,146,304,147,266,152,314,147,266,160,274,152,314,160,274,153,325,126,246,127,263,128,292,128,292,127,263,131,263,128,292,131,263,138,297,138,297,131,263,147,266,138,297,147,266,146,304,126,246,128,292,116,291,126,246,116,291,109,291,126,246,109,291,109,246,
-175,305,173,321,165,335,155,346,141,353,126,355,110,353,96,346,85,335,78,322,75,306,78,290,85,276,95,266,109,259,124,256,140,259,154,266,165,276,173,290,175,305,16383,16383,158,306,156,295,152,286,144,279,135,275,124,273,114,275,106,279,99,286,94,295,93,306,94,316,99,325,106,332,115,337,124,339,135,337,144,332,151,325,156,316,158,306,118,253,137,253,214,301,220,305,224,310,227,314,229,324,228,329,226,333,222,336,218,338,212,339,208,339,204,338,200,336,196,333,190,328,16383,16383,40,253,60,253,137,301,142,305,146,310,149,314,151,319,151,324,150,329,148,333,144,336,140,338,134,339,130,339,126,338,123,336,118,333,113,328,203,337,185,337,125,286,65,337,47,337,109,253,141,253,
-156,295,152,286,154,266,154,266,152,286,144,279,154,266,144,279,140,259,140,259,144,279,135,275,140,259,135,275,124,256,124,256,135,275,124,273,126,355,124,339,135,337,126,355,135,337,141,353,141,353,135,337,144,332,141,353,144,332,155,346,155,346,144,332,151,325,155,346,151,325,156,316,175,305,173,321,173,290,173,290,173,321,165,335,173,290,165,335,165,276,165,276,165,335,158,306,156,316,158,306,165,335,156,316,165,335,155,346,156,295,154,266,165,276,156,295,165,276,158,306,99,325,106,332,110,353,110,353,106,332,115,337,110,353,115,337,126,355,126,355,115,337,124,339,96,346,85,335,93,306,96,346,93,306,94,316,96,346,94,316,99,325,96,346,99,325,110,353,99,286,94,295,95,266,95,266,94,295,93,306,114,275,106,279,109,259,114,275,109,259,124,256,114,275,124,256,124,273,99,286,95,266,109,259,99,286,109,259,106,279,75,306,78,290,78,322,78,322,78,290,85,276,78,322,85,276,85,335,85,335,85,276,95,266,85,335,95,266,93,306,
-118,253,137,253,214,301,220,305,224,310,227,314,229,324,228,329,226,333,222,336,218,338,212,339,208,339,204,338,200,336,196,333,190,328,16383,16383,40,253,60,253,137,301,142,305,146,310,149,314,151,319,151,324,150,329,148,333,144,336,140,338,134,339,130,339,126,338,123,336,118,333,113,328,203,337,185,337,125,286,65,337,47,337,109,253,141,253,142,250,142,350,115,350,115,250,174,250,174,350,146,350,146,250,16383,16383,104,250,104,350,77,350,77,250,229,253,156,328,151,333,146,336,142,338,138,339,134,339,129,338,124,336,121,333,119,329,118,324,118,319,120,314,123,310,127,305,
-212,339,214,301,218,338,218,338,214,301,220,305,218,338,220,305,222,336,222,336,220,305,224,310,222,336,224,310,226,333,226,333,224,310,227,314,226,333,227,314,228,329,228,329,227,314,228,319,228,329,228,319,229,324,214,301,212,339,208,339,214,301,208,339,204,338,214,301,204,338,200,336,214,301,200,336,196,333,214,301,196,333,190,328,214,301,190,328,137,253,134,339,137,301,140,338,140,338,137,301,142,305,140,338,142,305,144,336,144,336,142,305,146,310,144,336,146,310,148,333,148,333,146,310,149,314,148,333,149,314,150,329,150,329,149,314,151,319,150,329,151,319,151,324,137,301,134,339,130,339,137,301,130,339,126,338,137,301,126,338,123,336,137,301,123,336,118,333,137,301,118,333,113,328,137,301,113,328,60,253,60,253,113,328,40,253,137,253,190,328,118,253,
-203,337,185,337,125,286,65,337,47,337,109,253,141,253,142,250,142,350,115,350,115,250,174,250,174,350,146,350,
-203,337,185,337,141,253,141,253,185,337,125,286,141,253,125,286,109,253,109,253,125,286,65,337,109,253,65,337,47,337,
-142,250,142,350,115,350,115,250,174,250,174,350,146,350,146,250,
-142,250,142,350,115,350,142,250,115,350,115,250,
-174,250,174,350,146,350,146,250,16383,16383,104,250,104,350,77,350,77,250,229,253,156,328,151,333,146,336,142,338,138,339,134,339,129,338,124,336,
-146,350,146,250,174,250,146,350,174,250,174,350,77,350,77,250,104,250,77,350,104,250,104,350,
-229,253,156,328,151,333,146,336,142,338,138,339,134,339,129,338,124,336,121,333,119,329,118,324,118,319,120,314,123,310,127,305,132,301,209,253,16383,16383,151,253,78,328,73,333,68,336,64,338,60,339,56,339,51,338,46,336,43,333,40,329,40,319,42,314,44,310,49,305,54,301,131,253,150,358,148,366,145,373,140,379,133,382,124,383,116,382,109,379,104,373,101,366,100,358,101,351,105,344,110,339,117,335,124,334,132,335,139,339,145,344,148,350,150,358,16383,16383,180,332,171,313,162,300,151,290,139,285,124,283,107,285,93,291,82,301,73,315,68,332,54,332,56,305,64,283,
-209,253,229,253,156,328,209,253,156,328,151,333,209,253,151,333,146,336,209,253,146,336,142,338,209,253,142,338,138,339,209,253,138,339,134,339,209,253,134,339,132,301,118,324,118,319,119,329,119,329,118,319,120,314,119,329,120,314,121,333,121,333,120,314,123,310,121,333,123,310,124,336,124,336,123,310,127,305,124,336,127,305,129,338,129,338,127,305,132,301,129,338,132,301,134,339,131,253,151,253,78,328,131,253,78,328,73,333,131,253,73,333,68,336,131,253,68,336,64,338,131,253,64,338,60,339,131,253,60,339,56,339,131,253,56,339,54,301,40,324,40,319,40,329,40,329,40,319,42,314,40,329,42,314,43,333,43,333,42,314,44,310,43,333,44,310,46,336,46,336,44,310,49,305,46,336,49,305,51,338,51,338,49,305,54,301,51,338,54,301,56,339,
-353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,22,258,18,256,15,252,13,248,12,226,9,226,0,16383,16383,224,128,108,128,166,266,211,175,235,181,254,191,268,205,277,224,280,248,274,277,258,300,232,317,195,327,148,331,8,331,8,321,29,320,43,316,51,308,55,295,56,275,56,56,55,37,51,24,42,16,29,11,8,9,8,0,177,0,217,4,250,15,275,34,291,58,296,89,292,116,281,138,263,155,239,167,211,174,16383,16383,108,183,108,303,109,307,112,310,115,312,119,313,162,310,192,302,
-55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,258,18,256,15,353,0,353,0,256,15,252,13,353,0,252,13,248,12,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,22,258,18,353,0,260,22,353,0,261,26,226,9,226,0,353,0,226,9,353,0,248,12,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,
-211,175,235,181,254,191,268,205,277,224,280,248,274,277,258,300,232,317,195,327,148,331,8,331,8,321,29,320,43,316,51,308,55,295,56,275,56,56,55,37,51,24,42,16,29,11,8,9,8,0,177,0,217,4,250,15,275,34,291,58,296,89,292,116,281,138,263,155,239,167,211,174,16383,16383,108,183,108,303,109,307,112,310,115,312,119,313,162,310,192,302,213,289,225,270,228,245,225,223,214,205,197,193,172,186,139,183,16383,16383,108,163,140,163,171,161,198,155,220,142,234,121,239,89,234,59,220,39,198,26,170,20,138,18,126,19,118,21,112,26,109,32,108,41,289,247,286,331,6,331,6,321,25,319,38,315,45,307,49,294,50,276,50,62,49,40,45,25,37,16,25,12,6,9,6,0,146,0,146,9,126,11,113,16,105,24,101,37,100,56,100,292,101,300,103,306,106,310,111,311,118,312,206,312,232,310,251,303,264,291,272,273,276,247,338,0,184,337,174,337,24,0,16383,16383,262,46,68,46,166,266,299,84,285,84,271,57,254,38,230,26,197,20,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,
-51,24,42,16,177,0,177,0,42,16,29,11,177,0,29,11,8,9,55,295,56,275,112,310,55,295,112,310,148,331,148,331,112,310,115,312,148,331,115,312,119,313,119,313,162,310,148,331,148,331,162,310,195,327,239,89,234,59,250,15,250,15,234,59,220,39,250,15,220,39,217,4,217,4,220,39,198,26,217,4,198,26,177,0,177,0,198,26,170,20,177,0,170,20,138,18,138,18,126,19,177,0,177,0,126,19,118,21,177,0,118,21,55,37,55,37,118,21,56,56,213,289,225,270,232,317,232,317,225,270,228,245,235,181,228,245,225,223,195,327,162,310,192,302,195,327,192,302,213,289,195,327,213,289,232,317,235,181,254,191,258,300,258,300,254,191,268,205,258,300,268,205,274,277,274,277,268,205,277,224,274,277,277,224,280,248,232,317,228,245,235,181,232,317,235,181,258,300,234,121,239,167,220,142,220,142,239,167,211,174,220,142,211,174,198,155,198,155,211,174,211,175,198,155,211,175,214,205,214,205,211,175,235,181,214,205,235,181,225,223,140,163,171,161,172,186,172,186,171,161,198,155,172,186,198,155,197,193,197,193,198,155,214,205,140,163,172,186,139,183,140,163,139,183,108,183,140,163,108,183,108,163,109,32,108,41,56,275,109,32,56,275,56,56,296,89,292,116,291,58,291,58,292,116,281,138,291,58,281,138,275,34,275,34,281,138,263,155,275,34,263,155,250,15,250,15,263,155,239,167,250,15,239,167,239,89,56,56,118,21,112,26,56,56,112,26,109,32,56,275,108,41,108,296,56,275,108,296,108,303,56,275,108,303,109,307,56,275,109,307,112,310,148,331,8,331,29,320,148,331,29,320,43,316,148,331,43,316,51,308,148,331,51,308,55,295,29,320,8,331,8,321,177,0,8,9,8,0,51,24,177,0,55,37,239,167,234,121,239,89,
-289,247,286,331,6,331,6,321,25,319,38,315,45,307,49,294,50,276,50,62,49,40,45,25,37,16,25,12,6,9,6,0,146,0,146,9,126,11,113,16,105,24,101,37,100,56,100,292,101,300,103,306,106,310,111,311,118,312,206,312,232,310,251,303,264,291,272,273,276,247,338,0,184,337,174,337,24,0,16383,16383,262,46,68,46,166,266,299,84,285,84,271,57,254,38,230,26,197,20,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,
-38,315,45,307,286,331,286,331,45,307,111,311,286,331,111,311,118,312,286,331,118,312,206,312,286,331,206,312,232,310,286,331,232,310,251,303,286,331,251,303,264,291,286,331,264,291,272,273,286,331,272,273,276,247,286,331,276,247,289,247,100,56,100,292,50,276,50,276,100,292,101,300,50,276,101,300,103,306,50,276,103,306,106,310,50,276,106,310,49,294,50,276,101,37,100,56,111,311,45,307,49,294,111,311,49,294,106,310,25,319,38,315,286,331,25,319,286,331,6,331,25,319,6,331,6,321,146,0,146,9,126,11,146,0,126,11,113,16,146,0,113,16,49,40,146,0,49,40,45,25,146,0,45,25,37,16,146,0,37,16,25,12,146,0,25,12,6,9,146,0,6,9,6,0,50,62,49,40,113,16,50,62,113,16,105,24,50,62,105,24,101,37,50,62,101,37,50,276,
-338,0,184,337,174,337,24,0,16383,16383,262,46,68,46,166,266,299,84,285,84,271,57,254,38,230,26,197,20,151,18,132,19,
-174,337,24,0,68,46,68,46,24,0,338,0,68,46,338,0,262,46,262,46,338,0,184,337,262,46,184,337,174,337,174,337,68,46,166,266,174,337,166,266,262,46,
-299,84,285,84,271,57,254,38,230,26,197,20,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,118,312,179,311,219,306,243,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,299,88,287,88,282,72,278,59,273,49,266,40,257,33,249,28,240,24,228,21,215,20,199,19,73,19,289,324,289,331,26,331,16,246,29,246,32,260,35,271,38,279,43,287,50,295,58,301,68,306,81,309,97,311,117,312,224,312,5,7,5,0,286,0,352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,211,331,211,321,231,319,244,315,251,307,255,294,256,274,256,180,104,180,104,274,
-45,24,38,16,276,0,276,0,38,16,25,12,276,0,25,12,6,9,38,315,45,307,271,331,271,331,45,307,111,312,271,331,111,312,118,312,118,312,179,311,271,331,271,331,179,311,219,306,271,331,219,306,243,297,271,331,243,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,45,24,117,21,49,37,49,37,117,21,108,25,49,37,108,25,50,57,50,57,108,25,102,31,50,57,102,31,50,275,50,275,102,31,100,42,50,275,100,42,100,294,100,184,100,164,176,164,100,184,176,164,176,184,198,185,176,184,198,162,198,185,198,162,213,190,213,190,198,162,213,158,213,190,213,158,222,198,222,198,213,158,222,150,222,198,222,150,229,212,229,212,222,150,229,136,229,212,229,136,233,232,233,232,229,136,233,115,233,232,233,115,244,115,50,275,100,294,101,302,50,275,101,302,103,307,50,275,103,307,106,310,50,275,106,310,49,294,106,310,111,312,45,307,106,310,45,307,49,294,25,320,38,315,271,331,25,320,271,331,6,331,25,320,6,331,6,321,254,38,230,26,276,0,276,0,230,26,197,20,276,0,197,20,151,18,151,18,132,19,276,0,276,0,132,19,117,21,276,0,117,21,45,24,276,0,299,84,285,84,276,0,285,84,271,57,276,0,271,57,254,38,176,184,176,164,198,162,233,232,244,115,244,232,276,0,6,9,6,0,
-299,88,287,88,282,72,278,59,273,49,266,40,257,33,249,28,240,24,228,21,215,20,199,19,73,19,289,324,289,331,26,331,16,246,29,246,32,260,35,271,38,279,43,287,50,295,58,301,68,306,81,309,97,311,117,312,224,312,5,7,5,0,286,0,352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,211,331,211,321,231,319,244,315,251,307,255,294,256,274,256,180,104,180,104,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,
-35,271,38,279,26,331,26,331,38,279,43,287,26,331,43,287,50,295,50,295,58,301,26,331,26,331,58,301,68,306,26,331,68,306,81,309,73,19,289,324,224,312,224,312,289,324,289,331,224,312,289,331,117,312,97,311,117,312,289,331,97,311,289,331,26,331,26,331,16,246,29,246,26,331,29,246,32,260,26,331,32,260,35,271,224,312,5,7,73,19,73,19,5,7,286,0,73,19,286,0,199,19,199,19,286,0,215,20,278,59,273,49,286,0,286,0,273,49,266,40,286,0,266,40,257,33,257,33,249,28,286,0,286,0,249,28,240,24,286,0,240,24,228,21,286,0,299,88,287,88,286,0,287,88,282,72,286,0,282,72,278,59,286,0,5,7,5,0,215,20,286,0,228,21,26,331,81,309,97,311,
-352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,211,331,211,321,231,319,244,315,251,307,255,294,256,274,256,180,104,180,104,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,28,319,41,315,49,307,53,294,54,274,54,61,53,39,49,25,42,16,29,12,9,9,9,0,148,0,148,9,129,12,117,17,109,25,105,38,104,56,104,157,256,157,256,62,255,41,252,26,244,17,232,12,212,9,212,0,251,118,249,129,247,142,245,170,245,189,246,197,247,204,251,220,238,220,235,211,231,203,226,197,218,193,209,191,156,191,146,192,139,196,133,201,129,209,124,220,112,220,114,210,116,197,117,184,117,172,118,161,118,153,115,126,113,118,125,118,129,129,134,138,139,144,146,148,156,149,209,149,219,148,226,144,231,137,235,128,238,118,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,
-49,25,42,16,148,0,148,0,42,16,29,12,148,0,29,12,9,9,149,331,9,331,28,319,149,331,28,319,41,315,149,331,41,315,49,307,149,331,49,307,53,294,149,331,53,294,118,315,149,331,118,315,130,319,149,331,130,319,149,321,54,274,105,38,104,56,104,180,104,157,256,157,104,180,256,157,256,180,256,180,256,157,312,25,256,180,312,25,308,37,54,274,104,56,104,274,54,274,104,274,106,294,54,274,106,294,110,307,54,274,110,307,118,315,54,274,118,315,53,294,252,26,244,17,352,0,352,0,244,17,232,12,352,0,232,12,212,9,333,319,352,321,352,331,333,319,352,331,320,315,320,315,352,331,255,294,320,315,255,294,256,274,308,37,256,274,256,180,307,55,307,274,256,274,256,274,307,274,308,293,256,274,308,293,312,307,352,331,211,331,231,319,352,331,231,319,244,315,352,331,244,315,251,307,352,331,251,307,255,294,352,0,352,9,333,12,352,0,333,12,320,17,352,0,320,17,255,41,352,0,255,41,252,26,256,62,255,41,320,17,256,62,320,17,312,25,256,62,312,25,256,157,148,0,148,9,129,12,148,0,129,12,117,17,148,0,117,17,53,39,148,0,53,39,49,25,54,61,53,39,117,17,54,61,117,17,109,25,54,61,109,25,105,38,54,61,105,38,54,274,148,0,9,9,9,0,352,0,212,9,212,0,256,274,308,37,307,55,231,319,211,331,211,321,320,315,256,274,312,307,28,319,9,331,9,321,
-251,118,249,129,247,142,245,170,245,189,246,197,247,204,251,220,238,220,235,211,231,203,226,197,218,193,209,191,156,191,146,192,139,196,133,201,129,209,124,220,112,220,114,210,116,197,117,184,117,172,118,161,118,153,115,126,113,118,125,118,129,129,134,138,139,144,146,148,156,149,209,149,219,148,226,144,231,137,235,128,238,118,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,362,0,362,9,349,11,336,16,322,25,305,41,283,64,166,192,259,281,278,298,292,309,305,316,320,320,338,321,338,331,208,331,208,321,220,321,229,320,235,318,238,315,240,311,241,305,239,298,234,289,226,280,202,256,113,174,113,293,117,307,124,315,137,319,158,321,158,331,17,331,17,321,37,319,50,315,57,306,61,293,62,275,62,63,61,40,57,26,50,17,36,12,17,9,17,0,157,0,157,9,139,12,126,16,118,23,114,36,113,55,113,148,126,158,176,107,198,84,217,63,232,46,241,32,244,22,244,18,241,15,237,12,231,11,224,10,210,9,210,0,344,0,344,9,330,12,320,17,311,26,304,38,296,55,179,337,
-207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,134,308,149,314,180,338,180,338,149,314,164,318,180,338,164,318,180,320,180,320,194,319,235,330,235,330,194,319,207,316,235,330,180,338,180,320,247,142,246,156,238,220,238,220,246,156,245,170,238,220,245,170,245,180,245,180,245,189,238,220,238,220,245,189,246,197,238,220,246,197,247,204,249,212,251,220,238,220,249,212,238,220,247,204,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,234,1,235,26,223,19,234,1,223,19,209,15,234,1,209,15,196,12,234,1,196,12,181,11,234,1,181,11,180,-6,226,144,231,137,231,203,231,203,231,137,235,128,231,203,235,128,235,211,235,211,235,128,238,118,235,211,238,118,238,220,238,220,238,118,249,129,238,220,249,129,247,142,156,149,209,149,209,191,218,193,209,191,219,148,218,193,219,148,226,197,226,197,219,148,226,144,226,197,226,144,231,203,209,191,156,191,156,149,146,148,156,149,156,191,146,148,156,191,146,192,146,148,146,192,139,144,139,144,146,192,139,196,139,144,139,196,134,138,134,138,139,196,133,201,134,138,133,201,129,129,129,129,133,201,129,209,129,129,129,209,125,118,125,118,129,209,124,220,125,118,124,220,118,161,118,161,124,220,117,172,124,220,112,220,114,210,124,220,114,210,116,197,124,220,116,197,117,184,124,220,117,184,117,172,125,118,118,161,118,153,125,118,118,153,117,144,125,118,117,144,116,135,125,118,116,135,115,126,125,118,115,126,113,118,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,154,15,180,-6,167,12,167,12,180,-6,181,11,142,19,130,25,180,-6,142,19,180,-6,154,15,81,24,74,166,46,61,126,330,134,308,180,338,209,191,209,149,219,148,249,129,238,118,251,118,
-157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,362,0,362,9,349,11,336,16,322,25,305,41,283,64,166,192,259,281,278,298,292,309,305,316,320,320,338,321,338,331,208,331,208,321,220,321,229,320,235,318,238,315,240,311,241,305,239,298,234,289,226,280,202,256,
-52,23,44,15,157,0,157,0,44,15,30,11,157,0,30,11,9,9,157,331,9,331,30,320,157,331,30,320,44,316,157,331,44,316,53,308,157,331,53,308,57,295,157,331,57,295,122,316,157,331,122,316,136,320,157,331,136,320,157,321,122,16,114,24,57,56,57,56,114,24,109,37,57,56,109,37,57,276,57,276,109,37,108,56,57,276,108,56,108,276,57,276,108,276,109,295,57,276,109,295,113,308,57,276,113,308,122,316,57,276,122,316,57,295,157,0,157,9,137,11,157,0,137,11,122,16,157,0,122,16,56,36,157,0,56,36,52,23,157,0,9,9,9,0,56,36,122,16,57,56,30,320,9,331,9,321,
-362,0,362,9,349,11,336,16,322,25,305,41,283,64,166,192,259,281,278,298,292,309,305,316,320,320,338,321,338,331,208,331,208,321,220,321,229,320,235,318,238,315,240,311,241,305,239,298,234,289,226,280,202,256,113,174,113,293,117,307,124,315,137,319,158,321,158,331,17,331,17,321,37,319,50,315,57,306,61,293,62,275,62,63,61,40,57,26,50,17,36,12,17,9,17,0,157,0,157,9,139,12,126,16,118,23,114,36,113,55,113,148,126,158,176,107,198,84,217,63,232,46,241,32,244,22,244,18,241,15,237,12,231,11,224,10,210,9,210,0,344,0,344,9,330,12,320,17,311,26,304,38,296,55,179,337,169,337,70,93,56,58,44,34,34,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,160,267,161,267,241,61,244,51,247,44,249,37,250,31,251,26,249,18,244,13,236,11,227,10,216,9,216,0,432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,
-158,321,158,321,137,319,137,319,158,321,158,331,137,319,158,331,124,315,124,315,158,331,61,293,124,315,61,293,62,275,114,36,62,275,62,63,114,36,62,63,118,23,118,23,62,63,126,16,62,275,114,36,113,55,113,174,113,148,126,158,113,174,126,158,202,256,202,256,126,158,166,192,202,256,166,192,259,281,62,275,113,55,113,274,62,275,113,274,113,293,62,275,113,293,117,307,62,275,117,307,124,315,158,331,17,331,37,319,158,331,37,319,50,315,158,331,50,315,57,306,158,331,57,306,61,293,234,289,226,280,259,281,259,281,226,280,215,269,259,281,215,269,202,256,338,331,208,331,220,321,338,331,220,321,229,320,338,331,229,320,235,318,338,331,235,318,238,315,338,331,238,315,240,311,338,331,240,311,241,305,338,331,241,305,305,316,338,331,305,316,320,320,338,331,320,320,338,321,241,305,259,281,278,298,241,305,278,298,292,309,241,305,292,309,305,316,239,298,234,289,259,281,239,298,259,281,241,305,241,15,237,12,362,0,362,0,237,12,231,11,362,0,231,11,224,10,244,22,362,0,336,16,244,22,336,16,322,25,244,22,322,25,305,41,244,22,305,41,283,64,244,22,283,64,241,32,283,64,166,192,176,107,283,64,176,107,198,84,283,64,198,84,217,63,283,64,217,63,232,46,283,64,232,46,241,32,349,11,336,16,362,0,349,11,362,0,362,9,244,18,241,15,362,0,244,18,362,0,244,22,210,9,210,0,362,0,210,9,362,0,224,10,157,0,157,9,139,12,157,0,139,12,126,16,157,0,126,16,61,40,157,0,61,40,57,26,157,0,57,26,50,17,157,0,50,17,36,12,157,0,36,12,17,9,157,0,17,9,17,0,61,40,126,16,62,63,176,107,166,192,126,158,220,321,208,331,208,321,37,319,17,331,17,321,
-344,0,344,9,330,12,320,17,311,26,304,38,296,55,179,337,169,337,70,93,56,58,44,34,34,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,160,267,161,267,241,61,244,51,247,44,249,37,250,31,251,26,249,18,244,13,236,11,227,10,216,9,216,0,432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,6,9,6,0,123,0,123,9,103,12,90,18,82,29,78,48,76,75,76,275,203,0,209,0,
-56,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,161,267,169,337,160,267,160,267,169,337,76,51,75,47,76,51,169,337,75,47,169,337,70,93,251,26,344,0,320,17,251,26,320,17,311,26,251,26,311,26,304,38,251,26,304,38,296,55,251,26,296,55,250,31,296,55,179,337,241,61,296,55,241,61,244,51,296,55,244,51,247,44,296,55,247,44,249,37,296,55,249,37,250,31,169,337,161,267,241,61,169,337,241,61,179,337,70,93,56,58,72,30,330,12,320,17,344,0,330,12,344,0,344,9,249,18,244,13,344,0,249,18,344,0,251,26,344,0,244,13,236,11,344,0,236,11,227,10,344,0,227,10,216,9,344,0,216,9,216,0,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,34,20,107,0,34,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,34,20,84,12,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,56,58,75,47,70,93,74,43,
-432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,6,9,6,0,123,0,123,9,103,12,90,18,82,29,78,48,76,75,76,275,203,0,209,0,337,286,337,61,336,40,333,26,325,17,312,12,292,9,292,0,353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,103,13,90,20,82,31,78,49,76,75,76,269,297,-5,306,-5,306,274,308,289,311,299,315,307,320,313,324,315,329,318,335,319,343,320,353,321,295,247,295,331,
-49,29,41,18,123,0,123,0,41,18,27,12,123,0,27,12,6,9,333,26,325,17,432,0,432,0,325,17,312,12,432,0,312,12,292,9,413,320,431,321,431,331,413,320,431,331,401,316,401,316,431,331,337,286,401,316,337,286,393,307,393,307,337,286,389,294,401,17,393,25,337,61,337,61,393,25,389,38,337,61,389,38,337,286,337,286,389,38,388,56,337,286,388,56,388,275,203,0,209,0,222,80,222,80,209,0,337,286,222,80,337,286,332,331,332,331,337,286,431,331,106,331,7,331,28,319,106,331,28,319,42,315,106,331,42,315,50,307,106,331,50,307,54,294,106,331,54,294,55,275,106,331,55,275,76,275,106,331,76,275,203,0,106,331,203,0,222,80,76,75,76,275,55,275,76,75,55,275,78,48,78,48,55,275,55,75,78,48,55,75,82,29,82,29,55,75,54,47,82,29,54,47,90,18,90,18,54,47,49,29,90,18,49,29,123,0,432,0,432,9,413,12,432,0,413,12,401,17,432,0,401,17,336,40,432,0,336,40,333,26,103,12,90,18,123,0,103,12,123,0,123,9,123,0,6,9,6,0,432,0,292,9,292,0,336,40,401,17,337,61,28,319,7,331,7,321,389,294,337,286,388,275,
-353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,103,13,90,20,82,31,78,49,76,75,76,269,297,-5,306,-5,306,274,308,289,311,299,315,307,320,313,324,315,329,318,335,319,343,320,353,321,295,247,295,331,26,331,26,246,39,246,43,263,48,276,55,284,66,289,79,290,242,290,256,289,266,284,274,276,279,263,282,247,16383,16383,252,109,252,225,240,225,239,211,235,200,229,193,219,189,207,188,114,188,102,189,93,193,87,200,83,211,81,225,70,225,70,109,81,109,84,122,87,132,93,140,101,146,113,147,205,147,218,146,227,141,234,133,239,123,240,109,16383,16383,307,0,
-49,30,41,19,123,0,123,0,41,19,27,13,123,0,27,13,6,9,256,319,263,317,353,331,353,331,263,317,269,313,353,331,269,313,275,309,275,309,278,303,353,331,353,331,278,303,281,295,353,331,281,295,324,315,324,315,281,295,320,313,324,315,320,313,320,312,320,312,320,313,315,307,315,307,320,313,284,274,315,307,284,274,284,259,297,-5,284,259,284,89,297,-5,284,89,91,331,353,331,324,315,329,318,353,331,329,318,335,319,353,331,335,319,343,320,353,331,343,320,353,321,306,-5,306,253,297,-5,297,-5,306,253,306,274,297,-5,306,274,284,259,284,259,306,274,308,289,284,259,308,289,311,299,283,285,284,274,320,313,283,285,320,313,281,295,247,320,256,319,353,331,247,320,353,331,235,331,247,320,235,331,235,321,91,331,6,331,19,321,91,331,19,321,29,318,91,331,29,318,37,313,91,331,37,313,46,306,91,331,46,306,55,295,91,331,55,295,76,269,91,331,76,269,297,-5,55,295,78,49,76,75,54,48,49,30,90,20,90,20,49,30,123,0,90,20,123,0,103,13,103,13,123,0,123,9,55,75,54,48,82,31,55,75,82,31,78,49,55,75,78,49,55,295,123,0,6,9,6,0,54,48,90,20,82,31,19,321,6,331,6,321,76,269,55,295,76,75,315,307,284,259,311,299,
-295,247,295,331,26,331,26,246,39,246,43,263,48,276,55,284,66,289,79,290,242,290,256,289,266,284,274,276,279,263,282,247,16383,16383,252,109,252,225,240,225,239,211,235,200,229,193,219,189,207,188,114,188,102,189,93,193,87,200,83,211,81,225,70,225,70,109,81,109,84,122,87,132,93,140,101,146,113,147,205,147,218,146,227,141,234,133,239,123,240,109,16383,16383,307,0,307,85,295,85,293,70,287,57,278,49,265,44,248,42,70,42,56,44,44,49,35,57,29,69,27,85,15,85,15,0,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,
-295,331,26,331,66,289,295,331,66,289,79,290,295,331,79,290,242,290,295,331,242,290,256,289,295,331,256,289,266,284,295,331,266,284,274,276,295,331,274,276,279,263,295,331,279,263,282,247,295,331,282,247,295,247,26,331,26,246,39,246,26,331,39,246,43,263,26,331,43,263,48,276,26,331,48,276,55,284,26,331,55,284,66,289,219,189,207,188,218,146,218,146,207,188,205,147,205,147,207,188,114,188,205,147,114,188,113,147,101,146,113,147,102,189,101,146,102,189,93,193,83,211,84,122,87,200,87,200,84,122,87,132,87,200,87,132,93,193,93,193,87,132,93,140,93,193,93,140,101,146,83,211,81,225,84,122,84,122,81,225,81,109,81,109,81,225,70,225,81,109,70,225,70,109,240,225,239,211,240,109,240,225,240,109,252,109,240,225,252,109,252,225,240,109,239,211,239,123,239,123,239,211,235,200,239,123,235,200,234,133,234,133,235,200,229,193,234,133,229,193,227,141,227,141,229,193,219,189,227,141,219,189,218,146,287,57,278,49,307,0,307,0,278,49,265,44,307,0,265,44,248,42,307,0,307,85,295,85,307,0,295,85,293,70,307,0,293,70,287,57,248,42,70,42,307,0,307,0,70,42,56,44,307,0,56,44,15,0,15,0,56,44,44,49,15,0,44,49,35,57,15,0,35,57,15,85,15,85,35,57,29,69,15,85,29,69,27,85,113,147,114,188,102,189,
-344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,9,331,9,321,28,319,41,315,49,307,53,294,54,274,54,61,53,39,49,25,42,16,29,12,9,9,9,0,148,0,148,9,129,12,117,17,109,25,105,38,104,56,104,296,105,303,107,307,111,310,116,312,238,312,245,311,251,310,254,306,256,301,256,62,255,41,252,26,244,17,232,12,212,9,212,0,8,331,8,321,27,319,39,315,46,307,49,294,50,276,50,39,47,25,40,16,27,12,
-149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,81,24,74,166,46,61,223,19,234,1,235,26,130,25,180,-6,142,19,
-352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,9,331,9,321,28,319,41,315,49,307,53,294,54,274,54,61,53,39,49,25,42,16,29,12,9,9,9,0,148,0,148,9,129,12,117,17,109,25,105,38,104,56,104,296,105,303,107,307,111,310,116,312,238,312,245,311,251,310,254,306,256,301,256,62,255,41,252,26,244,17,232,12,212,9,212,0,8,331,8,321,27,319,39,315,46,307,49,294,50,276,50,39,47,25,40,16,27,12,8,9,8,0,148,0,148,9,128,12,114,16,106,24,102,37,101,56,101,146,109,145,115,145,122,144,136,144,164,145,188,147,208,153,225,161,243,175,253,185,260,197,266,210,270,225,271,240,270,254,267,268,262,280,255,291,246,300,231,310,213,319,191,325,166,329,137,331,16383,16383,101,295,101,302,103,307,106,310,111,312,118,313,
-49,25,42,16,148,0,148,0,42,16,29,12,148,0,29,12,9,9,53,294,54,274,111,310,53,294,111,310,49,307,49,307,111,310,116,312,49,307,116,312,352,331,352,331,116,312,123,312,252,26,244,17,352,0,352,0,244,17,232,12,352,0,232,12,212,9,352,331,123,312,238,312,352,331,238,312,245,311,352,331,245,311,251,310,352,331,251,310,254,306,352,331,254,306,256,301,352,331,256,301,256,294,352,331,256,294,320,315,352,331,320,315,333,319,352,331,333,319,352,321,307,55,307,274,256,294,256,294,307,274,308,293,256,294,308,293,312,307,320,17,312,25,256,62,256,62,312,25,308,37,256,62,308,37,256,294,117,17,109,25,54,61,54,61,109,25,105,38,54,61,105,38,54,274,54,274,105,38,104,56,54,274,104,56,104,296,54,274,104,296,105,303,54,274,105,303,107,307,54,274,107,307,111,310,352,331,9,331,28,319,352,331,28,319,41,315,352,331,41,315,49,307,352,0,352,9,333,12,352,0,333,12,320,17,352,0,320,17,255,41,352,0,255,41,252,26,148,0,148,9,129,12,148,0,129,12,117,17,148,0,117,17,53,39,148,0,53,39,49,25,148,0,9,9,9,0,53,39,117,17,54,61,352,0,212,9,212,0,255,41,320,17,256,62,256,294,308,37,307,55,28,319,9,331,9,321,320,315,256,294,312,307,
-8,331,8,321,27,319,39,315,46,307,49,294,50,276,50,39,47,25,40,16,27,12,8,9,8,0,148,0,148,9,128,12,114,16,106,24,102,37,101,56,101,146,109,145,115,145,122,144,136,144,164,145,188,147,208,153,225,161,243,175,253,185,260,197,266,210,270,225,271,240,270,254,267,268,262,280,255,291,246,300,231,310,213,319,191,325,166,329,137,331,16383,16383,101,295,101,302,103,307,106,310,111,312,118,313,155,310,182,302,202,288,213,266,217,238,213,213,202,192,185,177,162,167,132,164,120,164,114,165,108,165,101,166,300,102,289,102,283,82,275,66,264,56,249,49,229,47,74,47,193,184,86,312,190,312,214,310,234,305,248,294,259,276,266,251,278,251,278,331,15,331,15,324,148,162,15,7,15,0,286,0,296,246,293,331,12,331,8,246,21,246,28,274,37,292,50,303,70,309,97,310,127,310,127,61,126,39,123,25,115,16,101,12,80,9,80,0,226,0,226,9,205,11,192,16,183,23,179,36,178,55,178,310,208,310,235,309,254,303,268,292,277,274,284,246,352,329,345,332,338,334,332,335,320,335,289,330,259,315,232,290,211,258,198,218,
-111,312,118,312,118,313,137,331,118,313,155,310,137,331,155,310,166,329,166,329,155,310,182,302,166,329,182,302,191,325,191,325,182,302,202,288,191,325,202,288,213,319,213,319,202,288,213,266,213,319,213,266,231,310,231,310,213,266,217,238,231,310,217,238,225,161,225,161,213,213,208,153,208,153,213,213,202,192,208,153,202,192,188,147,188,147,202,192,185,177,188,147,185,177,164,145,164,145,185,177,162,167,164,145,162,167,136,144,136,144,162,167,132,164,136,144,132,164,128,144,128,144,132,164,126,164,128,144,126,164,122,144,122,144,126,164,120,164,122,144,120,164,115,145,115,145,120,164,114,165,115,145,114,165,109,145,109,145,114,165,108,165,109,145,108,165,101,166,101,56,101,166,50,276,101,56,50,276,102,37,102,37,50,276,50,61,101,166,101,146,109,145,271,240,270,254,270,225,270,225,270,254,267,268,270,225,267,268,266,210,266,210,267,268,262,280,266,210,262,280,260,197,260,197,262,280,255,291,260,197,255,291,253,185,253,185,255,291,246,300,253,185,246,300,243,175,243,175,246,300,231,310,243,175,231,310,225,161,137,331,8,331,27,319,137,331,27,319,39,315,137,331,39,315,46,307,137,331,46,307,49,294,137,331,49,294,50,276,137,331,50,276,106,310,137,331,106,310,111,312,137,331,111,312,118,313,101,295,101,302,50,276,101,295,50,276,101,166,103,307,106,310,50,276,103,307,50,276,101,302,148,0,148,9,128,12,148,0,128,12,114,16,148,0,114,16,50,39,148,0,50,39,47,25,148,0,47,25,40,16,148,0,40,16,27,12,148,0,27,12,8,9,148,0,8,9,8,0,50,61,50,39,114,16,50,61,114,16,106,24,50,61,106,24,102,37,27,319,8,331,8,321,213,213,225,161,217,238,155,310,118,313,118,312,
-
-
-300,102,289,102,283,82,275,66,264,56,249,49,229,47,74,47,193,184,86,312,190,312,214,310,234,305,248,294,259,276,266,251,278,251,278,331,15,331,15,324,148,162,15,7,15,0,286,0,296,246,293,331,12,331,8,246,21,246,28,274,37,292,50,303,70,309,97,310,127,310,127,61,126,39,123,25,115,16,101,12,80,9,80,0,226,0,226,9,205,11,192,16,183,23,179,36,
-278,331,15,331,86,312,278,331,86,312,190,312,278,331,190,312,214,310,278,331,214,310,234,305,278,331,234,305,248,294,278,331,248,294,259,276,278,331,259,276,266,251,278,331,266,251,278,251,148,162,15,7,74,47,148,162,74,47,193,184,148,162,193,184,86,312,148,162,86,312,15,331,148,162,15,331,15,324,275,66,264,56,286,0,286,0,264,56,249,49,286,0,249,49,229,47,286,0,300,102,289,102,286,0,289,102,283,82,286,0,283,82,275,66,286,0,229,47,74,47,286,0,74,47,15,7,286,0,15,7,15,0,
-296,246,293,331,12,331,8,246,21,246,28,274,37,292,50,303,70,309,97,310,127,310,127,61,126,39,123,25,115,16,101,12,80,9,80,0,226,0,226,9,205,11,192,16,183,23,179,36,178,55,178,310,208,310,235,309,254,303,268,292,277,274,284,246,352,329,345,332,338,334,332,335,320,335,289,330,259,315,232,290,211,258,198,218,196,218,186,260,169,293,146,318,117,332,81,337,67,336,53,332,39,327,26,319,15,311,18,303,25,305,33,308,41,310,49,311,55,312,84,306,109,289,130,257,146,211,157,147,
-293,331,12,331,70,309,293,331,70,309,97,310,293,331,97,310,127,310,293,331,127,310,178,310,293,331,178,310,208,310,293,331,208,310,235,309,293,331,235,309,254,303,293,331,254,303,268,292,293,331,268,292,277,274,293,331,277,274,284,246,293,331,284,246,296,246,192,16,183,23,127,61,127,61,183,23,179,36,127,61,179,36,127,310,127,310,179,36,178,55,127,310,178,55,178,310,12,331,8,246,21,246,12,331,21,246,28,274,12,331,28,274,37,292,12,331,37,292,50,303,12,331,50,303,70,309,226,0,226,9,205,11,226,0,205,11,192,16,226,0,192,16,126,39,226,0,126,39,123,25,226,0,123,25,115,16,226,0,115,16,101,12,226,0,101,12,80,9,226,0,80,9,80,0,126,39,192,16,127,61,
-352,329,345,332,338,334,332,335,320,335,289,330,259,315,232,290,211,258,198,218,196,218,186,260,169,293,146,318,117,332,81,337,67,336,53,332,39,327,26,319,15,311,18,303,25,305,33,308,41,310,49,311,55,312,84,306,109,289,130,257,146,211,157,147,157,61,156,39,153,25,144,16,130,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,152,215,204,233,251,261,288,296,313,335,322,342,322,348,320,352,320,216,290,217,301,221,310,230,316,245,320,267,321,267,331,114,331,114,321,136,320,151,317,160,311,164,302,165,290,165,280,122,276,82,263,49,241,26,209,17,165,23,128,39,97,67,72,106,57,156,51,165,51,165,42,163,29,157,20,146,14,132,10,114,9,114,0,267,0,267,9,248,11,234,15,224,20,218,29,216,43,216,51,228,51,264,56,300,69,332,91,355,123,364,165,355,209,332,241,298,263,258,276,216,280,16383,16383,215,262,250,256,
-18,303,25,305,26,319,26,319,25,305,33,308,26,319,33,308,39,327,39,327,33,308,41,310,39,327,41,310,53,332,53,332,41,310,49,311,53,332,49,311,55,312,55,312,84,306,67,336,67,336,84,306,81,337,67,336,53,332,55,312,198,218,196,218,210,36,198,218,210,36,209,55,198,218,209,55,209,152,198,218,209,152,211,258,332,335,326,335,335,322,335,322,326,335,320,335,335,322,320,335,296,313,296,313,320,335,289,330,296,313,289,330,261,288,261,288,289,330,259,315,261,288,259,315,233,251,233,251,259,315,232,290,233,251,232,290,215,204,215,204,232,290,211,258,215,204,211,258,209,152,338,334,335,322,339,322,338,334,339,322,345,332,345,332,339,322,342,322,345,332,342,322,345,321,348,320,352,320,352,329,348,320,352,329,345,321,345,321,352,329,345,332,260,0,260,9,239,11,260,0,239,11,224,15,260,0,224,15,156,39,260,0,156,39,153,25,260,0,153,25,144,16,260,0,144,16,130,12,260,0,130,12,107,9,260,0,107,9,107,0,169,293,157,147,210,36,169,293,210,36,186,260,186,260,210,36,196,218,156,39,224,15,157,61,157,61,224,15,215,23,157,61,215,23,157,147,157,147,215,23,210,36,84,306,109,289,117,332,117,332,109,289,130,257,117,332,130,257,146,318,146,318,130,257,146,211,146,318,146,211,169,293,169,293,146,211,157,147,81,337,84,306,117,332,335,322,338,334,332,335,18,303,26,319,15,311,
-216,290,217,301,221,310,230,316,245,320,267,321,267,331,114,331,114,321,136,320,151,317,160,311,164,302,165,290,165,280,122,276,82,263,49,241,26,209,17,165,23,128,39,97,67,72,106,57,156,51,165,51,165,42,163,29,157,20,146,14,132,10,114,9,114,0,267,0,267,9,248,11,234,15,224,20,218,29,216,43,216,51,228,51,264,56,300,69,332,91,355,123,364,165,355,209,332,241,298,263,258,276,216,280,16383,16383,215,262,250,256,276,240,295,216,306,188,310,159,304,128,290,103,268,85,243,74,215,70,16383,16383,166,70,133,75,107,88,88,107,76,132,72,159,76,189,89,216,109,240,135,256,166,262,352,0,352,9,338,12,327,16,317,22,307,32,296,46,200,184,272,272,289,292,303,305,316,314,331,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,263,301,260,296,257,290,251,282,243,272,188,202,166,234,151,255,139,272,131,286,126,297,124,306,125,312,128,316,133,319,139,320,147,321,161,321,161,331,11,331,11,321,29,319,44,312,59,299,78,276,103,242,156,164,78,66,58,42,43,26,31,17,19,12,5,9,5,0,121,0,121,9,106,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,100,57,109,70,169,145,217,74,226,60,233,48,238,38,241,31,242,25,241,20,
-267,321,267,321,245,320,245,320,267,321,267,331,245,320,267,331,230,316,230,316,267,331,164,302,230,316,164,302,165,290,166,262,165,290,165,280,166,262,165,280,135,256,135,256,165,280,122,276,135,256,122,276,109,240,109,240,122,276,89,216,216,43,215,70,166,262,166,262,215,70,215,262,166,262,215,262,216,290,216,290,215,262,216,280,166,262,216,290,217,301,166,262,217,301,221,310,166,262,218,29,216,43,165,290,166,262,221,310,165,290,221,310,230,316,267,331,114,331,136,320,267,331,136,320,151,317,267,331,151,317,160,311,267,331,160,311,164,302,82,263,49,241,72,159,82,263,72,159,76,189,82,263,76,189,89,216,82,263,89,216,122,276,17,165,23,128,26,209,26,209,23,128,39,97,26,209,39,97,49,241,49,241,39,97,67,72,49,241,67,72,72,159,332,91,310,159,304,128,332,91,304,128,300,69,300,69,304,128,290,103,300,69,290,103,268,85,306,188,310,159,332,241,332,241,310,159,332,91,332,241,332,91,355,209,355,209,332,91,355,123,355,209,355,123,364,165,298,263,258,276,276,240,298,263,276,240,295,216,298,263,295,216,306,188,298,263,306,188,332,241,250,256,276,240,258,276,250,256,258,276,216,280,250,256,216,280,215,262,216,51,228,51,243,74,243,74,228,51,264,56,243,74,264,56,268,85,268,85,264,56,300,69,216,43,216,51,215,70,215,70,216,51,243,74,267,0,267,9,248,11,267,0,248,11,234,15,267,0,234,15,165,42,267,0,165,42,163,29,267,0,163,29,157,20,267,0,157,20,146,14,267,0,146,14,132,10,267,0,132,10,114,9,267,0,114,9,114,0,166,70,133,75,156,51,166,70,156,51,165,51,166,70,165,51,224,20,166,70,224,20,218,29,166,70,218,29,166,262,165,51,165,42,234,15,165,51,234,15,224,20,107,88,88,107,106,57,107,88,106,57,156,51,107,88,156,51,133,75,76,132,72,159,67,72,76,132,67,72,106,57,76,132,106,57,88,107,136,320,114,331,114,321,
-352,0,352,9,338,12,327,16,317,22,307,32,296,46,200,184,272,272,289,292,303,305,316,314,331,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,263,301,260,296,257,290,251,282,243,272,188,202,166,234,151,255,139,272,131,286,126,297,124,306,125,312,128,316,133,319,139,320,147,321,161,321,161,331,11,331,11,321,29,319,44,312,59,299,78,276,103,242,156,164,78,66,58,42,43,26,31,17,19,12,5,9,5,0,121,0,121,9,106,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,100,57,109,70,169,145,217,74,226,60,233,48,238,38,241,31,242,25,241,20,238,16,233,14,226,12,217,11,204,9,204,0,362,345,332,341,310,328,295,309,287,284,285,254,283,226,278,198,267,175,248,159,218,153,212,153,212,281,214,299,221,311,232,318,246,321,263,321,263,331,110,331,110,321,128,321,142,317,152,310,159,299,161,281,161,153,156,153,125,159,106,175,95,198,90,226,89,254,86,284,78,309,64,328,42,341,11,345,11,335,21,330,28,320,32,308,34,295,35,283,34,274,34,265,33,256,33,247,32,238,39,199,59,170,87,150,122,139,161,135,161,62,160,40,156,25,147,16,132,12,110,9,110,0,263,0,263,9,244,11,229,14,220,22,214,35,212,55,212,135,251,139,286,150,314,170,333,199,340,238,340,256,339,265,339,295,341,308,345,320,352,330,362,335,358,0,
-31,17,121,0,43,26,43,26,121,0,88,17,43,26,88,17,58,42,58,42,88,17,84,21,58,42,84,21,83,26,83,26,84,31,78,66,78,66,84,31,87,38,78,66,87,38,156,164,156,164,87,38,92,46,156,164,92,46,100,57,103,242,156,164,126,297,103,242,126,297,124,306,124,306,125,312,103,242,156,164,100,57,109,70,109,70,169,145,156,164,156,164,169,145,166,234,156,164,166,234,151,255,78,66,58,42,83,26,103,242,125,312,78,276,78,276,125,312,128,316,78,276,128,316,59,299,59,299,128,316,133,319,59,299,133,319,161,331,161,331,133,319,139,320,161,331,139,320,147,321,147,321,161,321,161,331,161,331,11,331,29,319,161,331,29,319,44,312,161,331,44,312,59,299,260,296,257,290,272,272,272,272,257,290,251,282,272,272,251,282,243,272,243,272,188,202,200,184,200,184,188,202,217,74,200,184,217,74,296,46,296,46,217,74,226,60,296,46,226,60,233,48,348,331,229,331,243,320,348,331,243,320,253,319,348,331,253,319,259,316,348,331,259,316,262,311,348,331,262,311,263,305,348,331,263,305,316,314,348,331,316,314,331,319,348,331,331,319,348,321,263,305,272,272,289,292,263,305,289,292,303,305,263,305,303,305,316,314,263,301,260,296,272,272,263,301,272,272,263,305,243,272,200,184,272,272,238,16,233,14,352,0,352,0,233,14,226,12,352,0,226,12,217,11,242,25,352,0,327,16,242,25,327,16,317,22,242,25,317,22,307,32,242,25,307,32,296,46,242,25,296,46,241,31,296,46,233,48,238,38,296,46,238,38,241,31,188,202,166,234,169,145,188,202,169,145,217,74,338,12,327,16,352,0,338,12,352,0,352,9,241,20,238,16,352,0,241,20,352,0,242,25,204,9,204,0,352,0,204,9,352,0,217,11,156,164,151,255,139,272,156,164,139,272,131,286,156,164,131,286,126,297,121,0,121,9,106,11,121,0,106,11,95,13,121,0,95,13,88,17,19,12,5,9,121,0,19,12,121,0,31,17,121,0,5,9,5,0,243,320,229,331,229,321,29,319,11,331,11,321,
-362,345,332,341,310,328,295,309,287,284,285,254,283,226,278,198,267,175,248,159,218,153,212,153,212,281,214,299,221,311,232,318,246,321,263,321,263,331,110,331,110,321,128,321,142,317,152,310,159,299,161,281,161,153,156,153,125,159,106,175,95,198,90,226,89,254,86,284,78,309,64,328,42,341,11,345,11,335,21,330,28,320,32,308,34,295,35,283,34,274,34,265,33,256,33,247,32,238,39,199,59,170,87,150,122,139,161,135,161,62,160,40,156,25,147,16,132,12,110,9,110,0,263,0,263,9,244,11,229,14,220,22,214,35,212,55,212,135,251,139,286,150,314,170,333,199,340,238,340,256,339,265,339,295,341,308,345,320,352,330,362,335,358,0,358,84,345,84,343,71,339,61,333,53,325,49,314,47,237,47,238,66,275,80,305,100,327,126,341,159,345,199,338,242,318,280,285,310,241,331,186,338,130,330,86,309,53,277,33,239,26,199,31,159,44,126,65,100,95,80,132,66,133,47,58,47,46,48,38,52,32,59,28,70,27,85,15,85,15,0,158,0,153,80,129,93,110,114,96,140,87,170,84,200,88,235,100,268,120,295,149,313,186,320,222,314,250,298,271,273,284,239,289,200,285,168,276,138,261,112,242,92,218,80,214,0,158,411,157,419,153,426,148,432,141,435,133,436,125,435,118,432,113,426,110,420,108,412,109,404,113,397,118,392,125,388,132,387,140,388,148,392,153,397,
-263,321,263,321,246,321,246,321,263,321,263,331,246,321,263,331,232,318,232,318,263,331,159,299,232,318,159,299,161,281,161,135,161,281,161,153,161,135,161,153,156,153,161,135,220,22,214,35,161,135,214,35,212,55,212,153,212,135,251,139,212,153,251,139,218,153,218,153,251,139,248,159,212,55,212,281,161,135,161,135,212,281,214,299,161,135,214,299,161,281,161,281,214,299,221,311,161,281,221,311,232,318,263,331,110,331,128,321,263,331,128,321,142,317,263,331,142,317,152,310,263,331,152,310,159,299,310,328,295,309,314,170,314,170,295,309,287,284,314,170,287,284,286,150,286,150,287,284,285,254,286,150,285,254,283,226,310,328,314,170,332,341,332,341,314,170,333,199,332,341,333,199,339,295,339,295,333,199,339,283,339,274,339,283,333,199,339,274,333,199,340,238,352,330,362,335,362,345,352,330,362,345,345,320,345,320,362,345,332,341,345,320,332,341,341,308,341,308,332,341,339,295,248,159,251,139,267,175,267,175,251,139,286,150,267,175,286,150,278,198,278,198,286,150,283,226,340,238,340,247,340,256,340,238,340,256,339,265,340,238,339,265,339,274,263,0,263,9,244,11,263,0,244,11,229,14,263,0,229,14,160,40,263,0,160,40,156,25,263,0,156,25,147,16,263,0,147,16,132,12,263,0,132,12,110,9,263,0,110,9,110,0,161,62,160,40,229,14,161,62,229,14,220,22,161,62,220,22,161,135,125,159,106,175,122,139,125,159,122,139,161,135,125,159,161,135,156,153,90,226,89,254,87,150,90,226,87,150,95,198,95,198,87,150,122,139,95,198,122,139,106,175,87,150,89,254,86,284,87,150,86,284,78,309,87,150,78,309,64,328,87,150,64,328,59,170,42,341,11,345,21,330,42,341,21,330,28,320,42,341,28,320,32,308,42,341,32,308,34,295,42,341,34,295,35,283,42,341,35,283,39,199,42,341,39,199,59,170,42,341,59,170,64,328,39,199,35,283,34,274,39,199,34,274,34,265,39,199,34,265,33,256,39,199,33,256,33,247,39,199,33,247,32,238,21,330,11,345,11,335,128,321,110,331,110,321,
-358,0,358,84,345,84,343,71,339,61,333,53,325,49,314,47,237,47,238,66,275,80,305,100,327,126,341,159,345,199,338,242,318,280,285,310,241,331,186,338,130,330,86,309,53,277,33,239,26,199,31,159,44,126,65,100,95,80,132,66,133,47,58,47,46,48,38,52,32,59,28,70,27,85,15,85,15,0,158,0,153,80,129,93,110,114,96,140,87,170,84,200,88,235,100,268,120,295,149,313,186,320,222,314,250,298,271,273,284,239,289,200,285,168,276,138,261,112,242,92,218,80,214,0,158,411,157,419,153,426,148,432,141,435,133,436,125,435,118,432,113,426,110,420,108,412,109,404,113,397,118,392,125,388,132,387,140,388,148,392,153,397,157,404,158,411,16383,16383,59,411,57,419,54,426,48,432,41,435,33,436,26,435,19,432,14,426,10,420,9,412,10,404,14,397,19,392,25,388,33,387,41,388,48,392,54,397,57,404,59,411,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,
-58,47,46,48,158,0,158,0,46,48,38,52,158,0,38,52,15,0,15,0,38,52,32,59,15,0,32,59,15,85,15,85,32,59,28,70,15,85,28,70,27,85,26,199,31,159,33,239,33,239,31,159,44,126,33,239,44,126,53,277,53,277,44,126,65,100,53,277,65,100,86,309,86,309,65,100,84,200,95,80,84,200,65,100,186,338,149,313,186,320,186,320,222,314,241,331,241,331,222,314,250,298,241,331,250,298,285,310,285,310,250,298,271,273,285,310,271,273,284,239,289,200,305,100,318,280,318,280,305,100,327,126,318,280,327,126,338,242,338,242,327,126,341,159,338,242,341,159,345,199,285,310,284,239,289,200,285,310,289,200,318,280,241,331,186,338,186,320,261,112,275,80,276,138,276,138,275,80,305,100,276,138,305,100,285,168,285,168,305,100,289,200,214,0,237,47,218,80,218,80,237,47,238,66,218,80,238,66,242,92,242,92,238,66,275,80,242,92,275,80,261,112,339,61,333,53,358,0,358,0,333,53,325,49,358,0,325,49,314,47,358,0,358,84,345,84,358,0,345,84,343,71,358,0,343,71,339,61,237,47,214,0,358,0,237,47,358,0,314,47,130,330,86,309,100,268,130,330,100,268,120,295,130,330,120,295,149,313,130,330,149,313,186,338,86,309,84,200,88,235,86,309,88,235,100,268,132,66,133,47,153,80,132,66,153,80,129,93,132,66,129,93,110,114,132,66,110,114,96,140,132,66,96,140,95,80,87,170,84,200,95,80,87,170,95,80,96,140,133,47,58,47,158,0,133,47,158,0,153,80,
-158,411,157,419,153,426,148,432,141,435,133,436,125,435,118,432,113,426,110,420,108,412,109,404,113,397,118,392,125,388,132,387,140,388,148,392,153,397,157,404,158,411,16383,16383,59,411,57,419,54,426,48,432,41,435,33,436,26,435,19,432,14,426,10,420,9,412,10,404,14,397,19,392,25,388,33,387,41,388,48,392,54,397,57,404,59,411,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,257,411,256,419,252,426,247,432,240,435,233,436,225,435,218,432,213,426,209,420,208,412,209,404,213,397,218,392,225,388,232,387,240,388,247,392,252,397,256,404,257,411,16383,16383,158,411,157,419,153,426,148,432,141,435,133,436,125,435,118,432,113,426,110,420,108,412,109,404,113,397,118,392,125,388,132,387,140,388,148,392,153,397,157,404,158,411,16383,16383,352,329,345,332,338,334,332,335,320,335,289,330,259,315,232,290,211,258,198,218,196,218,186,260,169,293,146,318,117,332,81,337,67,336,53,332,39,327,26,319,15,311,18,303,25,305,33,308,41,310,49,311,55,312,
-9,412,10,404,10,420,10,420,10,404,14,397,10,420,14,397,14,426,14,426,14,397,19,392,14,426,19,392,19,432,19,432,19,392,25,388,19,432,25,388,26,435,26,435,25,388,33,387,26,435,33,387,33,436,33,436,33,387,41,388,33,436,41,388,41,435,41,435,41,388,48,392,41,435,48,392,48,432,48,432,48,392,54,397,48,432,54,397,54,426,54,426,54,397,57,404,54,426,57,404,57,419,57,419,57,404,59,411,52,23,44,15,157,0,157,0,44,15,30,11,157,0,30,11,9,9,157,331,9,331,30,320,157,331,30,320,44,316,157,331,44,316,53,308,157,331,53,308,57,295,157,331,57,295,122,316,157,331,122,316,136,320,157,331,136,320,157,321,122,16,114,24,57,56,57,56,114,24,109,37,57,56,109,37,57,276,57,276,109,37,108,56,57,276,108,56,108,276,57,276,108,276,109,295,57,276,109,295,113,308,57,276,113,308,122,316,57,276,122,316,57,295,108,412,109,404,110,420,110,420,109,404,113,397,110,420,113,397,113,426,113,426,113,397,118,392,113,426,118,392,118,432,118,432,118,392,125,388,118,432,125,388,125,435,125,435,125,388,132,387,125,435,132,387,133,436,133,436,132,387,140,388,133,436,140,388,141,435,141,435,140,388,148,392,141,435,148,392,148,432,148,432,148,392,153,397,148,432,153,397,153,426,153,426,153,397,157,404,153,426,157,404,157,419,157,419,157,404,158,411,157,0,157,9,137,11,157,0,137,11,122,16,157,0,122,16,56,36,157,0,56,36,52,23,157,0,9,9,9,0,56,36,122,16,57,56,30,320,9,331,9,321,
-257,411,256,419,252,426,247,432,240,435,233,436,225,435,218,432,213,426,209,420,208,412,209,404,213,397,218,392,225,388,232,387,240,388,247,392,252,397,256,404,257,411,16383,16383,158,411,157,419,153,426,148,432,141,435,133,436,125,435,118,432,113,426,110,420,108,412,109,404,113,397,118,392,125,388,132,387,140,388,148,392,153,397,157,404,158,411,16383,16383,352,329,345,332,338,334,332,335,320,335,289,330,259,315,232,290,211,258,198,218,196,218,186,260,169,293,146,318,117,332,81,337,67,336,53,332,39,327,26,319,15,311,18,303,25,305,33,308,41,310,49,311,55,312,84,306,109,289,130,257,146,211,157,147,157,61,156,39,153,25,144,16,130,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,152,215,204,233,251,261,288,296,313,335,322,342,322,348,320,352,320,108,253,126,253,158,294,163,299,167,304,169,309,171,313,172,316,171,322,168,326,165,329,157,331,151,330,147,329,143,327,140,324,138,320,16383,16383,257,65,255,50,252,39,248,32,245,27,241,26,232,31,223,43,216,60,210,78,206,94,261,225,212,225,190,157,182,178,171,198,156,215,137,226,113,230,79,224,52,207,31,181,19,148,15,112,19,73,32,41,52,16,78,1,108,-4,129,-1,147,5,162,17,174,32,185,50,190,32,196,17,204,5,213,-1,225,-4,239,0,250,8,258,24,263,43,265,65,16383,16383,166,104,162,84,155,59,145,35,131,16,113,9,90,19,75,43,66,76,61,109,60,137,63,167,70,189,81,204,95,213,110,216,129,208,144,187,154,159,161,130,166,104,76,253,94,253,127,294,135,304,138,309,139,313,140,316,139,322,137,326,133,329,125,331,119,330,115,329,111,327,108,324,
-18,303,25,305,26,319,26,319,25,305,33,308,26,319,33,308,39,327,39,327,33,308,41,310,39,327,41,310,53,332,53,332,41,310,49,311,53,332,49,311,55,312,55,312,84,306,67,336,67,336,84,306,81,337,67,336,53,332,55,312,198,218,196,218,210,36,198,218,210,36,209,55,198,218,209,55,209,152,198,218,209,152,211,258,260,0,260,9,239,11,260,0,239,11,224,15,260,0,224,15,156,39,260,0,156,39,153,25,260,0,153,25,144,16,260,0,144,16,130,12,260,0,130,12,107,9,260,0,107,9,107,0,169,293,157,147,210,36,169,293,210,36,186,260,186,260,210,36,196,218,156,39,224,15,157,61,157,61,224,15,215,23,157,61,215,23,157,147,157,147,215,23,210,36,332,335,326,335,335,322,335,322,326,335,320,335,335,322,320,335,296,313,296,313,320,335,289,330,296,313,289,330,261,288,261,288,289,330,259,315,261,288,259,315,233,251,233,251,259,315,232,290,233,251,232,290,215,204,215,204,232,290,211,258,215,204,211,258,209,152,338,334,335,322,339,322,338,334,339,322,345,332,345,332,339,322,342,322,345,332,342,322,345,321,348,320,352,320,352,329,348,320,352,329,345,321,345,321,352,329,345,332,208,412,209,404,209,420,209,420,209,404,213,397,209,420,213,397,213,426,213,426,213,397,218,392,213,426,218,392,218,432,218,432,218,392,225,388,218,432,225,388,225,435,225,435,225,388,232,387,225,435,232,387,233,436,233,436,232,387,240,388,233,436,240,388,240,435,240,435,240,388,247,392,240,435,247,392,247,432,247,432,247,392,252,397,247,432,252,397,252,426,252,426,252,397,256,404,252,426,256,404,256,419,256,419,256,404,257,411,108,412,109,404,110,420,110,420,109,404,113,397,110,420,113,397,113,426,113,426,113,397,118,392,113,426,118,392,118,432,118,432,118,392,125,388,118,432,125,388,125,435,125,435,125,388,132,387,125,435,132,387,133,436,133,436,132,387,140,388,133,436,140,388,141,435,141,435,140,388,148,392,141,435,148,392,148,432,148,432,148,392,153,397,148,432,153,397,153,426,153,426,153,397,157,404,153,426,157,404,157,419,157,419,157,404,158,411,84,306,109,289,117,332,117,332,109,289,130,257,117,332,130,257,146,318,146,318,130,257,146,211,146,318,146,211,169,293,169,293,146,211,157,147,81,337,84,306,117,332,335,322,338,334,332,335,18,303,26,319,15,311,
-108,253,126,253,158,294,163,299,167,304,169,309,171,313,172,316,171,322,168,326,165,329,157,331,151,330,147,329,143,327,140,324,138,320,16383,16383,257,65,255,50,252,39,248,32,245,27,241,26,232,31,223,43,216,60,210,78,206,94,261,225,212,225,190,157,182,178,171,198,156,215,137,226,113,230,79,224,52,207,31,181,19,148,15,112,19,73,32,41,52,16,78,1,108,-4,129,-1,147,5,162,17,174,32,185,50,190,32,196,17,204,5,213,-1,225,-4,239,0,250,8,258,24,263,43,265,65,16383,16383,166,104,162,84,155,59,145,35,131,16,113,9,90,19,75,43,66,76,61,109,60,137,63,167,70,189,81,204,95,213,110,216,129,208,144,187,154,159,161,130,166,104,76,253,94,253,127,294,135,304,138,309,139,313,140,316,139,322,137,326,133,329,125,331,119,330,115,329,111,327,108,324,106,320,16383,16383,196,73,182,54,166,39,149,29,131,22,110,20,95,22,80,27,69,36,60,49,57,65,61,81,70,94,83,102,97,107,111,108,117,108,125,106,128,106,133,105,142,106,148,108,153,111,156,115,157,118,156,122,154,124,150,127,145,128,138,129,131,128,121,126,115,125,108,124,92,127,80,133,72,142,67,154,65,167,67,182,74,195,83,206,96,213,112,215,127,215,140,212,148,208,154,203,156,195,155,193,155,190,154,187,154,183,153,179,155,171,158,166,163,161,168,158,175,157,182,158,188,161,194,165,198,171,199,179,194,199,181,214,163,223,
-63,167,70,189,79,224,79,224,70,189,81,204,79,224,81,204,113,230,113,230,81,204,95,213,113,230,95,213,110,216,110,216,129,208,113,230,113,230,129,208,137,226,157,331,158,294,161,330,161,330,158,294,163,299,161,330,163,299,165,329,165,329,163,299,167,304,165,329,167,304,168,326,168,326,167,304,169,309,168,326,169,309,171,322,171,322,169,309,171,313,171,322,171,313,172,316,158,294,157,331,151,330,158,294,151,330,147,329,158,294,147,329,143,327,158,294,143,327,140,324,158,294,140,324,138,320,158,294,138,320,126,253,144,187,154,159,156,215,156,215,154,159,161,130,156,215,161,130,171,198,171,198,161,130,166,104,171,198,166,104,174,32,171,198,174,32,182,178,182,178,174,32,185,50,182,178,185,50,190,157,190,157,185,50,190,32,190,157,190,32,212,225,212,225,190,32,196,17,212,225,196,17,206,94,206,94,196,17,204,5,206,94,204,5,213,-1,137,226,129,208,144,187,137,226,144,187,156,215,174,32,166,104,162,84,174,32,162,84,162,17,162,17,162,84,155,59,162,17,155,59,147,5,147,5,155,59,145,35,147,5,145,35,131,16,78,1,108,-4,90,19,90,19,108,-4,113,9,131,16,113,9,129,-1,131,16,129,-1,147,5,210,78,206,94,213,-1,212,225,206,94,261,225,252,39,248,32,250,8,250,8,248,32,245,27,250,8,245,27,241,26,241,26,232,31,239,0,239,0,232,31,225,-4,210,78,213,-1,216,60,216,60,213,-1,225,-4,216,60,225,-4,223,43,223,43,225,-4,232,31,258,24,263,43,265,65,258,24,265,65,257,65,258,24,257,65,255,50,258,24,255,50,252,39,258,24,252,39,250,8,241,26,239,0,250,8,113,9,108,-4,129,-1,90,19,75,43,78,1,78,1,75,43,66,76,78,1,66,76,52,16,52,16,66,76,61,109,52,16,61,109,60,137,60,137,63,167,52,207,52,207,63,167,79,224,52,16,60,137,52,207,52,16,52,207,32,41,32,41,52,207,31,181,32,41,31,181,19,73,19,73,31,181,19,148,19,73,19,148,15,112,126,253,138,320,108,253,
-76,253,94,253,127,294,135,304,138,309,139,313,140,316,139,322,137,326,133,329,125,331,119,330,115,329,111,327,108,324,106,320,16383,16383,196,73,182,54,166,39,149,29,131,22,110,20,95,22,80,27,69,36,60,49,57,65,61,81,70,94,83,102,97,107,111,108,117,108,125,106,128,106,133,105,142,106,148,108,153,111,156,115,157,118,156,122,154,124,150,127,145,128,138,129,131,128,121,126,115,125,108,124,92,127,80,133,72,142,67,154,65,167,67,182,74,195,83,206,96,213,112,215,127,215,140,212,148,208,154,203,156,195,155,193,155,190,154,187,154,183,153,179,155,171,158,166,163,161,168,158,175,157,182,158,188,161,194,165,198,171,199,179,194,199,181,214,163,223,142,228,121,230,87,226,60,217,40,202,28,184,24,165,26,152,31,141,39,131,49,123,63,118,47,113,33,103,22,91,15,77,12,61,14,46,21,29,37,13,65,0,108,-4,130,-1,151,6,171,20,189,40,204,68,84,253,101,253,134,294,142,304,145,309,147,313,147,316,146,322,144,326,140,329,132,331,122,329,119,327,116,324,113,320,16383,16383,226,-107,223,-101,221,-94,219,-86,218,-76,218,160,216,182,208,202,196,217,180,226,159,230,145,229,131,224,117,216,102,205,87,190,86,190,84,205,81,215,76,223,68,226,56,228,44,225,33,216,22,203,13,188,5,172,12,170,15,176,25,188,30,193,36,194,39,193,41,190,44,184,45,173,46,156,46,0,88,0,88,174,100,185,111,194,120,199,130,202,140,203,153,201,163,195,170,185,174,172,176,154,176,-79,177,-89,179,-97,181,-103,184,-107,40,253,57,253,90,294,98,304,101,309,103,313,103,316,102,322,100,326,96,329,93,330,89,331,83,330,78,329,75,327,72,324,70,320,16383,16383,126,54,120,43,115,36,110,31,105,29,99,28,95,29,91,33,90,36,89,40,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,37,196,42,193,45,188,
-37,13,65,0,47,113,47,113,65,0,57,65,63,118,57,65,61,81,63,118,61,81,70,94,72,142,67,154,70,94,70,94,67,154,65,167,63,118,65,167,60,217,63,118,60,217,49,123,49,123,60,217,40,202,49,123,40,202,39,131,39,131,40,202,31,141,142,228,121,230,127,215,127,215,121,230,112,215,96,213,112,215,121,230,96,213,121,230,87,226,125,331,127,294,129,330,129,330,127,294,131,299,129,330,131,299,133,329,133,329,131,299,135,304,133,329,135,304,137,326,137,326,135,304,138,309,137,326,138,309,139,322,139,322,138,309,139,313,139,322,139,313,140,316,127,294,125,331,119,330,127,294,119,330,115,329,127,294,115,329,111,327,127,294,111,327,108,324,127,294,108,324,106,320,127,294,106,320,94,253,194,199,181,214,182,158,194,199,182,158,188,161,194,199,188,161,194,165,194,199,194,165,198,171,194,199,198,171,199,179,158,166,163,161,163,223,163,223,163,161,168,158,163,223,168,158,181,214,181,214,168,158,175,157,181,214,175,157,182,158,127,215,140,212,142,228,142,228,140,212,148,208,142,228,148,208,163,223,163,223,148,208,154,203,163,223,154,203,156,195,156,195,158,166,163,223,156,195,155,193,158,166,158,166,155,193,155,190,158,166,155,190,155,171,155,171,155,190,154,187,155,171,154,187,154,183,87,226,60,217,67,182,87,226,67,182,74,195,87,226,74,195,83,206,87,226,83,206,96,213,67,182,60,217,65,167,28,184,24,165,26,152,28,184,26,152,31,141,28,184,31,141,40,202,83,102,97,107,92,127,92,127,97,107,108,124,115,125,108,124,111,108,83,102,92,127,80,133,83,102,80,133,72,142,83,102,72,142,70,94,63,118,70,94,65,167,111,108,108,124,97,107,117,108,121,107,121,126,121,126,121,107,125,106,121,126,125,106,126,127,126,127,125,106,128,106,126,127,128,106,131,128,131,128,128,106,133,105,131,128,133,105,138,129,138,129,133,105,142,106,138,129,142,106,145,128,145,128,142,106,148,108,145,128,148,108,150,127,150,127,148,108,153,111,150,127,153,111,154,124,154,124,153,111,156,115,154,124,156,115,156,122,156,122,156,115,157,118,115,125,111,108,117,108,115,125,117,108,121,126,80,27,108,-4,95,22,95,22,108,-4,110,20,131,22,110,20,130,-1,131,22,130,-1,151,6,69,36,60,49,65,0,69,36,65,0,108,-4,69,36,108,-4,80,27,57,65,65,0,60,49,12,61,14,46,15,77,15,77,14,46,21,29,15,77,21,29,22,91,22,91,21,29,37,13,22,91,37,13,33,103,33,103,37,13,47,113,204,68,196,73,189,40,189,40,196,73,182,54,189,40,182,54,171,20,171,20,182,54,166,39,171,20,166,39,151,6,151,6,166,39,149,29,151,6,149,29,131,22,110,20,108,-4,130,-1,47,113,57,65,63,118,155,171,154,183,153,179,94,253,106,320,76,253,
-84,253,101,253,134,294,142,304,145,309,147,313,147,316,146,322,144,326,140,329,132,331,122,329,119,327,116,324,113,320,16383,16383,226,-107,223,-101,221,-94,219,-86,218,-76,218,160,216,182,208,202,196,217,180,226,159,230,145,229,131,224,117,216,102,205,87,190,86,190,84,205,81,215,76,223,68,226,56,228,44,225,33,216,22,203,13,188,5,172,12,170,15,176,25,188,30,193,36,194,39,193,41,190,44,184,45,173,46,156,46,0,88,0,88,174,100,185,111,194,120,199,130,202,140,203,153,201,163,195,170,185,174,172,176,154,176,-79,177,-89,179,-97,181,-103,184,-107,40,253,57,253,90,294,98,304,101,309,103,313,103,316,102,322,100,326,96,329,93,330,89,331,83,330,78,329,75,327,72,324,70,320,16383,16383,126,54,120,43,115,36,110,31,105,29,99,28,95,29,91,33,90,36,89,40,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,37,196,42,193,45,188,47,181,47,39,48,26,51,14,57,4,65,-2,77,-4,92,-1,105,7,116,20,126,35,133,50,202,278,201,286,197,293,192,298,185,302,177,303,169,302,163,298,157,293,154,286,152,278,154,271,157,264,163,258,169,255,177,253,185,255,192,258,197,264,
-15,176,20,182,22,203,22,203,20,182,25,188,22,203,25,188,33,216,33,216,25,188,30,193,33,216,30,193,36,194,36,194,39,193,44,225,44,225,39,193,41,190,44,225,41,190,44,184,13,188,5,172,12,170,13,188,12,170,15,176,13,188,15,176,22,203,87,190,86,190,88,0,87,190,88,0,88,174,87,190,88,174,102,205,88,174,100,185,102,205,102,205,100,185,111,194,102,205,111,194,117,216,117,216,111,194,120,199,117,216,120,199,131,224,131,224,120,199,130,202,131,224,130,202,140,203,140,203,153,201,145,229,145,229,153,201,159,230,88,0,86,190,84,205,88,0,84,205,81,215,88,0,81,215,76,223,88,0,76,223,68,226,88,0,68,226,56,228,88,0,56,228,46,156,88,0,46,156,46,0,145,229,131,224,140,203,218,-65,218,160,216,182,218,-65,216,182,208,202,218,-65,208,202,218,-76,196,217,180,226,181,-103,196,217,181,-103,184,-107,196,217,184,-107,218,-76,196,217,218,-76,208,202,184,-107,226,-107,223,-101,184,-107,223,-101,221,-94,184,-107,221,-94,219,-86,184,-107,219,-86,218,-76,180,226,159,230,163,195,180,226,163,195,170,185,180,226,170,185,174,172,180,226,174,172,176,154,180,226,176,154,176,-79,180,226,176,-79,177,-89,180,226,177,-89,179,-97,180,226,179,-97,181,-103,176,154,176,-64,176,-79,132,331,134,294,136,330,136,330,134,294,138,299,136,330,138,299,140,329,140,329,138,299,142,304,140,329,142,304,144,326,144,326,142,304,145,309,144,326,145,309,146,322,146,322,145,309,147,313,146,322,147,313,147,316,134,294,132,331,127,330,134,294,127,330,122,329,134,294,122,329,119,327,134,294,119,327,116,324,134,294,116,324,113,320,134,294,113,320,101,253,45,173,46,156,56,228,45,173,56,228,44,225,45,173,44,225,44,184,44,225,33,216,36,194,101,253,113,320,84,253,159,230,153,201,163,195,
-40,253,57,253,90,294,98,304,101,309,103,313,103,316,102,322,100,326,96,329,93,330,89,331,83,330,78,329,75,327,72,324,70,320,16383,16383,126,54,120,43,115,36,110,31,105,29,99,28,95,29,91,33,90,36,89,40,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,37,196,42,193,45,188,47,181,47,39,48,26,51,14,57,4,65,-2,77,-4,92,-1,105,7,116,20,126,35,133,50,202,278,201,286,197,293,192,298,185,302,177,303,169,302,163,298,157,293,154,286,152,278,154,271,157,264,163,258,169,255,177,253,185,255,192,258,197,264,201,271,202,278,16383,16383,100,253,118,253,151,294,159,304,162,309,163,313,164,316,163,322,161,326,157,329,149,331,143,330,139,329,135,327,132,324,130,320,16383,16383,103,278,101,286,98,293,92,298,85,302,78,303,70,302,63,298,58,293,54,286,53,278,54,271,58,264,
-89,331,90,294,93,330,93,330,90,294,94,299,93,330,94,299,96,329,96,329,94,299,98,304,96,329,98,304,100,326,100,326,98,304,101,309,100,326,101,309,102,322,102,322,101,309,103,313,102,322,103,313,103,316,90,294,89,331,83,330,90,294,83,330,78,329,90,294,78,329,75,327,90,294,75,327,72,324,90,294,72,324,70,320,90,294,70,320,57,253,45,188,57,219,42,193,42,193,57,219,41,214,42,193,41,214,37,196,37,196,41,214,31,196,28,196,31,196,41,214,28,196,41,214,26,208,57,4,65,-2,72,224,72,224,65,-2,77,-4,72,224,77,-4,88,230,88,230,77,-4,89,40,88,230,89,40,89,228,91,33,92,-1,93,31,93,31,92,-1,105,7,93,31,105,7,95,29,95,29,105,7,99,28,105,29,99,28,105,7,105,29,105,7,116,20,133,50,126,54,126,35,126,35,126,54,120,43,126,35,120,43,116,20,116,20,120,43,115,36,116,20,115,36,110,31,92,-1,91,33,90,36,92,-1,90,36,89,40,92,-1,89,40,77,-4,57,219,45,188,47,181,57,219,47,181,47,172,57,219,47,172,48,26,57,219,48,26,51,14,57,219,51,14,57,4,57,219,57,4,72,224,47,172,47,39,48,26,26,208,10,204,15,196,26,208,15,196,20,196,26,208,20,196,24,196,26,208,24,196,28,196,15,196,10,204,10,195,105,29,116,20,110,31,57,253,70,320,40,253,
-202,278,201,286,197,293,192,298,185,302,177,303,169,302,163,298,157,293,154,286,152,278,154,271,157,264,163,258,169,255,177,253,185,255,192,258,197,264,201,271,202,278,16383,16383,100,253,118,253,151,294,159,304,162,309,163,313,164,316,163,322,161,326,157,329,149,331,143,330,139,329,135,327,132,324,130,320,16383,16383,103,278,101,286,98,293,92,298,85,302,78,303,70,302,63,298,58,293,54,286,53,278,54,271,58,264,63,258,70,255,78,253,85,255,92,258,98,264,101,271,103,278,16383,16383,127,230,127,220,139,218,149,214,159,209,168,201,177,191,186,176,193,159,198,141,201,122,202,104,200,75,193,49,182,28,165,14,142,9,121,14,106,28,97,47,92,68,91,87,91,193,90,205,86,215,80,222,71,226,60,228,47,225,36,216,26,203,16,188,8,172,15,170,18,176,28,188,33,193,39,194,43,192,46,187,48,180,49,170,49,99,51,66,60,38,76,15,102,0,139,-4,174,1,204,18,227,43,242,75,247,113,241,155,226,188,202,211,173,225,141,230,257,65,255,50,252,39,248,32,245,27,241,26,232,31,223,43,216,60,210,78,206,94,261,225,212,225,190,157,182,178,171,198,156,215,137,226,113,230,79,224,52,207,31,181,19,148,15,112,19,73,32,41,52,16,78,1,108,-4,129,-1,147,5,162,17,174,32,185,50,190,32,196,17,204,5,213,-1,225,-4,239,0,250,8,258,24,263,43,265,65,16383,16383,166,104,162,84,155,59,145,35,131,16,113,9,90,19,75,43,66,76,61,109,60,137,63,167,70,189,81,204,95,213,110,216,129,208,144,187,154,159,161,130,166,104,172,200,181,204,190,209,196,215,202,222,206,229,209,236,211,244,213,251,213,257,214,264,209,289,197,311,179,327,157,338,133,342,102,337,76,322,54,293,41,249,36,186,36,-67,34,-85,30,-101,27,-107,70,-107,72,-102,74,-95,76,-87,78,-67,78,16,88,7,98,1,108,-2,119,-3,131,-4,164,2,192,19,214,46,228,78,233,114,231,137,223,158,211,176,194,190,173,199,16383,16383,78,243,78,250,79,276,85,297,95,314,108,324,
-18,176,23,182,26,203,26,203,23,182,28,188,26,203,28,188,36,216,36,216,28,188,33,193,36,216,33,193,39,194,39,194,43,192,47,225,47,225,43,192,46,187,47,225,46,187,48,180,16,188,8,172,15,170,16,188,15,170,18,176,16,188,18,176,26,203,49,99,51,66,49,159,49,170,49,159,60,228,49,170,60,228,48,180,48,180,60,228,47,225,54,286,54,271,58,293,58,293,54,271,58,264,58,293,58,264,63,298,63,298,58,264,63,258,63,298,63,258,70,302,70,302,63,258,70,255,70,302,70,255,78,303,78,303,70,255,78,253,78,303,78,253,85,302,85,302,78,253,85,255,85,302,85,255,92,298,92,298,85,255,92,258,92,298,92,258,98,293,98,293,92,258,98,264,98,293,98,264,101,286,101,286,98,264,101,271,101,286,101,271,103,278,91,87,91,193,90,205,91,87,90,205,86,215,91,87,86,215,80,222,91,87,80,222,92,68,141,230,127,230,139,218,141,230,139,218,149,214,141,230,149,214,173,225,200,75,193,49,204,18,204,18,193,49,182,28,204,18,182,28,174,1,174,1,182,28,165,14,174,1,165,14,142,9,142,9,121,14,139,-4,139,-4,121,14,106,28,139,-4,106,28,102,0,102,0,106,28,97,47,102,0,97,47,92,68,76,15,102,0,92,68,76,15,92,68,80,222,76,15,80,222,71,226,76,15,71,226,60,228,76,15,60,228,60,38,60,228,49,159,51,66,60,228,51,66,60,38,47,225,36,216,39,194,149,214,159,209,173,225,173,225,159,209,168,201,173,225,168,201,177,191,177,191,186,176,202,211,202,211,186,176,193,159,202,211,193,159,198,141,202,211,202,104,204,18,202,211,204,18,226,188,226,188,204,18,227,43,226,188,227,43,241,155,241,155,227,43,242,75,241,155,242,75,247,113,202,211,198,141,201,122,202,211,201,122,202,104,202,211,173,225,177,191,142,9,139,-4,174,1,154,286,154,271,157,293,157,293,154,271,157,264,157,293,157,264,163,298,163,298,157,264,163,258,163,298,163,258,169,302,169,302,163,258,169,255,169,302,169,255,177,303,177,303,169,255,177,253,177,303,177,253,185,302,185,302,177,253,185,255,185,302,185,255,192,298,192,298,185,255,192,258,192,298,192,258,197,293,197,293,192,258,197,264,197,293,197,264,201,286,201,286,197,264,201,271,201,286,201,271,202,278,149,331,151,294,153,330,153,330,151,294,155,299,153,330,155,299,157,329,157,329,155,299,159,304,157,329,159,304,161,326,161,326,159,304,162,309,161,326,162,309,163,322,163,322,162,309,163,313,163,322,163,313,164,316,151,294,149,331,143,330,151,294,143,330,139,329,151,294,139,329,135,327,151,294,135,327,132,324,151,294,132,324,130,320,151,294,130,320,118,253,118,253,130,320,100,253,154,271,154,286,152,278,200,75,204,18,202,104,139,218,127,230,127,220,54,271,54,286,53,278,
-257,65,255,50,252,39,248,32,245,27,241,26,232,31,223,43,216,60,210,78,206,94,261,225,212,225,190,157,182,178,171,198,156,215,137,226,113,230,79,224,52,207,31,181,19,148,15,112,19,73,32,41,52,16,78,1,108,-4,129,-1,147,5,162,17,174,32,185,50,190,32,196,17,204,5,213,-1,225,-4,239,0,250,8,258,24,263,43,265,65,16383,16383,166,104,162,84,155,59,145,35,131,16,113,9,90,19,75,43,66,76,61,109,60,137,63,167,70,189,81,204,95,213,110,216,129,208,144,187,154,159,161,130,166,104,172,200,181,204,190,209,196,215,202,222,206,229,209,236,211,244,213,251,213,257,214,264,209,289,197,311,179,327,157,338,133,342,102,337,76,322,54,293,41,249,36,186,36,-67,34,-85,30,-101,27,-107,70,-107,72,-102,74,-95,76,-87,78,-67,78,16,88,7,98,1,108,-2,119,-3,131,-4,164,2,192,19,214,46,228,78,233,114,231,137,223,158,211,176,194,190,173,199,16383,16383,78,243,78,250,79,276,85,297,95,314,108,324,124,328,144,322,158,309,167,290,172,268,173,247,172,235,170,225,166,215,160,209,152,206,147,207,141,208,
-63,167,70,189,79,224,79,224,70,189,81,204,79,224,81,204,113,230,113,230,81,204,95,213,113,230,95,213,110,216,110,216,129,208,113,230,113,230,129,208,137,226,144,187,154,159,156,215,156,215,154,159,161,130,156,215,161,130,171,198,171,198,161,130,166,104,171,198,166,104,174,32,171,198,174,32,182,178,182,178,174,32,185,50,182,178,185,50,190,157,190,157,185,50,190,32,190,157,190,32,212,225,212,225,190,32,196,17,212,225,196,17,206,94,206,94,196,17,204,5,206,94,204,5,213,-1,137,226,129,208,144,187,137,226,144,187,156,215,174,32,166,104,162,84,174,32,162,84,162,17,162,17,162,84,155,59,162,17,155,59,147,5,147,5,155,59,145,35,147,5,145,35,131,16,78,1,108,-4,90,19,90,19,108,-4,113,9,131,16,113,9,129,-1,131,16,129,-1,147,5,210,78,206,94,213,-1,212,225,206,94,261,225,252,39,248,32,250,8,250,8,248,32,245,27,250,8,245,27,241,26,241,26,232,31,239,0,239,0,232,31,225,-4,210,78,213,-1,216,60,216,60,213,-1,225,-4,216,60,225,-4,223,43,223,43,225,-4,232,31,258,24,263,43,265,65,258,24,265,65,257,65,258,24,257,65,255,50,258,24,255,50,252,39,258,24,252,39,250,8,241,26,239,0,250,8,113,9,108,-4,129,-1,90,19,75,43,78,1,78,1,75,43,66,76,78,1,66,76,52,16,52,16,66,76,61,109,52,16,61,109,60,137,60,137,63,167,52,207,52,207,63,167,79,224,52,16,60,137,52,207,52,16,52,207,32,41,32,41,52,207,31,181,32,41,31,181,19,73,19,73,31,181,19,148,19,73,19,148,15,112,
-172,200,181,204,190,209,196,215,202,222,206,229,209,236,211,244,213,251,213,257,214,264,209,289,197,311,179,327,157,338,133,342,102,337,76,322,54,293,41,249,36,186,36,-67,34,-85,30,-101,27,-107,70,-107,72,-102,74,-95,76,-87,78,-67,78,16,88,7,98,1,108,-2,119,-3,131,-4,164,2,192,19,214,46,228,78,233,114,231,137,223,158,211,176,194,190,173,199,16383,16383,78,243,78,250,79,276,85,297,95,314,108,324,124,328,144,322,158,309,167,290,172,268,173,247,172,235,170,225,166,215,160,209,152,206,147,207,141,208,136,209,130,210,118,210,112,208,108,206,106,203,105,200,106,195,109,192,113,189,118,188,125,187,130,187,142,190,148,190,158,187,169,178,179,162,187,136,190,101,187,72,179,47,167,28,150,16,129,11,114,13,100,19,88,26,80,35,78,45,222,225,172,225,120,49,115,84,108,130,97,177,78,214,49,228,32,224,20,212,12,195,7,173,5,150,12,150,16,166,21,178,28,187,35,192,41,194,66,179,84,143,96,96,103,50,107,18,103,9,100,0,96,-7,90,-25,84,-47,82,-57,81,-66,81,-74,82,-85,85,-94,90,-101,96,-106,105,-108,118,-105,127,-98,133,-87,135,-73,136,-58,136,-45,135,-32,133,-19,131,-8,129,0,110,213,77,203,50,187,31,164,19,137,15,108,20,74,34,44,56,18,86,1,123,-4,161,1,192,17,215,43,230,76,235,116,232,141,225,164,213,184,197,202,176,217,145,233,114,248,87,261,68,274,61,290,64,302,72,310,83,316,95,319,106,320,137,316,154,307,165,296,176,286,191,282,198,284,203,288,206,293,208,299,209,304,203,318,188,328,168,336,145,340,124,342,102,340,81,334,61,324,
-108,324,124,328,124,328,133,342,124,328,144,322,133,342,144,322,157,338,157,338,144,322,158,309,157,338,158,309,179,327,179,327,158,309,167,290,179,327,167,290,172,268,172,200,181,204,172,235,172,200,172,235,170,225,172,200,170,225,169,178,172,200,169,178,179,162,172,200,179,162,173,199,233,114,231,137,228,78,228,78,231,137,223,158,228,78,223,158,214,46,214,46,223,158,211,176,214,46,211,176,194,190,192,19,214,46,194,190,192,19,194,190,190,101,192,19,190,101,187,72,192,19,187,72,179,47,192,19,179,47,167,28,192,19,167,28,164,2,194,190,173,199,179,162,194,190,179,162,187,136,194,190,187,136,190,101,170,225,166,215,169,178,169,178,166,215,160,209,169,178,160,209,158,187,158,187,160,209,152,206,129,11,131,-4,150,16,150,16,131,-4,164,2,150,16,164,2,167,28,85,297,95,314,102,337,102,337,95,314,108,324,102,337,108,324,133,342,133,342,108,324,124,328,78,250,79,276,76,322,78,250,76,322,76,-87,78,250,76,-87,77,-77,78,250,77,-77,78,-67,76,322,79,276,85,297,76,322,85,297,102,337,76,322,54,293,70,-107,76,322,70,-107,72,-102,76,322,72,-102,74,-95,76,322,74,-95,76,-87,70,-107,54,293,41,249,70,-107,41,249,36,186,70,-107,36,186,36,-67,70,-107,36,-67,35,-76,70,-107,35,-76,34,-85,70,-107,34,-85,32,-93,70,-107,32,-93,30,-101,70,-107,30,-101,27,-107,114,13,100,19,108,-2,114,13,108,-2,119,-3,114,13,119,-3,129,11,108,-2,100,19,98,1,98,1,100,19,88,26,98,1,88,26,88,7,88,7,88,26,80,35,88,7,80,35,78,45,78,45,78,16,88,7,148,190,152,206,147,207,148,190,147,207,142,190,118,188,125,187,127,210,127,210,125,187,130,187,127,210,130,187,130,210,130,210,130,187,134,188,130,210,134,188,136,209,136,209,134,188,138,189,136,209,138,189,141,208,141,208,138,189,142,190,141,208,142,190,147,207,106,203,106,195,108,206,108,206,106,195,109,192,108,206,109,192,112,208,112,208,109,192,113,189,112,208,113,189,118,210,118,210,113,189,118,188,118,210,118,188,127,210,173,247,181,204,179,327,173,247,179,327,172,268,206,229,209,236,209,289,209,289,209,236,211,244,209,289,211,244,214,264,214,264,211,244,213,251,214,264,213,251,213,257,190,209,196,215,197,311,197,311,196,215,202,222,197,311,202,222,209,289,209,289,202,222,206,229,197,311,179,327,181,204,197,311,181,204,190,209,172,235,181,204,173,247,148,190,158,187,152,206,131,-4,129,11,119,-3,106,195,106,203,105,200,
-222,225,172,225,120,49,115,84,108,130,97,177,78,214,49,228,32,224,20,212,12,195,7,173,5,150,12,150,16,166,21,178,28,187,35,192,41,194,66,179,84,143,96,96,103,50,107,18,103,9,100,0,96,-7,90,-25,84,-47,82,-57,81,-66,81,-74,82,-85,85,-94,90,-101,96,-106,105,-108,118,-105,127,-98,133,-87,135,-73,136,-58,136,-45,135,-32,133,-19,131,-8,129,0,110,213,77,203,50,187,31,164,19,137,15,108,20,74,34,44,56,18,86,1,123,-4,161,1,192,17,215,43,230,76,235,116,232,141,225,164,213,184,197,202,176,217,145,233,114,248,87,261,68,274,61,290,64,302,72,310,83,316,95,319,106,320,137,316,154,307,165,296,176,286,191,282,198,284,203,288,206,293,208,299,209,304,203,318,188,328,168,336,145,340,124,342,102,340,
-35,192,41,194,41,194,49,228,41,194,66,179,49,228,66,179,78,214,78,214,66,179,84,143,78,214,84,143,97,177,97,177,84,143,96,96,97,177,96,96,103,50,120,49,115,84,118,-105,118,-105,115,84,108,130,118,-105,108,130,107,18,107,18,108,130,103,50,103,50,108,130,97,177,118,-105,127,-98,120,49,120,49,127,-98,129,0,120,49,129,0,172,225,172,225,129,0,222,225,107,18,103,9,105,-108,107,18,105,-108,118,-105,100,0,96,-7,96,-106,100,0,96,-106,105,-108,100,0,105,-108,103,9,96,-7,93,-16,96,-106,96,-106,93,-16,90,-25,96,-106,90,-25,90,-101,90,-101,90,-25,87,-36,90,-101,87,-36,85,-94,85,-94,87,-36,84,-47,85,-94,84,-47,82,-57,82,-85,85,-94,82,-57,82,-85,82,-57,81,-66,82,-85,81,-66,81,-74,135,-73,136,-58,136,-45,135,-73,136,-45,135,-32,135,-73,135,-32,133,-19,135,-73,133,-19,133,-87,133,-87,133,-19,131,-8,133,-87,131,-8,129,0,133,-87,129,0,127,-98,21,178,28,187,32,224,32,224,28,187,35,192,32,224,35,192,49,228,49,228,35,192,41,194,20,212,12,195,12,150,20,212,12,150,16,166,20,212,16,166,21,178,20,212,21,178,32,224,7,173,5,150,12,150,7,173,12,150,12,195,
-110,213,77,203,50,187,31,164,19,137,15,108,20,74,34,44,56,18,86,1,123,-4,161,1,192,17,215,43,230,76,235,116,232,141,225,164,213,184,197,202,176,217,145,233,114,248,87,261,68,274,61,290,64,302,72,310,83,316,95,319,106,320,137,316,154,307,165,296,176,286,191,282,198,284,203,288,206,293,208,299,209,304,203,318,188,328,168,336,145,340,124,342,102,340,81,334,61,324,47,309,42,289,45,269,54,251,68,237,87,224,110,213,16383,16383,190,104,187,71,180,45,168,25,151,13,130,9,121,10,111,13,101,19,93,26,85,35,76,52,69,70,64,88,61,106,60,121,62,144,70,165,84,183,103,195,127,200,149,190,167,172,179,149,187,126,190,104,196,73,182,54,166,39,149,29,131,22,110,20,95,22,80,27,69,36,60,49,57,65,61,81,70,94,83,102,97,107,111,108,117,108,125,106,128,106,133,105,142,106,148,108,153,111,156,115,157,118,156,122,154,124,150,127,145,128,138,129,131,128,121,126,115,125,108,124,92,127,80,133,72,142,67,154,65,167,67,182,74,195,83,206,96,213,112,215,127,215,140,212,148,208,154,203,156,195,155,193,155,190,154,187,154,183,153,179,155,171,158,166,163,161,168,158,175,157,182,158,188,161,194,165,198,171,199,179,194,199,181,214,163,223,142,228,121,230,87,226,60,217,40,202,28,184,24,165,26,152,31,141,39,131,49,123,63,118,47,113,33,103,22,91,15,77,
-42,289,45,269,47,309,47,309,45,269,54,251,47,309,54,251,61,324,61,324,54,251,61,290,68,237,61,290,54,251,64,302,72,310,81,334,81,334,72,310,83,316,81,334,83,316,102,340,102,340,83,316,95,319,102,340,95,319,106,320,106,320,137,316,124,342,124,342,137,316,145,340,61,324,61,290,64,302,61,324,64,302,81,334,198,284,203,288,203,318,203,318,203,288,206,293,203,318,206,293,209,304,209,304,206,293,208,299,154,307,165,296,168,336,168,336,165,296,176,286,168,336,176,286,188,328,188,328,176,286,191,282,188,328,191,282,203,318,203,318,191,282,198,284,145,340,137,316,154,307,145,340,154,307,168,336,235,116,232,141,230,76,230,76,232,141,225,164,230,76,225,164,215,43,215,43,225,164,213,184,215,43,213,184,197,202,192,17,215,43,197,202,192,17,197,202,190,104,192,17,190,104,187,71,192,17,187,71,180,45,192,17,180,45,168,25,192,17,168,25,161,1,197,202,176,217,179,149,197,202,179,149,187,126,197,202,187,126,190,104,145,233,127,200,149,190,145,233,149,190,176,217,176,217,149,190,167,172,176,217,167,172,179,149,111,13,123,-4,121,10,121,10,123,-4,130,9,151,13,130,9,161,1,151,13,161,1,168,25,130,9,123,-4,161,1,124,342,102,340,106,320,69,70,86,1,76,52,76,52,86,1,85,35,93,26,85,35,86,1,93,26,86,1,123,-4,68,274,68,237,87,261,87,261,68,237,87,224,87,261,87,224,114,248,114,248,87,224,110,213,114,248,110,213,127,200,62,144,70,165,77,203,77,203,70,165,84,183,77,203,84,183,110,213,110,213,84,183,103,195,110,213,103,195,127,200,77,203,50,187,62,144,62,144,50,187,60,121,61,106,60,121,56,18,61,106,56,18,64,88,64,88,56,18,86,1,64,88,86,1,69,70,56,18,60,121,50,187,56,18,50,187,34,44,34,44,50,187,31,164,34,44,31,164,20,74,20,74,31,164,19,137,20,74,19,137,15,108,101,19,93,26,123,-4,101,19,123,-4,111,13,61,290,68,237,68,274,127,200,145,233,114,248,
-196,73,182,54,166,39,149,29,131,22,110,20,95,22,80,27,69,36,60,49,57,65,61,81,70,94,83,102,97,107,111,108,117,108,125,106,128,106,133,105,142,106,148,108,153,111,156,115,157,118,156,122,154,124,150,127,145,128,138,129,131,128,121,126,115,125,108,124,92,127,80,133,72,142,67,154,65,167,67,182,74,195,83,206,96,213,112,215,127,215,140,212,148,208,154,203,156,195,155,193,155,190,154,187,154,183,153,179,155,171,158,166,163,161,168,158,175,157,182,158,188,161,194,165,198,171,199,179,194,199,181,214,163,223,142,228,121,230,87,226,60,217,40,202,28,184,24,165,26,152,31,141,39,131,49,123,63,118,47,113,33,103,22,91,15,77,12,61,14,46,21,29,37,13,65,0,108,-4,130,-1,151,6,171,20,189,40,204,68,76,342,59,335,45,327,35,318,29,308,27,296,30,283,38,272,48,265,60,260,71,259,72,257,52,225,36,196,25,166,19,135,17,100,21,58,33,28,49,9,71,-1,95,-4,105,-4,117,-2,128,-1,137,0,143,0,158,-1,170,-5,180,-12,186,-22,188,-34,186,-47,180,-58,170,-67,159,-72,147,-74,140,-72,134,-69,128,-64,123,-61,117,-59,110,-60,104,-63,99,-68,97,-73,96,-80,98,-90,103,-98,111,-103,121,-107,132,-108,151,-104,170,-93,187,-76,199,-55,204,-29,201,-3,192,16,177,30,156,38,128,41,117,41,113,40,103,40,78,44,61,55,49,72,43,93,41,117,44,151,53,184,65,213,80,238,94,257,119,262,142,271,161,283,174,297,179,311,178,316,175,321,171,325,166,327,159,328,142,325,125,315,108,302,94,287,84,273,74,274,65,277,57,281,52,288,
-37,13,65,0,47,113,47,113,65,0,57,65,63,118,57,65,61,81,63,118,61,81,70,94,72,142,67,154,70,94,70,94,67,154,65,167,63,118,65,167,60,217,63,118,60,217,49,123,49,123,60,217,40,202,49,123,40,202,39,131,39,131,40,202,31,141,142,228,121,230,127,215,127,215,121,230,112,215,96,213,112,215,121,230,96,213,121,230,87,226,194,199,181,214,182,158,194,199,182,158,188,161,194,199,188,161,194,165,194,199,194,165,198,171,194,199,198,171,199,179,158,166,163,161,163,223,163,223,163,161,168,158,163,223,168,158,181,214,181,214,168,158,175,157,181,214,175,157,182,158,127,215,140,212,142,228,142,228,140,212,148,208,142,228,148,208,163,223,163,223,148,208,154,203,163,223,154,203,156,195,156,195,158,166,163,223,156,195,155,193,158,166,158,166,155,193,155,190,158,166,155,190,155,171,155,171,155,190,154,187,155,171,154,187,154,183,87,226,60,217,67,182,87,226,67,182,74,195,87,226,74,195,83,206,87,226,83,206,96,213,67,182,60,217,65,167,28,184,24,165,26,152,28,184,26,152,31,141,28,184,31,141,40,202,83,102,97,107,92,127,92,127,97,107,108,124,115,125,108,124,111,108,83,102,92,127,80,133,83,102,80,133,72,142,83,102,72,142,70,94,63,118,70,94,65,167,111,108,108,124,97,107,117,108,121,107,121,126,121,126,121,107,125,106,121,126,125,106,126,127,126,127,125,106,128,106,126,127,128,106,131,128,131,128,128,106,133,105,131,128,133,105,138,129,138,129,133,105,142,106,138,129,142,106,145,128,145,128,142,106,148,108,145,128,148,108,150,127,150,127,148,108,153,111,150,127,153,111,154,124,154,124,153,111,156,115,154,124,156,115,156,122,156,122,156,115,157,118,115,125,111,108,117,108,115,125,117,108,121,126,80,27,108,-4,95,22,95,22,108,-4,110,20,131,22,110,20,130,-1,131,22,130,-1,151,6,69,36,60,49,65,0,69,36,65,0,108,-4,69,36,108,-4,80,27,57,65,65,0,60,49,12,61,14,46,15,77,15,77,14,46,21,29,15,77,21,29,22,91,22,91,21,29,37,13,22,91,37,13,33,103,33,103,37,13,47,113,204,68,196,73,189,40,189,40,196,73,182,54,189,40,182,54,171,20,171,20,182,54,166,39,171,20,166,39,151,6,151,6,166,39,149,29,151,6,149,29,131,22,110,20,108,-4,130,-1,47,113,57,65,63,118,155,171,154,183,153,179,
-76,342,59,335,45,327,35,318,29,308,27,296,30,283,38,272,48,265,60,260,71,259,72,257,52,225,36,196,25,166,19,135,17,100,21,58,33,28,49,9,71,-1,95,-4,105,-4,117,-2,128,-1,137,0,143,0,158,-1,170,-5,180,-12,186,-22,188,-34,186,-47,180,-58,170,-67,159,-72,147,-74,140,-72,134,-69,128,-64,123,-61,117,-59,110,-60,104,-63,99,-68,97,-73,96,-80,98,-90,103,-98,111,-103,121,-107,132,-108,151,-104,170,-93,187,-76,199,-55,204,-29,201,-3,192,16,177,30,156,38,128,41,117,41,113,40,103,40,78,44,61,55,49,72,43,93,41,117,44,151,53,184,65,213,80,238,94,257,119,262,142,271,161,283,174,297,179,311,178,316,175,321,171,325,166,327,159,328,142,325,125,315,108,302,94,287,84,273,74,274,65,277,57,281,52,288,50,298,51,305,55,312,61,320,70,328,81,334,226,-107,223,-101,221,-94,219,-86,218,-76,218,160,216,182,208,202,196,217,180,226,159,230,145,229,131,224,117,216,102,205,87,190,86,190,84,205,81,215,76,223,68,226,56,228,44,225,33,216,22,203,13,188,5,172,12,170,15,176,25,188,30,193,36,194,39,193,41,190,44,184,45,173,46,156,46,0,88,0,88,174,100,185,111,194,120,199,130,202,140,203,153,201,163,195,170,185,174,172,176,154,176,-79,177,-89,179,-97,181,-103,184,-107,234,166,233,198,230,228,226,254,220,277,211,296,199,313,185,325,169,334,150,340,126,342,87,333,55,310,32,273,18,226,13,170,14,144,15,120,18,100,23,81,28,64,40,41,55,21,74,7,96,-1,122,-4,161,3,192,27,215,63,229,110,234,166,16383,16383,59,177,59,193,62,247,70,285,83,310,99,324,119,328,150,318,171,292,182,256,188,216,189,177,16383,16383,
-43,93,41,117,41,117,36,196,41,117,44,151,36,196,44,151,52,225,52,225,44,151,53,184,52,225,53,184,72,257,72,257,53,184,65,213,72,257,65,213,80,238,48,265,50,298,45,327,48,265,45,327,38,272,38,272,45,327,35,318,38,272,35,318,30,283,30,283,35,318,29,308,30,283,29,308,27,296,51,305,55,312,59,335,59,335,55,312,61,320,59,335,61,320,76,342,76,342,61,320,70,328,76,342,70,328,81,334,51,305,59,335,45,327,51,305,45,327,50,298,108,302,94,287,94,257,94,257,94,287,84,273,94,257,84,273,80,238,80,238,84,273,74,274,80,238,74,274,72,257,72,257,74,274,71,259,166,327,159,328,161,283,161,283,159,328,142,325,161,283,142,325,142,271,142,271,142,325,125,315,142,271,125,315,119,262,119,262,125,315,108,302,119,262,108,302,94,257,65,277,57,281,60,260,65,277,60,260,71,259,65,277,71,259,74,274,52,288,50,298,48,265,52,288,48,265,60,260,52,288,60,260,57,281,71,-1,95,-4,78,44,78,44,95,-4,103,40,108,40,103,40,105,-4,108,40,105,-4,117,-2,61,55,49,72,49,9,61,55,49,9,71,-1,61,55,71,-1,78,44,43,93,41,117,33,28,43,93,33,28,49,9,43,93,49,9,49,72,41,117,36,196,33,28,33,28,36,196,25,166,33,28,25,166,21,58,21,58,25,166,19,135,21,58,19,135,17,100,177,30,156,38,158,-1,158,-1,156,38,143,0,137,0,143,0,156,38,137,0,156,38,128,41,128,-1,137,0,128,41,128,-1,128,41,123,41,128,-1,123,41,117,41,128,-1,117,41,117,-2,113,40,108,40,117,-2,113,40,117,-2,117,41,128,-64,132,-108,134,-69,134,-69,132,-108,151,-104,134,-69,151,-104,140,-72,140,-72,151,-104,147,-74,159,-72,147,-74,151,-104,159,-72,151,-104,170,-93,204,-29,201,-3,199,-55,199,-55,201,-3,192,16,199,-55,192,16,188,-34,188,-34,187,-76,199,-55,158,-1,170,-5,177,30,177,30,170,-5,180,-12,177,30,180,-12,192,16,192,16,180,-12,186,-22,192,16,186,-22,188,-34,187,-76,188,-34,186,-47,187,-76,186,-47,180,-58,187,-76,180,-58,170,-67,187,-76,170,-67,170,-93,110,-60,111,-103,117,-59,117,-59,111,-103,121,-107,117,-59,121,-107,123,-61,123,-61,121,-107,132,-108,123,-61,132,-108,128,-64,97,-73,98,-90,99,-68,99,-68,98,-90,103,-98,99,-68,103,-98,104,-63,104,-63,103,-98,111,-103,104,-63,111,-103,110,-60,175,321,171,325,174,297,175,321,174,297,179,311,175,321,179,311,178,316,166,327,161,283,174,297,166,327,174,297,171,325,103,40,95,-4,105,-4,98,-90,97,-73,96,-80,159,-72,170,-93,170,-67,
-226,-107,223,-101,221,-94,219,-86,218,-76,218,160,216,182,208,202,196,217,180,226,159,230,145,229,131,224,117,216,102,205,87,190,86,190,84,205,81,215,76,223,68,226,56,228,44,225,33,216,22,203,13,188,5,172,12,170,15,176,25,188,30,193,36,194,39,193,41,190,44,184,45,173,46,156,46,0,88,0,88,174,100,185,111,194,120,199,130,202,140,203,153,201,163,195,170,185,174,172,176,154,176,-79,177,-89,179,-97,181,-103,184,-107,234,166,233,198,230,228,226,254,220,277,211,296,199,313,185,325,169,334,150,340,126,342,87,333,55,310,32,273,18,226,13,170,14,144,15,120,18,100,23,81,28,64,40,41,55,21,74,7,96,-1,122,-4,161,3,192,27,215,63,229,110,234,166,16383,16383,59,177,59,193,62,247,70,285,83,310,99,324,119,328,150,318,171,292,182,256,188,216,189,177,16383,16383,189,158,187,109,180,67,168,36,151,16,128,9,98,18,78,42,67,77,61,118,
-15,176,20,182,22,203,22,203,20,182,25,188,22,203,25,188,33,216,33,216,25,188,30,193,33,216,30,193,36,194,36,194,39,193,44,225,44,225,39,193,41,190,44,225,41,190,44,184,13,188,5,172,12,170,13,188,12,170,15,176,13,188,15,176,22,203,87,190,86,190,88,0,87,190,88,0,88,174,87,190,88,174,102,205,88,174,100,185,102,205,102,205,100,185,111,194,102,205,111,194,117,216,117,216,111,194,120,199,117,216,120,199,131,224,131,224,120,199,130,202,131,224,130,202,140,203,140,203,153,201,145,229,145,229,153,201,159,230,88,0,86,190,84,205,88,0,84,205,81,215,88,0,81,215,76,223,88,0,76,223,68,226,88,0,68,226,56,228,88,0,56,228,46,156,88,0,46,156,46,0,145,229,131,224,140,203,218,-65,218,160,216,182,218,-65,216,182,208,202,218,-65,208,202,218,-76,196,217,180,226,181,-103,196,217,181,-103,184,-107,196,217,184,-107,218,-76,196,217,218,-76,208,202,184,-107,226,-107,223,-101,184,-107,223,-101,221,-94,184,-107,221,-94,219,-86,184,-107,219,-86,218,-76,180,226,159,230,163,195,180,226,163,195,170,185,180,226,170,185,174,172,180,226,174,172,176,154,180,226,176,154,176,-79,180,226,176,-79,177,-89,180,226,177,-89,179,-97,180,226,179,-97,181,-103,176,154,176,-64,176,-79,45,173,46,156,56,228,45,173,56,228,44,225,45,173,44,225,44,184,44,225,33,216,36,194,159,230,153,201,163,195,
-234,166,233,198,230,228,226,254,220,277,211,296,199,313,185,325,169,334,150,340,126,342,87,333,55,310,32,273,18,226,13,170,14,144,15,120,18,100,23,81,28,64,40,41,55,21,74,7,96,-1,122,-4,161,3,192,27,215,63,229,110,234,166,16383,16383,59,177,59,193,62,247,70,285,83,310,99,324,119,328,150,318,171,292,182,256,188,216,189,177,16383,16383,189,158,187,109,180,67,168,36,151,16,128,9,98,18,78,42,67,77,61,118,59,161,189,161,126,54,120,43,115,36,110,31,105,29,99,28,95,29,91,33,90,36,89,40,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,37,196,42,193,45,188,47,181,47,39,48,26,51,14,57,4,65,-2,77,-4,92,-1,105,7,116,20,126,35,133,50,252,0,252,7,239,10,228,13,219,19,209,27,199,39,113,140,131,158,147,172,161,181,174,185,188,187,194,186,201,185,207,183,213,182,220,181,227,182,233,185,239,189,243,196,245,206,
-150,340,126,342,150,318,150,318,126,342,119,328,99,324,119,328,126,342,99,324,126,342,87,333,230,228,226,254,229,110,230,228,229,110,234,166,230,228,234,166,233,198,220,277,211,296,215,63,220,277,215,63,229,110,220,277,229,110,226,254,23,81,28,64,32,273,32,273,28,64,40,41,32,273,40,41,55,310,55,310,40,41,55,21,55,310,55,21,59,193,59,193,55,21,59,161,59,193,59,161,59,177,59,177,59,161,189,177,189,177,59,161,189,161,189,177,189,161,192,27,189,177,192,27,199,313,199,313,192,27,215,63,199,313,215,63,211,296,171,292,182,256,185,325,185,325,182,256,188,216,185,325,188,216,199,313,199,313,188,216,189,177,169,334,150,340,150,318,169,334,150,318,171,292,169,334,171,292,185,325,187,109,180,67,192,27,192,27,180,67,168,36,192,27,168,36,161,3,161,3,168,36,151,16,161,3,151,16,128,9,128,9,98,18,122,-4,122,-4,98,18,96,-1,78,42,67,77,74,7,78,42,74,7,96,-1,78,42,96,-1,98,18,59,161,55,21,61,118,61,118,55,21,74,7,61,118,74,7,67,77,189,158,187,109,192,27,189,158,192,27,189,161,128,9,122,-4,161,3,59,193,62,247,55,310,55,310,62,247,70,285,55,310,70,285,87,333,87,333,70,285,83,310,87,333,83,310,99,324,14,144,15,120,18,226,18,226,15,120,18,100,18,226,18,100,32,273,32,273,18,100,23,81,14,144,18,226,13,170,
-126,54,120,43,115,36,110,31,105,29,99,28,95,29,91,33,90,36,89,40,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,37,196,42,193,45,188,47,181,47,39,48,26,51,14,57,4,65,-2,77,-4,92,-1,105,7,116,20,126,35,133,50,252,0,252,7,239,10,228,13,219,19,209,27,199,39,113,140,131,158,147,172,161,181,174,185,188,187,194,186,201,185,207,183,213,182,220,181,227,182,233,185,239,189,243,196,245,206,244,214,240,220,234,225,226,229,215,230,202,228,184,222,160,205,127,176,83,129,83,229,
-45,188,57,219,42,193,42,193,57,219,41,214,42,193,41,214,37,196,37,196,41,214,31,196,28,196,31,196,41,214,28,196,41,214,26,208,57,4,65,-2,72,224,72,224,65,-2,77,-4,72,224,77,-4,88,230,88,230,77,-4,89,40,88,230,89,40,89,228,91,33,92,-1,93,31,93,31,92,-1,105,7,93,31,105,7,95,29,95,29,105,7,99,28,105,29,99,28,105,7,105,29,105,7,116,20,133,50,126,54,126,35,126,35,126,54,120,43,126,35,120,43,116,20,116,20,120,43,115,36,116,20,115,36,110,31,92,-1,91,33,90,36,92,-1,90,36,89,40,92,-1,89,40,77,-4,57,219,45,188,47,181,57,219,47,181,47,172,57,219,47,172,48,26,57,219,48,26,51,14,57,219,51,14,57,4,57,219,57,4,72,224,47,172,47,39,48,26,26,208,10,204,15,196,26,208,15,196,20,196,26,208,20,196,24,196,26,208,24,196,28,196,15,196,10,204,10,195,105,29,116,20,110,31,
-252,0,252,7,239,10,228,13,219,19,209,27,199,39,113,140,131,158,147,172,161,181,174,185,188,187,194,186,201,185,207,183,213,182,220,181,227,182,233,185,239,189,243,196,245,206,244,214,240,220,234,225,226,229,215,230,202,228,184,222,160,205,127,176,83,129,83,229,81,230,70,226,48,220,35,216,18,212,3,208,3,200,10,200,14,201,20,201,28,200,34,197,38,192,40,183,41,171,41,0,83,0,83,113,148,34,151,30,155,24,156,22,156,20,155,15,153,12,149,9,144,8,137,7,133,7,133,0,238,69,235,53,229,42,222,35,215,31,209,30,200,32,193,38,186,47,181,58,176,71,121,266,113,292,104,313,95,329,83,338,68,342,51,337,39,325,32,308,28,288,26,268,34,268,38,284,43,295,49,302,56,305,64,306,74,304,83,296,92,283,100,267,107,248,113,225,6,0,56,0,128,177,164,45,169,29,176,15,184,4,193,-2,204,-5,219,-1,230,8,239,24,244,45,246,69,251,53,244,42,239,35,234,31,230,29,224,28,221,29,218,31,216,36,215,45,214,56,214,225,172,225,172,59,171,53,169,48,
-10,200,14,201,18,212,18,212,14,201,17,201,18,212,17,201,20,201,20,201,28,200,35,216,35,216,28,200,34,197,35,216,34,197,38,192,7,200,10,200,18,212,7,200,18,212,3,208,7,200,3,208,3,200,35,216,38,192,48,220,48,220,38,192,40,183,48,220,40,183,41,171,83,0,41,171,41,0,35,216,18,212,20,201,83,129,83,229,81,230,83,129,81,230,83,0,83,129,83,0,83,113,83,129,83,113,127,176,131,158,147,172,160,205,160,205,147,172,161,181,160,205,161,181,184,222,184,222,161,181,174,185,184,222,174,185,188,187,188,187,194,186,202,228,202,228,194,186,201,185,202,228,201,185,207,183,127,176,83,113,113,140,127,176,113,140,131,158,127,176,131,158,160,205,83,0,81,230,70,226,83,0,70,226,59,223,83,0,59,223,48,220,83,0,48,220,41,171,227,182,233,185,234,225,234,225,233,185,239,189,234,225,239,189,240,220,240,220,239,189,243,196,240,220,243,196,244,214,244,214,243,196,245,206,207,183,213,182,215,230,215,230,213,182,220,181,215,230,220,181,226,229,226,229,220,181,227,182,226,229,227,182,234,225,202,228,184,222,188,187,153,12,149,9,252,0,252,0,149,9,144,8,252,0,144,8,137,7,156,20,252,0,228,13,156,20,228,13,219,19,156,20,219,19,209,27,156,20,209,27,199,39,156,20,199,39,156,22,199,39,113,140,148,34,199,39,148,34,151,30,199,39,151,30,153,27,199,39,153,27,155,24,199,39,155,24,156,22,239,10,228,13,252,0,239,10,252,0,252,7,155,15,153,12,252,0,155,15,252,0,156,20,133,7,133,0,252,0,133,7,252,0,137,7,148,34,113,140,83,113,202,228,207,183,215,230,
-238,69,235,53,229,42,222,35,215,31,209,30,200,32,193,38,186,47,181,58,176,71,121,266,113,292,104,313,95,329,83,338,68,342,51,337,39,325,32,308,28,288,26,268,34,268,38,284,43,295,49,302,56,305,64,306,74,304,83,296,92,283,100,267,107,248,113,225,6,0,56,0,128,177,164,45,169,29,176,15,184,4,193,-2,204,-5,219,-1,230,8,239,24,244,45,246,69,251,53,244,42,239,35,234,31,230,29,224,28,221,29,218,31,216,36,215,45,214,56,214,225,172,225,172,59,171,53,169,48,166,44,161,40,153,33,144,29,136,26,128,24,121,24,108,26,96,32,87,41,80,53,78,69,78,225,36,225,36,-65,35,-75,34,-84,32,-93,30,-101,27,-107,69,-107,71,-102,73,-94,75,-85,76,-75,76,9,78,9,81,4,87,0,93,-2,101,-4,109,-4,
-56,305,64,306,64,306,68,342,64,306,74,304,68,342,74,304,83,338,83,338,74,304,83,296,83,338,83,296,95,329,95,329,83,296,92,283,95,329,92,283,100,267,113,292,107,248,113,225,113,292,113,225,121,266,121,266,113,225,128,177,121,266,128,177,176,71,176,71,128,177,164,45,176,71,164,45,169,29,104,313,95,329,100,267,104,313,100,267,107,248,104,313,107,248,113,292,176,71,169,29,176,15,176,71,176,15,184,4,113,225,6,0,56,0,113,225,56,0,128,177,200,32,193,38,193,-2,193,-2,193,38,186,47,193,-2,186,47,184,4,184,4,186,47,181,58,184,4,181,58,176,71,235,53,229,42,230,8,230,8,229,42,222,35,230,8,222,35,219,-1,219,-1,222,35,215,31,219,-1,215,31,209,30,209,30,200,32,204,-5,204,-5,200,32,193,-2,239,24,244,45,246,69,239,24,246,69,238,69,239,24,238,69,235,53,239,24,235,53,230,8,209,30,204,-5,219,-1,43,295,49,302,51,337,51,337,49,302,56,305,51,337,56,305,68,342,68,342,56,305,64,306,39,325,32,308,34,268,39,325,34,268,38,284,39,325,38,284,43,295,39,325,43,295,51,337,28,288,26,268,34,268,28,288,34,268,32,308,
-251,53,244,42,239,35,234,31,230,29,224,28,221,29,218,31,216,36,215,45,214,56,214,225,172,225,172,59,171,53,169,48,166,44,161,40,153,33,144,29,136,26,128,24,121,24,108,26,96,32,87,41,80,53,78,69,78,225,36,225,36,-65,35,-75,34,-84,32,-93,30,-101,27,-107,69,-107,71,-102,73,-94,75,-85,76,-75,76,9,78,9,81,4,87,0,93,-2,101,-4,109,-4,119,-3,131,0,144,7,158,19,171,36,172,36,173,23,177,12,182,3,191,-2,203,-4,217,-1,230,7,241,20,250,35,258,50,212,230,206,188,189,141,163,97,129,63,90,45,89,45,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,31,196,37,195,42,192,45,188,47,181,47,-6,59,-6,100,7,134,28,163,55,186,84,203,116,212,141,217,166,220,189,221,211,222,230,89,342,71,335,57,328,48,319,43,309,41,297,42,286,47,278,53,272,61,268,69,266,63,259,58,251,54,242,52,233,51,224,52,215,55,206,59,198,65,190,73,184,54,168,39,150,27,129,20,106,17,81,20,53,29,29,44,11,67,0,98,-4,
-78,225,36,225,69,-107,78,225,69,-107,71,-102,78,225,71,-102,73,-94,78,225,73,-94,75,-85,78,225,75,-85,76,-75,78,225,76,-75,76,9,78,225,76,9,78,9,69,-107,36,225,36,-65,69,-107,36,-65,35,-75,69,-107,35,-75,34,-84,69,-107,34,-84,32,-93,69,-107,32,-93,30,-101,69,-107,30,-101,27,-107,87,0,93,-2,96,32,96,32,93,-2,101,-4,96,32,101,-4,108,26,108,26,101,-4,109,-4,108,26,109,-4,121,24,121,24,109,-4,119,-3,121,24,119,-3,131,0,171,53,169,48,171,36,171,36,169,48,166,44,171,36,166,44,161,40,161,40,153,33,158,19,158,19,153,33,144,29,158,19,144,29,144,7,144,7,144,29,136,26,144,7,136,26,131,0,131,0,136,26,128,24,131,0,128,24,121,24,87,41,80,53,81,4,87,41,81,4,87,0,87,41,87,0,96,32,81,4,80,53,78,69,81,4,78,69,78,9,214,225,172,225,173,23,173,23,172,225,172,68,173,23,172,68,172,36,172,36,172,68,172,59,172,36,172,59,171,36,171,36,172,59,171,53,161,40,158,19,171,36,214,225,173,23,177,12,214,225,177,12,182,3,214,225,182,3,191,-2,214,225,191,-2,203,-4,214,225,203,-4,214,56,244,42,239,35,241,20,241,20,239,35,234,31,241,20,234,31,230,7,230,7,234,31,230,29,230,7,230,29,224,28,224,28,221,29,230,7,230,7,221,29,218,31,230,7,218,31,217,-1,217,-1,218,31,216,36,217,-1,216,36,215,45,250,35,258,50,251,53,250,35,251,53,244,42,250,35,244,42,241,20,215,45,214,56,203,-4,215,45,203,-4,217,-1,76,9,76,-75,76,-64,
-212,230,206,188,189,141,163,97,129,63,90,45,89,45,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,31,196,37,195,42,192,45,188,47,181,47,-6,59,-6,100,7,134,28,163,55,186,84,203,116,212,141,217,166,220,189,221,211,222,230,89,342,71,335,57,328,48,319,43,309,41,297,42,286,47,278,53,272,61,268,69,266,63,259,58,251,54,242,52,233,51,224,52,215,55,206,59,198,65,190,73,184,54,168,39,150,27,129,20,106,17,81,20,53,29,29,44,11,67,0,98,-4,107,-4,117,-2,
-45,188,57,219,42,192,42,192,57,219,41,214,42,192,41,214,37,195,37,195,41,214,31,196,28,196,31,196,41,214,28,196,41,214,26,208,89,228,88,230,89,45,89,45,88,230,72,224,89,45,72,224,59,-6,59,-6,72,224,57,219,59,-6,57,219,47,172,47,172,57,219,47,181,26,208,10,204,15,196,26,208,15,196,20,196,26,208,20,196,25,196,26,208,25,196,28,196,186,84,189,141,163,55,163,55,189,141,163,97,163,55,163,97,134,28,134,28,163,97,129,63,134,28,129,63,100,7,100,7,129,63,90,45,189,141,203,116,206,188,206,188,203,116,212,141,206,188,212,141,212,230,212,230,212,141,217,166,212,230,217,166,222,230,222,230,217,166,220,189,222,230,220,189,221,211,89,45,59,-6,100,7,89,45,100,7,90,45,47,172,47,-6,59,-6,15,196,10,204,10,195,189,141,186,84,203,116,57,219,45,188,47,181,
-89,342,71,335,57,328,48,319,43,309,41,297,42,286,47,278,53,272,61,268,69,266,63,259,58,251,54,242,52,233,51,224,52,215,55,206,59,198,65,190,73,184,54,168,39,150,27,129,20,106,17,81,20,53,29,29,44,11,67,0,98,-4,107,-4,117,-2,128,-1,137,0,143,0,158,-1,170,-5,180,-12,186,-22,188,-34,186,-47,180,-59,170,-67,159,-72,147,-74,140,-72,134,-69,128,-64,123,-61,117,-59,110,-60,104,-63,99,-68,97,-73,96,-80,98,-90,103,-98,111,-103,121,-107,132,-108,151,-104,170,-93,187,-76,199,-53,204,-26,201,-3,192,15,177,29,156,38,128,41,118,41,111,40,98,40,79,42,63,48,51,59,43,75,40,98,43,118,50,136,62,152,77,164,94,174,102,172,110,171,117,170,142,170,157,173,171,178,181,186,185,197,184,204,179,210,172,214,164,216,153,217,140,216,127,213,113,208,101,202,89,194,83,199,78,204,74,211,72,218,71,225,73,235,77,243,83,251,93,256,106,258,126,260,144,264,160,271,171,280,175,291,174,297,171,301,166,305,160,307,151,307,139,306,125,303,111,297,96,290,83,281,76,283,70,286,66,291,64,297,63,305,64,310,66,316,72,322,80,328,93,334,237,114,232,151,218,183,197,208,167,224,129,230,91,223,60,203,37,174,22,139,17,101,23,67,38,38,62,15,92,0,126,-4,161,2,191,20,215,47,231,79,237,114,16383,16383,192,95,190,74,183,52,172,31,156,17,134,11,107,19,87,38,73,65,65,95,62,122,64,145,70,169,80,191,97,207,119,214,148,205,168,184,182,155,190,124,192,95,233,69,229,55,223,45,216,40,209,37,203,36,194,38,188,41,184,47,180,54,178,61,177,69,176,78,175,88,175,109,176,127,176,144,178,160,179,173,180,183,239,183,239,225,97,225,68,222,46,214,29,200,16,180,4,155,12,155,23,167,35,176,47,180,62,183,78,183,72,119,64,77,54,54,42,42,30,36,26,35,20,31,18,25,20,15,23,6,30,0,39,-5,52,-6,77,9,91,48,98,99,100,148,100,183,147,183,145,160,143,136,139,82,139,56,141,37,147,20,156,7,169,-1,185,-4,205,0,220,12,232,29,239,49,241,69,36,-65,35,-75,34,-84,32,-93,30,-101,27,-107,70,-107,72,-102,74,-95,76,-85,77,-75,78,-64,78,15,88,7,98,1,108,-2,118,-4,130,-4,164,1,192,19,214,47,228,82,233,123,228,158,214,188,191,210,163,225,
-51,59,43,75,44,11,44,11,43,75,40,98,39,150,40,98,43,118,39,150,43,118,54,168,54,168,43,118,50,136,54,168,50,136,62,152,61,268,63,305,57,328,61,268,57,328,53,272,53,272,57,328,48,319,53,272,48,319,47,278,47,278,48,319,43,309,47,278,43,309,42,286,42,286,43,309,41,297,64,310,66,316,71,335,71,335,66,316,72,322,71,335,72,322,89,342,89,342,72,322,80,328,89,342,80,328,93,334,64,310,71,335,57,328,64,310,57,328,63,305,73,235,76,283,71,225,71,225,70,286,69,266,69,266,70,286,66,291,69,266,66,291,64,297,83,281,76,283,77,243,83,281,77,243,83,251,83,281,83,251,96,290,72,218,73,184,74,211,74,211,73,184,77,164,74,211,77,164,78,204,78,204,77,164,94,174,78,204,94,174,83,199,83,199,94,174,89,194,101,202,94,174,102,172,101,202,102,172,113,208,113,208,102,172,110,171,113,208,110,171,117,170,73,184,54,168,62,152,73,184,62,152,77,164,73,184,72,218,71,225,73,184,71,225,69,266,73,184,69,266,65,190,52,233,52,215,54,242,54,242,52,215,55,206,54,242,55,206,58,251,58,251,55,206,59,198,58,251,59,198,63,259,63,259,59,198,65,190,63,259,65,190,69,266,64,297,63,305,61,268,64,297,61,268,69,266,128,41,124,41,128,-1,128,-1,124,41,118,41,128,-1,118,41,117,-2,117,-2,118,41,111,40,117,-2,111,40,107,-4,107,-4,111,40,104,40,107,-4,104,40,98,-4,98,-4,104,40,98,40,177,29,156,38,158,-1,158,-1,156,38,143,0,137,0,143,0,156,38,137,0,156,38,128,41,128,-64,132,-108,134,-69,134,-69,132,-108,151,-104,134,-69,151,-104,140,-72,140,-72,151,-104,147,-74,159,-72,147,-74,151,-104,159,-72,151,-104,170,-93,204,-26,201,-3,199,-53,199,-53,201,-3,192,15,199,-53,192,15,188,-34,188,-34,187,-76,199,-53,158,-1,170,-5,177,29,177,29,170,-5,180,-12,177,29,180,-12,192,15,192,15,180,-12,186,-22,192,15,186,-22,188,-34,188,-34,186,-47,187,-76,187,-76,186,-47,180,-59,187,-76,180,-59,170,-93,170,-93,180,-59,170,-67,170,-93,170,-67,159,-72,110,-60,111,-103,117,-59,117,-59,111,-103,121,-107,117,-59,121,-107,123,-61,123,-61,121,-107,132,-108,123,-61,132,-108,128,-64,97,-73,98,-90,99,-68,99,-68,98,-90,103,-98,99,-68,103,-98,104,-63,104,-63,103,-98,111,-103,104,-63,111,-103,110,-60,181,186,185,197,184,204,181,186,184,204,179,210,181,186,179,210,172,214,181,186,172,214,171,178,117,170,124,170,127,213,127,213,124,170,131,170,127,213,131,170,140,216,140,216,131,170,142,170,140,216,142,170,153,217,153,217,142,170,157,173,153,217,157,173,164,216,164,216,157,173,171,178,164,216,171,178,172,214,160,307,160,271,166,305,166,305,160,271,171,280,166,305,171,280,171,301,171,301,171,280,175,291,171,301,175,291,174,297,125,303,126,260,139,306,139,306,126,260,144,264,139,306,144,264,151,307,151,307,144,264,160,271,151,307,160,271,160,307,83,251,93,256,96,290,96,290,93,256,106,258,96,290,106,258,111,297,111,297,106,258,126,260,111,297,126,260,125,303,79,42,63,48,67,0,79,42,67,0,98,-4,79,42,98,-4,98,40,51,59,44,11,67,0,51,59,67,0,63,48,29,29,44,11,40,98,29,29,40,98,39,150,29,29,39,150,27,129,29,29,27,129,20,53,20,106,17,81,20,53,20,106,20,53,27,129,113,208,117,170,127,213,98,-90,97,-73,96,-80,128,41,128,-1,137,0,52,215,52,233,51,224,94,174,101,202,89,194,70,286,71,225,76,283,76,283,73,235,77,243,
-237,114,232,151,218,183,197,208,167,224,129,230,91,223,60,203,37,174,22,139,17,101,23,67,38,38,62,15,92,0,126,-4,161,2,191,20,215,47,231,79,237,114,16383,16383,192,95,190,74,183,52,172,31,156,17,134,11,107,19,87,38,73,65,65,95,62,122,64,145,70,169,80,191,97,207,119,214,148,205,168,184,182,155,190,124,192,95,233,69,229,55,223,45,216,40,209,37,203,36,194,38,188,41,184,47,180,54,178,61,177,69,176,78,175,88,175,109,176,127,176,144,178,160,179,173,180,183,239,183,239,225,97,225,68,222,46,214,29,200,16,180,4,155,12,155,23,167,35,176,47,180,62,183,78,183,72,119,64,77,54,54,42,42,30,36,26,35,20,31,18,25,20,15,
-97,207,119,214,119,214,129,230,119,214,148,205,129,230,148,205,167,224,167,224,148,205,168,184,167,224,168,184,197,208,197,208,168,184,182,155,197,208,182,155,190,124,190,74,183,52,191,20,191,20,183,52,172,31,191,20,172,31,161,2,161,2,172,31,156,17,161,2,156,17,134,11,134,11,107,19,126,-4,126,-4,107,19,92,0,107,19,87,38,92,0,92,0,87,38,73,65,92,0,73,65,62,15,62,15,73,65,65,95,62,15,65,95,62,122,80,191,91,223,70,169,70,169,91,223,60,203,70,169,60,203,64,145,64,145,60,203,62,122,62,15,62,122,60,203,62,15,60,203,38,38,38,38,60,203,37,174,38,38,37,174,23,67,23,67,37,174,22,139,23,67,22,139,17,101,237,114,232,151,231,79,231,79,232,151,218,183,231,79,218,183,215,47,215,47,218,183,197,208,215,47,197,208,192,95,192,95,191,20,215,47,134,11,126,-4,161,2,97,207,119,214,129,230,97,207,129,230,91,223,97,207,91,223,80,191,190,74,191,20,192,95,197,208,190,124,192,95,
-233,69,229,55,223,45,216,40,209,37,203,36,194,38,188,41,184,47,180,54,178,61,177,69,176,78,175,88,175,109,176,127,176,144,178,160,179,173,180,183,239,183,239,225,97,225,68,222,46,214,29,200,16,180,4,155,12,155,23,167,35,176,47,180,62,183,78,183,72,119,64,77,54,54,42,42,30,36,26,35,20,31,18,25,20,15,23,6,30,0,39,-5,52,-6,77,9,91,48,98,99,100,148,100,183,147,183,145,160,143,136,139,82,139,56,141,37,147,20,156,7,169,-1,185,-4,205,0,220,12,232,29,239,49,241,69,36,-65,35,-75,34,-84,32,-93,30,-101,27,-107,70,-107,72,-102,74,-95,76,-85,77,-75,78,-64,78,15,88,7,98,1,108,-2,118,-4,130,-4,164,1,192,19,214,47,228,82,233,123,228,158,214,188,191,210,163,225,129,230,101,225,75,210,54,182,41,138,36,76,16383,16383,78,137,79,163,85,185,94,202,107,212,123,216,145,211,163,197,177,175,186,144,190,106,187,75,179,49,166,29,150,16,129,11,115,13,101,18,89,26,81,35,78,44,216,176,213,191,205,206,190,218,169,227,142,230,107,223,73,202,45,171,25,130,17,83,21,45,
-72,119,64,77,77,9,77,9,64,77,54,54,77,9,54,54,52,-6,52,-6,54,54,42,42,52,-6,42,42,39,-5,39,-5,42,42,30,36,39,-5,30,36,30,0,30,0,30,36,26,35,30,0,26,35,23,6,23,6,26,35,23,33,23,6,23,33,20,31,20,15,23,6,20,31,20,15,20,31,19,28,20,15,19,28,18,25,97,225,68,222,78,183,78,183,91,48,97,225,97,225,91,48,98,99,97,225,98,99,100,183,100,183,98,99,100,148,180,183,239,183,239,225,180,183,239,225,147,183,147,183,239,225,100,183,176,78,175,88,169,-1,169,-1,175,88,175,99,169,-1,175,99,175,109,175,109,176,127,169,-1,169,-1,176,127,176,144,169,-1,176,144,156,7,156,7,176,144,178,160,156,7,178,160,179,173,147,20,180,183,147,183,147,20,147,183,145,160,179,173,180,183,147,20,179,173,147,20,156,7,97,225,100,183,239,225,4,155,12,155,16,180,16,180,12,155,23,167,16,180,23,167,29,200,29,200,23,167,35,176,29,200,35,176,46,214,46,214,35,176,47,180,46,214,47,180,68,222,68,222,47,180,62,183,68,222,62,183,78,183,188,41,184,47,185,-4,185,-4,184,47,180,54,185,-4,180,54,178,61,178,61,177,69,185,-4,185,-4,177,69,169,-1,188,41,205,0,194,38,194,38,205,0,203,36,209,37,203,36,205,0,209,37,205,0,220,12,233,69,229,55,232,29,233,69,232,29,239,49,233,69,239,49,241,69,223,45,216,40,220,12,223,45,220,12,232,29,223,45,232,29,229,55,143,136,141,109,141,37,143,136,141,37,147,20,143,136,147,20,145,160,139,82,139,56,141,37,139,82,141,37,141,109,78,183,72,119,77,9,78,183,77,9,91,48,176,78,169,-1,177,69,188,41,185,-4,205,0,209,37,220,12,216,40,
-36,-65,35,-75,34,-84,32,-93,30,-101,27,-107,70,-107,72,-102,74,-95,76,-85,77,-75,78,-64,78,15,88,7,98,1,108,-2,118,-4,130,-4,164,1,192,19,214,47,228,82,233,123,228,158,214,188,191,210,163,225,129,230,101,225,75,210,54,182,41,138,36,76,16383,16383,78,137,79,163,85,185,94,202,107,212,123,216,145,211,163,197,177,175,186,144,190,106,187,75,179,49,166,29,150,16,129,11,115,13,101,18,89,26,81,35,78,44,216,176,213,191,205,206,190,218,169,227,142,230,107,223,73,202,45,171,25,130,17,83,21,45,33,20,50,5,71,-2,95,-4,105,-4,117,-2,128,-1,137,0,143,0,158,-1,170,-5,180,-12,186,-22,188,-34,186,-47,180,-58,170,-67,159,-72,147,-74,140,-72,134,-69,128,-64,123,-61,117,-59,110,-60,104,-63,99,-68,97,-73,96,-80,98,-90,103,-98,111,-103,121,-107,132,-108,151,-104,170,-93,187,-76,199,-55,204,-29,201,-3,192,16,177,30,156,38,
-107,212,123,216,123,216,129,230,123,216,145,211,129,230,145,211,163,225,163,225,145,211,163,197,163,225,163,197,191,210,191,210,163,197,177,175,191,210,177,175,186,144,191,210,190,106,192,19,191,210,192,19,214,188,214,188,192,19,214,47,214,188,214,47,228,158,228,158,214,47,228,82,228,158,228,82,233,123,192,19,190,106,187,75,192,19,187,75,179,49,192,19,179,49,166,29,192,19,166,29,164,1,129,11,130,-4,150,16,150,16,130,-4,164,1,150,16,164,1,166,29,130,-4,129,11,118,-4,118,-4,129,11,115,13,118,-4,115,13,108,-2,108,-2,115,13,101,18,108,-2,101,18,98,1,98,1,101,18,89,26,98,1,89,26,88,7,88,7,89,26,81,35,88,7,81,35,78,44,85,185,94,202,101,225,101,225,94,202,107,212,101,225,107,212,129,230,129,230,107,212,123,216,78,137,79,163,75,210,78,137,75,210,76,-85,78,137,76,-85,77,-75,78,137,77,-75,78,-64,75,210,79,163,85,185,75,210,85,185,101,225,75,210,54,182,70,-107,75,210,70,-107,72,-102,75,210,72,-102,74,-95,75,210,74,-95,76,-85,70,-107,54,182,41,138,70,-107,41,138,36,76,70,-107,36,76,36,-65,70,-107,36,-65,35,-75,70,-107,35,-75,34,-84,70,-107,34,-84,32,-93,70,-107,32,-93,30,-101,70,-107,30,-101,27,-107,78,44,78,15,88,7,191,210,186,144,190,106,
-216,176,213,191,205,206,190,218,169,227,142,230,107,223,73,202,45,171,25,130,17,83,21,45,33,20,50,5,71,-2,95,-4,105,-4,117,-2,128,-1,137,0,143,0,158,-1,170,-5,180,-12,186,-22,188,-34,186,-47,180,-58,170,-67,159,-72,147,-74,140,-72,134,-69,128,-64,123,-61,117,-59,110,-60,104,-63,99,-68,97,-73,96,-80,98,-90,103,-98,111,-103,121,-107,132,-108,151,-104,170,-93,187,-76,199,-55,204,-29,201,-3,192,16,177,30,156,38,128,41,119,41,115,40,103,40,78,45,60,54,48,68,42,85,41,105,45,135,58,158,76,174,97,183,118,186,141,182,158,174,170,163,181,155,192,151,201,153,208,157,212,163,215,169,216,176,259,183,259,225,119,225,87,220,58,207,35,184,20,151,15,108,20,73,35,42,58,18,87,1,119,-4,156,1,187,16,212,38,228,65,233,94,229,121,218,138,203,152,186,165,171,183,16383,16383,189,85,186,63,180,42,168,25,152,13,131,9,110,15,90,30,75,54,64,84,60,117,65,145,78,164,97,176,118,182,137,183,153,172,167,155,178,134,186,110,189,85,221,183,221,225,81,225,55,219,34,204,18,183,7,160,2,138,9,138,16,153,25,166,37,175,50,181,66,183,107,183,102,164,96,142,92,119,88,95,87,71,89,49,94,28,103,11,118,0,138,-4,157,0,172,10,183,27,191,48,193,71,185,71,182,59,176,49,169,42,
-60,54,48,68,50,5,50,5,48,68,42,85,50,5,42,85,33,20,33,20,42,85,41,105,45,171,41,105,45,135,45,171,45,135,73,202,73,202,45,135,58,158,73,202,58,158,76,174,73,202,76,174,107,223,107,223,76,174,97,183,107,223,97,183,118,186,118,186,141,182,142,230,142,230,141,182,158,174,142,230,158,174,169,227,169,227,158,174,170,163,169,227,170,163,190,218,190,218,170,163,181,155,190,218,181,155,192,151,17,83,21,45,25,130,25,130,21,45,33,20,25,130,33,20,45,171,45,171,33,20,41,105,177,30,156,38,158,-1,158,-1,156,38,143,0,137,0,143,0,156,38,137,0,156,38,128,41,128,-1,137,0,128,41,128,-1,128,41,123,41,128,-1,123,41,119,41,128,-1,119,41,117,-2,105,-4,117,-2,107,40,111,40,107,40,117,-2,111,40,117,-2,115,40,115,40,117,-2,119,41,60,54,71,-2,78,45,78,45,71,-2,95,-4,78,45,95,-4,103,40,103,40,95,-4,105,-4,103,40,105,-4,107,40,128,-64,132,-108,134,-69,134,-69,132,-108,151,-104,134,-69,151,-104,140,-72,140,-72,151,-104,147,-74,159,-72,147,-74,151,-104,159,-72,151,-104,170,-93,204,-29,201,-3,199,-55,199,-55,201,-3,192,16,199,-55,192,16,188,-34,188,-34,187,-76,199,-55,158,-1,170,-5,177,30,177,30,170,-5,180,-12,177,30,180,-12,192,16,192,16,180,-12,186,-22,192,16,186,-22,188,-34,187,-76,188,-34,186,-47,187,-76,186,-47,180,-58,187,-76,180,-58,170,-67,187,-76,170,-67,170,-93,110,-60,111,-103,117,-59,117,-59,111,-103,121,-107,117,-59,121,-107,123,-61,123,-61,121,-107,132,-108,123,-61,132,-108,128,-64,97,-73,98,-90,99,-68,99,-68,98,-90,103,-98,99,-68,103,-98,104,-63,104,-63,103,-98,111,-103,104,-63,111,-103,110,-60,213,191,205,206,208,157,213,191,208,157,212,163,213,191,212,163,215,169,213,191,215,169,216,176,205,206,190,218,192,151,205,206,192,151,201,153,205,206,201,153,208,157,142,230,107,223,118,186,98,-90,97,-73,96,-80,159,-72,170,-93,170,-67,60,54,50,5,71,-2,
-259,183,259,225,119,225,87,220,58,207,35,184,20,151,15,108,20,73,35,42,58,18,87,1,119,-4,156,1,187,16,212,38,228,65,233,94,229,121,218,138,203,152,186,165,171,183,16383,16383,189,85,186,63,180,42,168,25,152,13,131,9,110,15,90,30,75,54,64,84,60,117,65,145,78,164,97,176,118,182,137,183,153,172,167,155,178,134,186,110,189,85,221,183,221,225,81,225,55,219,34,204,18,183,7,160,2,138,9,138,16,153,25,166,37,175,50,181,66,183,107,183,102,164,96,142,92,119,88,95,87,71,89,49,94,28,103,11,118,0,138,-4,157,0,172,10,183,27,191,48,193,71,185,71,182,59,176,49,169,42,161,38,151,36,141,39,133,47,128,59,125,74,124,91,125,113,128,135,131,155,134,172,
-186,63,180,42,187,16,187,16,180,42,168,25,187,16,168,25,156,1,156,1,168,25,152,13,156,1,152,13,131,9,131,9,110,15,119,-4,119,-4,110,15,90,30,119,-4,90,30,87,1,87,1,90,30,75,54,87,1,75,54,64,84,58,207,60,117,65,145,58,207,65,145,87,220,87,220,65,145,78,164,87,220,78,164,97,176,58,18,87,1,64,84,58,18,64,84,60,117,58,18,60,117,58,207,58,18,58,207,35,184,58,18,35,184,35,42,20,151,15,108,20,73,20,151,20,73,35,42,20,151,35,42,35,184,153,172,167,155,171,183,171,183,167,155,178,134,171,183,259,225,137,183,119,225,87,220,97,176,119,225,97,176,118,182,119,225,118,182,137,183,119,225,137,183,259,225,137,183,153,172,171,183,233,94,229,121,228,65,228,65,229,121,218,138,228,65,218,138,212,38,212,38,218,138,203,152,212,38,203,152,189,85,189,85,203,152,186,165,189,85,186,165,186,110,186,165,171,183,178,134,186,165,178,134,186,110,189,85,187,16,212,38,131,9,119,-4,156,1,186,63,187,16,189,85,259,225,171,183,259,183,
-221,183,221,225,81,225,55,219,34,204,18,183,7,160,2,138,9,138,16,153,25,166,37,175,50,181,66,183,107,183,102,164,96,142,92,119,88,95,87,71,89,49,94,28,103,11,118,0,138,-4,157,0,172,10,183,27,191,48,193,71,185,71,182,59,176,49,169,42,161,38,151,36,141,39,133,47,128,59,125,74,124,91,125,113,128,135,131,155,134,172,136,183,127,230,127,220,139,218,149,214,159,209,168,201,177,191,186,176,193,159,198,141,201,122,202,104,200,75,193,49,182,28,165,14,142,9,121,14,106,28,97,47,92,68,91,87,91,193,90,205,86,215,80,222,71,226,60,228,47,225,36,216,26,203,16,188,8,172,15,170,18,176,28,188,33,193,39,194,43,192,46,187,48,180,49,170,49,99,51,66,60,38,76,15,
-9,138,16,153,18,183,18,183,16,153,25,166,18,183,25,166,34,204,34,204,25,166,37,175,34,204,37,175,55,219,55,219,37,175,50,181,55,219,50,181,66,183,81,225,66,183,107,183,81,225,107,183,221,225,221,225,107,183,136,183,221,225,136,183,221,183,7,160,2,138,9,138,7,160,9,138,18,183,118,0,125,74,124,91,124,91,125,113,118,0,118,0,125,113,107,183,118,0,107,183,103,11,103,11,107,183,102,164,103,11,102,164,96,142,128,135,131,155,107,183,107,183,131,155,134,172,107,183,134,172,136,183,138,-4,157,0,141,39,141,39,157,0,151,36,161,38,151,36,157,0,161,38,157,0,172,10,185,71,182,59,183,27,185,71,183,27,191,48,185,71,191,48,193,71,176,49,169,42,172,10,176,49,172,10,183,27,176,49,183,27,182,59,138,-4,141,39,133,47,138,-4,133,47,128,59,138,-4,128,59,125,74,138,-4,125,74,118,0,103,11,96,142,94,28,94,28,96,142,92,119,94,28,92,119,89,49,89,49,92,119,88,95,89,49,88,95,87,71,161,38,172,10,169,42,66,183,81,225,55,219,128,135,107,183,125,113,
-127,230,127,220,139,218,149,214,159,209,168,201,177,191,186,176,193,159,198,141,201,122,202,104,200,75,193,49,182,28,165,14,142,9,121,14,106,28,97,47,92,68,91,87,91,193,90,205,86,215,80,222,71,226,60,228,47,225,36,216,26,203,16,188,8,172,15,170,18,176,28,188,33,193,39,194,43,192,46,187,48,180,49,170,49,99,51,66,60,38,76,15,102,0,139,-4,174,1,204,18,227,43,242,75,247,113,241,155,226,188,202,211,173,225,141,230,134,9,124,10,114,13,104,18,94,25,86,34,76,52,68,72,63,94,61,116,60,137,63,166,73,189,88,206,109,216,134,221,134,228,132,229,129,229,126,230,121,230,84,224,54,207,33,181,19,150,15,114,19,78,33,46,55,20,85,3,123,-3,134,-4,134,-107,176,-107,176,-4,220,1,254,18,277,43,292,75,296,111,291,151,278,184,258,209,233,224,207,230,195,229,184,226,175,221,167,215,160,208,148,187,141,162,137,134,135,105,134,76,16383,16383,176,9,176,129,
-18,176,23,182,26,203,26,203,23,182,28,188,26,203,28,188,36,216,36,216,28,188,33,193,36,216,33,193,39,194,39,194,43,192,47,225,47,225,43,192,46,187,47,225,46,187,48,180,16,188,8,172,15,170,16,188,15,170,18,176,16,188,18,176,26,203,49,99,51,66,49,159,49,170,49,159,60,228,49,170,60,228,48,180,48,180,60,228,47,225,91,87,91,193,90,205,91,87,90,205,86,215,91,87,86,215,80,222,91,87,80,222,92,68,141,230,127,230,139,218,141,230,139,218,149,214,141,230,149,214,173,225,200,75,193,49,204,18,204,18,193,49,182,28,204,18,182,28,174,1,174,1,182,28,165,14,174,1,165,14,142,9,142,9,121,14,139,-4,139,-4,121,14,106,28,139,-4,106,28,102,0,102,0,106,28,97,47,102,0,97,47,92,68,76,15,102,0,92,68,76,15,92,68,80,222,76,15,80,222,71,226,76,15,71,226,60,228,76,15,60,228,60,38,60,228,49,159,51,66,60,228,51,66,60,38,47,225,36,216,39,194,149,214,159,209,173,225,173,225,159,209,168,201,173,225,168,201,177,191,177,191,186,176,202,211,202,211,186,176,193,159,202,211,193,159,198,141,202,211,202,104,204,18,202,211,204,18,226,188,226,188,204,18,227,43,226,188,227,43,241,155,241,155,227,43,242,75,241,155,242,75,247,113,202,211,198,141,201,122,202,211,201,122,202,104,202,211,173,225,177,191,142,9,139,-4,174,1,200,75,204,18,202,104,139,218,127,230,127,220,
-134,9,124,10,114,13,104,18,94,25,86,34,76,52,68,72,63,94,61,116,60,137,63,166,73,189,88,206,109,216,134,221,134,228,132,229,129,229,126,230,121,230,84,224,54,207,33,181,19,150,15,114,19,78,33,46,55,20,85,3,123,-3,134,-4,134,-107,176,-107,176,-4,220,1,254,18,277,43,292,75,296,111,291,151,278,184,258,209,233,224,207,230,195,229,184,226,175,221,167,215,160,208,148,187,141,162,137,134,135,105,134,76,16383,16383,176,9,176,129,177,155,178,179,182,198,189,211,201,216,218,209,232,190,243,164,249,134,252,103,250,74,243,49,231,28,214,14,191,9,243,225,194,225,123,93,113,139,103,177,92,206,79,224,63,230,49,227,38,217,31,202,27,182,26,156,34,156,37,171,41,182,46,190,51,194,56,195,67,192,77,183,85,168,93,147,101,119,110,78,6,-104,55,-104,126,26,136,-34,141,-57,148,-78,157,-94,168,-105,182,-109,198,-104,209,-90,216,-71,219,-52,220,-34,213,-34,210,-49,206,-61,201,-68,195,-72,187,-74,188,-74,177,-71,168,-63,160,-48,153,-27,147,1,138,41,342,228,332,230,316,230,290,224,273,209,262,187,256,162,254,136,253,103,249,69,239,39,223,17,197,9,197,225,155,225,155,9,129,17,112,39,103,69,99,104,98,137,
-61,116,60,137,60,137,55,20,60,137,54,207,55,20,54,207,33,46,33,46,54,207,33,181,33,46,33,181,19,78,19,78,33,181,19,150,19,78,19,150,15,114,63,94,55,20,68,72,68,72,55,20,85,3,68,72,85,3,76,52,76,52,85,3,86,34,94,25,86,34,85,3,94,25,85,3,123,-3,61,116,60,137,55,20,61,116,55,20,63,94,135,105,134,76,176,-107,176,-107,134,76,134,9,176,-107,134,9,134,-4,134,-4,134,9,124,10,134,-4,124,10,123,-3,123,-3,124,10,114,13,123,-3,114,13,104,18,134,221,134,228,132,229,134,221,132,229,129,229,134,221,129,229,126,230,134,221,126,230,124,230,134,221,124,230,121,230,134,221,121,230,109,216,175,221,176,-107,176,129,176,9,176,-4,220,1,176,9,220,1,191,9,191,9,220,1,214,14,207,230,201,216,218,209,207,230,218,209,233,224,233,224,218,209,232,190,233,224,232,190,243,164,178,179,182,198,184,226,184,226,182,198,189,211,184,226,189,211,195,229,195,229,189,211,201,216,195,229,201,216,207,230,175,221,176,129,177,155,175,221,177,155,178,179,175,221,178,179,184,226,176,-107,175,221,167,215,176,-107,167,215,160,208,176,-107,160,208,148,187,176,-107,148,187,141,162,176,-107,141,162,137,134,176,-107,137,134,135,105,296,111,291,151,292,75,292,75,291,151,278,184,292,75,278,184,277,43,277,43,278,184,258,209,277,43,258,209,254,18,254,18,258,209,252,103,254,18,252,103,250,74,254,18,250,74,243,49,258,209,233,224,243,164,258,209,243,164,249,134,258,209,249,134,252,103,231,28,214,14,220,1,231,28,220,1,254,18,231,28,254,18,243,49,63,166,73,189,84,224,84,224,73,189,88,206,84,224,88,206,121,230,121,230,88,206,109,216,63,166,84,224,54,207,63,166,54,207,60,137,176,-107,134,-4,134,-107,94,25,123,-3,104,18,
-243,225,194,225,123,93,113,139,103,177,92,206,79,224,63,230,49,227,38,217,31,202,27,182,26,156,34,156,37,171,41,182,46,190,51,194,56,195,67,192,77,183,85,168,93,147,101,119,110,78,6,-104,55,-104,126,26,136,-34,141,-57,148,-78,157,-94,168,-105,182,-109,198,-104,209,-90,216,-71,219,-52,220,-34,213,-34,210,-49,206,-61,201,-68,195,-72,187,-74,188,-74,177,-71,168,-63,160,-48,153,-27,147,1,138,41,342,228,332,230,316,230,290,224,273,209,262,187,256,162,254,136,253,103,249,69,239,39,223,17,197,9,197,225,155,225,155,9,129,17,112,39,103,69,99,104,98,137,96,163,90,188,78,210,61,224,36,230,31,230,25,229,14,229,10,228,10,220,30,210,42,190,49,164,52,137,52,114,55,72,65,39,84,15,114,0,155,-4,155,-107,197,-107,197,-4,236,0,265,16,285,41,296,74,300,114,300,137,303,164,310,190,
-79,224,63,230,67,192,67,192,63,230,56,195,51,194,56,195,63,230,51,194,63,230,49,227,194,225,123,93,126,26,126,26,123,93,113,139,126,26,113,139,110,78,110,78,113,139,103,177,110,78,103,177,101,119,67,192,77,183,79,224,79,224,77,183,85,168,79,224,85,168,92,206,92,206,85,168,93,147,92,206,93,147,103,177,103,177,93,147,101,119,138,41,243,225,194,225,138,41,194,225,126,26,138,41,126,26,136,-34,138,41,136,-34,141,-57,138,41,141,-57,147,1,110,78,6,-104,55,-104,110,78,55,-104,126,26,210,-49,206,-61,209,-90,209,-90,206,-61,201,-68,209,-90,201,-68,198,-104,198,-104,201,-68,195,-72,198,-104,195,-72,188,-74,187,-74,188,-74,177,-71,187,-74,177,-71,182,-109,182,-109,177,-71,168,-105,177,-71,168,-63,168,-105,168,-105,168,-63,160,-48,168,-105,160,-48,157,-94,157,-94,160,-48,153,-27,157,-94,153,-27,148,-78,148,-78,153,-27,147,1,148,-78,147,1,141,-57,216,-71,219,-52,220,-34,216,-71,220,-34,213,-34,216,-71,213,-34,210,-49,216,-71,210,-49,209,-90,187,-74,182,-109,198,-104,187,-74,198,-104,188,-74,34,156,37,171,38,217,38,217,37,171,41,182,38,217,41,182,49,227,49,227,41,182,46,190,49,227,46,190,51,194,34,156,38,217,31,202,34,156,31,202,27,182,34,156,27,182,26,156,
-342,228,332,230,316,230,290,224,273,209,262,187,256,162,254,136,253,103,249,69,239,39,223,17,197,9,197,225,155,225,155,9,129,17,112,39,103,69,99,104,98,137,96,163,90,188,78,210,61,224,36,230,31,230,25,229,14,229,10,228,10,220,30,210,42,190,49,164,52,137,52,114,55,72,65,39,84,15,114,0,155,-4,155,-107,197,-107,197,-4,236,0,265,16,285,41,296,74,300,114,300,137,303,164,310,190,322,211,342,221,180,223,206,218,226,203,240,179,249,146,252,104,252,76,248,51,242,29,229,14,210,9,200,12,190,20,181,33,174,51,170,73,173,85,177,105,178,115,179,127,177,145,174,158,169,168,163,173,156,175,149,173,143,168,138,159,135,145,133,126,134,114,135,103,137,94,139,84,142,73,138,51,132,33,123,20,113,12,100,9,82,15,71,31,64,54,61,81,60,109,63,149,73,180,88,204,108,218,132,223,132,230,94,225,62,211,37,186,
-239,39,223,17,236,0,236,0,223,17,197,9,197,-107,197,9,155,-4,197,225,155,225,155,-4,197,225,155,-4,197,9,155,225,155,9,155,-4,155,-4,155,9,129,17,155,-4,129,17,114,0,114,0,129,17,112,39,114,0,112,39,103,69,99,104,98,137,96,163,99,104,96,163,90,188,99,104,90,188,84,15,99,104,84,15,103,69,52,114,55,72,61,224,61,224,55,72,65,39,61,224,65,39,78,210,78,210,65,39,84,15,78,210,84,15,90,188,42,190,49,164,61,224,61,224,49,164,52,137,61,224,52,137,52,114,61,224,36,230,42,190,42,190,36,230,31,230,42,190,31,230,30,210,30,210,31,230,25,229,30,210,25,229,19,229,14,229,10,228,30,210,14,229,30,210,19,229,262,187,256,162,265,16,265,16,256,162,254,136,265,16,254,136,253,103,342,221,342,228,337,229,342,221,337,229,332,230,342,221,332,230,327,230,342,221,327,230,322,211,303,164,310,190,316,230,316,230,310,190,322,211,316,230,322,211,321,230,321,230,322,211,327,230,262,187,265,16,273,209,273,209,265,16,285,41,273,209,285,41,290,224,290,224,285,41,296,74,290,224,296,74,300,137,300,137,296,74,300,114,290,224,300,137,303,164,290,224,303,164,316,230,265,16,253,103,249,69,265,16,249,69,239,39,265,16,239,39,236,0,197,9,197,-4,236,0,197,-107,155,-4,155,-107,30,210,10,228,10,220,103,69,84,15,114,0,
-180,223,206,218,226,203,240,179,249,146,252,104,252,76,248,51,242,29,229,14,210,9,200,12,190,20,181,33,174,51,170,73,173,85,177,105,178,115,179,127,177,145,174,158,169,168,163,173,156,175,149,173,143,168,138,159,135,145,133,126,134,114,135,103,137,94,139,84,142,73,138,51,132,33,123,20,113,12,100,9,82,15,71,31,64,54,61,81,60,109,63,149,73,180,88,204,108,218,132,223,132,230,94,225,62,211,37,186,20,151,15,104,15,84,18,66,23,50,30,35,39,23,49,13,59,5,70,0,81,-3,93,-4,109,-2,123,3,136,12,147,26,156,43,164,26,175,12,187,3,202,-2,218,-4,230,-3,242,0,253,5,263,13,273,23,282,35,289,49,294,66,296,85,297,105,292,152,275,187,250,211,218,225,180,230,158,286,157,294,153,301,148,306,141,310,133,311,125,310,118,306,113,301,110,294,108,286,109,278,113,272,118,266,125,263,132,262,140,263,148,266,153,272,157,278,158,286,16383,16383,59,286,57,294,54,301,48,306,41,310,33,311,26,310,19,306,14,301,10,294,9,286,10,278,14,272,19,266,25,263,33,262,41,263,48,266,54,272,57,278,59,286,16383,16383,138,54,132,43,127,36,122,31,118,29,112,28,108,29,105,31,103,33,102,36,102,228,99,230,84,224,68,219,53,214,37,208,22,204,22,195,27,196,49,196,54,193,57,188,59,181,60,172,60,39,61,26,63,14,69,4,77,-2,89,-4,104,-1,117,7,128,20,138,35,146,50,202,286,201,294,197,301,192,306,185,310,177,311,169,310,162,306,157,301,154,294,152,286,154,278,
-71,31,64,54,70,0,70,0,64,54,61,81,70,0,61,81,59,5,59,5,61,81,60,109,62,211,60,109,63,149,62,211,63,149,73,180,108,218,132,223,132,230,108,218,132,230,94,225,108,218,94,225,88,204,94,225,62,211,73,180,94,225,73,180,88,204,23,50,30,35,37,186,37,186,30,35,39,23,37,186,39,23,62,211,62,211,39,23,49,13,62,211,49,13,60,109,60,109,49,13,59,5,20,151,15,104,15,84,20,151,15,84,18,66,20,151,18,66,23,50,20,151,23,50,37,186,81,-3,93,-4,82,15,82,15,93,-4,100,9,113,12,100,9,109,-2,113,12,109,-2,123,3,71,31,70,0,81,-3,71,31,81,-3,82,15,174,51,170,73,175,12,174,158,170,73,173,85,174,158,173,85,175,95,177,145,174,158,175,95,177,145,175,95,177,105,177,145,177,105,178,115,177,145,178,115,179,127,156,175,156,43,163,173,163,173,156,43,164,26,163,173,164,26,169,168,169,168,164,26,170,73,169,168,170,73,174,158,174,51,175,12,181,33,181,33,175,12,187,3,181,33,187,3,190,20,190,20,187,3,202,-2,190,20,202,-2,200,12,200,12,202,-2,210,9,229,14,210,9,218,-4,229,14,218,-4,230,-3,282,35,289,49,292,152,292,152,289,49,294,66,292,152,294,66,297,105,297,105,294,66,296,85,275,187,250,211,252,104,275,187,252,104,253,5,275,187,253,5,263,13,275,187,263,13,273,23,275,187,273,23,282,35,275,187,282,35,292,152,240,179,249,146,250,211,250,211,249,146,252,104,253,5,252,104,252,76,240,179,250,211,226,203,226,203,250,211,218,225,226,203,218,225,206,218,206,218,218,225,180,230,206,218,180,230,180,223,229,14,230,-3,242,29,242,29,230,-3,242,0,242,29,242,0,248,51,248,51,242,0,253,5,248,51,253,5,252,76,210,9,202,-2,218,-4,139,84,142,73,143,168,143,168,142,73,147,26,143,168,147,26,149,173,149,173,147,26,156,43,149,173,156,43,156,175,147,26,142,73,138,51,147,26,138,51,136,12,136,12,138,51,132,33,136,12,132,33,123,3,123,3,132,33,123,20,123,3,123,20,113,12,138,159,135,145,135,103,138,159,135,103,137,94,138,159,137,94,139,84,138,159,139,84,143,168,135,145,133,126,134,114,135,145,134,114,135,103,100,9,93,-4,109,-2,170,73,164,26,175,12,
-272,145,263,146,255,146,246,147,238,148,230,150,229,176,225,203,220,230,212,257,201,281,191,300,179,316,163,329,144,338,121,342,100,339,80,331,63,316,50,294,46,264,53,226,74,194,104,168,142,149,185,137,186,133,186,116,185,85,180,56,171,32,157,15,137,9,115,14,101,28,91,46,87,66,85,84,85,110,84,131,81,145,76,154,67,159,55,160,43,158,31,151,20,140,9,125,0,105,7,100,15,114,20,123,25,128,29,131,33,132,37,131,39,128,42,123,43,115,44,104,44,93,46,61,55,34,72,13,97,0,133,-4,172,3,200,26,217,58,227,95,230,134,247,134,256,135,272,137,16383,16383,185,161,141,182,112,208,95,235,86,260,84,280,86,295,91,307,99,316,109,321,119,323,135,320,149,310,162,289,173,253,181,200,181,198,182,193,183,184,184,174,185,161,198,208,186,255,169,291,146,317,117,332,81,337,67,336,53,332,39,327,26,319,15,311,18,303,25,305,33,308,41,310,49,311,55,312,84,306,109,289,130,257,146,211,157,147,157,61,156,39,153,25,144,16,130,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,126,211,167,220,219,236,270,261,309,296,325,299,325,305,323,308,321,309,319,307,315,296,304,291,295,289,285,290,276,294,268,301,262,308,259,318,257,329,259,338,265,344,273,348,284,349,295,346,309,339,320,329,330,317,336,303,338,268,330,241,308,221,277,207,242,199,208,176,342,134,342,134,230,126,230,86,224,55,206,32,180,19,149,15,114,19,79,33,47,55,20,85,2,123,-4,134,-4,134,-107,176,-107,176,-4,223,2,257,21,280,48,292,81,296,116,294,143,286,168,272,190,
-20,123,25,128,31,151,31,151,25,128,29,131,31,151,29,131,33,132,33,132,37,131,43,158,43,158,37,131,39,128,43,158,39,128,42,123,0,105,7,100,9,125,9,125,7,100,15,114,9,125,15,114,20,140,20,140,15,114,20,123,20,140,20,123,31,151,44,104,46,61,55,160,55,160,46,61,55,34,55,160,55,34,67,159,67,159,55,34,72,13,67,159,72,13,76,154,76,154,72,13,87,66,76,154,87,66,85,84,85,84,85,110,84,131,85,84,84,131,81,145,85,84,81,145,76,154,121,342,119,323,135,320,121,342,135,320,144,338,144,338,135,320,149,310,144,338,149,310,163,329,163,329,149,310,162,289,163,329,162,289,173,253,180,56,171,32,172,3,172,3,171,32,157,15,172,3,157,15,137,9,137,9,115,14,133,-4,133,-4,115,14,101,28,133,-4,101,28,97,0,97,0,101,28,91,46,97,0,91,46,87,66,43,115,44,104,55,160,43,115,55,160,43,158,43,115,43,158,42,123,43,158,31,151,33,132,272,137,272,145,264,136,264,136,272,145,263,146,264,136,263,146,256,135,256,135,263,146,255,146,256,135,255,146,247,134,247,134,255,146,246,147,247,134,246,147,238,134,238,134,246,147,238,148,238,134,238,148,230,150,230,150,229,176,230,134,230,134,229,176,227,95,229,176,225,203,227,95,227,95,225,203,220,230,227,95,220,230,217,58,217,58,220,230,212,257,217,58,212,257,201,281,217,58,201,281,200,26,200,26,201,281,191,300,200,26,191,300,186,116,186,116,185,85,200,26,200,26,185,85,180,56,200,26,180,56,172,3,137,9,133,-4,172,3,238,134,230,150,230,134,91,307,99,316,100,339,100,339,99,316,109,321,100,339,109,321,121,342,121,342,109,321,119,323,80,331,84,280,86,295,80,331,86,295,100,339,100,339,86,295,91,307,191,300,179,316,181,200,191,300,181,200,181,198,191,300,181,198,182,193,191,300,182,193,183,184,191,300,183,184,184,174,191,300,184,174,185,161,191,300,185,161,185,137,191,300,185,137,186,133,191,300,186,133,186,129,191,300,186,129,186,124,191,300,186,124,186,120,191,300,186,120,186,116,185,161,141,182,142,149,185,161,142,149,185,137,112,208,95,235,104,168,112,208,104,168,142,149,112,208,142,149,141,182,86,260,84,280,74,194,86,260,74,194,104,168,86,260,104,168,95,235,84,280,80,331,74,194,74,194,80,331,63,316,74,194,63,316,53,226,53,226,63,316,50,294,53,226,50,294,46,264,173,253,181,200,179,316,173,253,179,316,163,329,46,61,44,104,44,93,87,66,72,13,97,0,
-176,342,134,342,134,230,126,230,86,224,55,206,32,180,19,149,15,114,19,79,33,47,55,20,85,2,123,-4,134,-4,134,-107,176,-107,176,-4,223,2,257,21,280,48,292,81,296,116,294,143,286,168,272,190,254,208,230,222,221,225,211,228,189,230,176,230,16383,16383,176,9,176,216,203,210,225,193,240,168,249,137,252,102,249,73,243,48,231,27,214,14,191,9,16383,16383,135,9,125,10,114,13,104,18,95,25,86,34,77,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,99,212,120,216,135,216,363,183,363,225,77,225,53,219,33,204,18,183,8,160,3,137,11,137,18,152,27,164,36,174,48,181,61,183,84,183,76,169,69,153,64,137,61,120,60,103,64,64,76,34,92,12,112,0,134,-4,153,-2,169,3,182,12,193,26,201,43,210,25,221,12,233,2,247,-2,261,-4,286,0,309,12,327,33,339,63,343,102,342,119,340,136,336,153,329,169,320,183,16383,16383,279,183,285,171,291,155,295,138,297,120,298,103,297,76,293,51,286,29,275,15,258,9,246,12,236,20,226,33,219,51,215,74,218,82,
-296,116,294,143,292,81,292,81,294,143,286,168,292,81,286,168,280,48,280,48,286,168,272,190,280,48,272,190,257,21,257,21,272,190,254,208,257,21,254,208,252,102,221,225,225,193,230,222,230,222,225,193,240,168,230,222,240,168,254,208,254,208,240,168,249,137,254,208,249,137,252,102,211,228,200,229,203,210,211,228,203,210,225,193,211,228,225,193,221,225,200,229,189,230,203,210,203,210,189,230,176,230,203,210,176,230,176,216,176,216,176,230,176,342,176,216,176,342,135,216,135,216,176,342,134,342,135,216,134,342,134,230,257,21,252,102,249,73,257,21,249,73,243,48,257,21,243,48,231,27,257,21,231,27,223,2,231,27,214,14,223,2,223,2,214,14,191,9,223,2,191,9,176,-4,176,-4,191,9,176,9,176,-4,176,9,176,-107,176,-107,176,9,135,216,176,-107,135,216,135,9,134,-4,134,-107,176,-107,134,-4,176,-107,135,9,134,-4,135,9,125,10,134,-4,125,10,123,-4,69,70,85,2,77,51,77,51,85,2,86,34,95,25,86,34,85,2,95,25,85,2,123,-4,82,202,86,224,70,186,70,186,86,224,55,206,70,186,55,206,62,164,62,164,55,206,60,137,61,113,60,137,55,20,61,113,55,20,64,91,64,91,55,20,85,2,64,91,85,2,69,70,123,-4,125,10,114,13,123,-4,114,13,104,18,123,-4,104,18,95,25,126,230,86,224,99,212,126,230,99,212,120,216,126,230,120,216,135,216,126,230,135,216,134,230,55,20,60,137,55,206,55,20,55,206,33,47,33,47,55,206,32,180,33,47,32,180,19,79,19,79,32,180,19,149,19,79,19,149,15,114,86,224,82,202,99,212,176,216,135,216,176,9,
-363,183,363,225,77,225,53,219,33,204,18,183,8,160,3,137,11,137,18,152,27,164,36,174,48,181,61,183,84,183,76,169,69,153,64,137,61,120,60,103,64,64,76,34,92,12,112,0,134,-4,153,-2,169,3,182,12,193,26,201,43,210,25,221,12,233,2,247,-2,261,-4,286,0,309,12,327,33,339,63,343,102,342,119,340,136,336,153,329,169,320,183,16383,16383,279,183,285,171,291,155,295,138,297,120,298,103,297,76,293,51,286,29,275,15,258,9,246,12,236,20,226,33,219,51,215,74,218,82,220,90,222,99,224,115,223,126,221,138,217,149,211,156,202,159,193,156,186,149,182,139,180,127,179,116,180,107,181,99,185,81,188,74,183,51,176,33,167,19,156,12,143,9,126,15,115,30,108,52,106,76,105,99,106,118,108,137,112,153,118,169,125,183,155,-46,154,-68,151,-83,143,-91,129,-96,108,-98,108,-107,254,-107,254,-98,233,-96,219,-92,211,-84,207,-71,206,-52,206,-4,252,8,290,33,319,68,337,113,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,23,114,42,69,71,33,109,8,155,-4,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,103,-107,146,-107,146,-2,176,7,200,26,219,50,231,81,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,
-11,137,18,152,18,183,18,183,18,152,27,164,18,183,27,164,33,204,33,204,27,164,36,174,33,204,36,174,53,219,53,219,36,174,48,181,53,219,48,181,61,183,77,225,61,183,84,183,77,225,84,183,363,225,363,225,84,183,125,183,363,225,125,183,279,183,8,160,3,137,11,137,8,160,11,137,18,183,108,137,112,153,84,183,84,183,112,153,118,169,84,183,118,169,125,183,108,52,112,0,115,30,115,30,112,0,134,-4,115,30,134,-4,126,15,126,15,134,-4,143,9,156,12,143,9,153,-2,156,12,153,-2,169,3,105,99,92,12,106,76,106,76,92,12,112,0,106,76,112,0,108,52,219,51,215,74,221,12,217,149,215,74,218,82,217,149,218,82,221,138,221,138,218,82,220,90,221,138,220,90,222,99,223,126,221,138,222,99,223,126,222,99,223,107,223,126,223,107,224,115,188,74,193,26,193,156,193,156,193,26,201,43,193,156,201,43,202,159,202,159,201,43,210,25,202,159,210,25,211,156,211,156,210,25,215,74,211,156,215,74,217,149,219,51,221,12,226,33,226,33,221,12,233,2,226,33,233,2,236,20,236,20,233,2,247,-2,236,20,247,-2,246,12,246,12,247,-2,258,9,275,15,258,9,261,-4,275,15,261,-4,286,0,363,225,279,183,285,171,363,225,285,171,291,155,363,225,291,155,320,183,363,225,320,183,363,183,340,136,336,153,339,63,339,63,336,153,329,169,339,63,329,169,327,33,327,33,329,169,320,183,327,33,320,183,309,12,309,12,320,183,298,103,291,155,295,138,320,183,320,183,295,138,297,120,320,183,297,120,298,103,106,118,108,137,84,183,106,118,84,183,92,12,106,118,92,12,105,99,340,136,339,63,343,102,340,136,343,102,342,119,309,12,298,103,297,76,309,12,297,76,293,51,309,12,293,51,286,29,309,12,286,29,286,0,258,9,247,-2,261,-4,186,149,182,139,183,90,186,149,183,90,185,81,186,149,185,81,188,74,186,149,188,74,193,156,179,116,180,107,180,127,180,127,180,107,181,99,180,127,181,99,182,139,182,139,181,99,183,90,193,26,188,74,183,51,193,26,183,51,182,12,182,12,183,51,176,33,182,12,176,33,169,3,169,3,176,33,167,19,169,3,167,19,156,12,143,9,134,-4,153,-2,76,169,69,153,76,34,76,169,76,34,92,12,76,169,92,12,84,183,64,137,61,120,64,64,64,137,64,64,76,34,64,137,76,34,69,153,64,64,61,120,60,103,275,15,286,0,286,29,61,183,77,225,53,219,215,74,210,25,221,12,
-257,225,206,225,111,104,110,104,112,114,114,125,115,138,117,150,117,160,115,183,108,202,97,217,82,226,64,230,53,229,43,225,35,219,29,210,27,198,28,193,31,188,35,184,40,181,46,180,54,181,60,184,63,188,67,191,71,192,81,190,89,184,95,174,99,162,100,148,99,136,98,121,96,107,94,94,91,85,21,0,73,0,170,121,171,121,168,111,166,100,164,88,163,76,162,65,164,46,170,27,180,11,194,0,214,-4,225,-3,236,0,244,5,250,14,252,26,251,32,248,37,244,41,239,43,233,44,225,43,219,40,213,34,209,33,199,35,191,40,185,50,181,64,180,85,180,98,181,111,183,122,186,132,189,141,213,-107,214,-103,216,-93,217,-89,217,-86,202,-54,166,-40,119,-30,75,-8,44,40,45,40,55,24,69,11,86,2,106,-2,131,-4,166,1,195,18,217,44,230,75,235,110,230,150,217,183,195,208,166,224,129,230,83,221,50,197,29,163,18,126,15,89,15,69,16,49,18,29,22,10,28,-6,65,-50,110,-71,154,-79,189,-88,205,-107,16383,16383,190,108,188,82,183,55,173,32,157,15,133,9,105,17,85,37,70,66,62,101,60,137,63,166,71,188,83,203,100,213,120,216,141,210,160,195,175,171,186,142,190,108,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,
-95,174,97,217,89,184,89,184,97,217,82,226,89,184,82,226,81,190,81,190,82,226,71,192,67,191,71,192,82,226,67,191,82,226,64,230,206,225,111,104,170,121,170,121,111,104,94,94,170,121,94,94,91,85,91,85,21,0,73,0,112,114,114,125,115,183,115,183,114,125,115,138,115,183,115,138,117,160,117,160,115,138,117,150,110,104,112,114,115,183,110,104,115,183,108,202,110,104,108,202,100,148,110,104,100,148,99,136,110,104,99,136,98,121,110,104,98,121,96,107,110,104,96,107,94,94,110,104,94,94,111,104,191,40,185,50,194,0,194,0,185,50,181,64,194,0,181,64,180,11,180,11,181,64,180,85,171,121,180,85,180,98,171,121,180,98,181,111,186,132,189,141,206,225,186,132,206,225,183,122,183,122,206,225,171,121,183,122,171,121,181,111,206,225,189,141,257,225,99,162,100,148,108,202,99,162,108,202,97,217,91,85,73,0,170,121,225,43,219,40,225,-3,225,-3,219,40,216,37,225,-3,216,37,214,-4,214,-4,216,37,213,34,214,-4,213,34,209,33,209,33,199,35,214,-4,214,-4,199,35,194,0,252,26,251,32,250,14,250,14,251,32,248,37,250,14,248,37,244,5,244,5,248,37,244,41,244,5,244,41,239,43,225,43,225,-3,233,44,233,44,225,-3,236,0,233,44,236,0,239,43,239,43,236,0,244,5,171,121,168,111,170,27,171,121,170,27,180,11,171,121,180,11,180,85,166,100,164,88,164,46,166,100,164,46,170,27,166,100,170,27,168,111,163,76,162,65,164,46,163,76,164,46,164,88,64,230,53,229,54,181,64,230,54,181,60,184,64,230,60,184,63,188,64,230,63,188,67,191,35,184,40,181,43,225,43,225,40,181,46,180,43,225,46,180,53,229,53,229,46,180,54,181,27,198,28,193,29,210,29,210,28,193,31,188,29,210,31,188,35,219,35,219,31,188,35,184,35,219,35,184,43,225,97,217,95,174,99,162,191,40,194,0,199,35,206,225,170,121,171,121,
-213,-107,214,-103,216,-93,217,-89,217,-86,202,-54,166,-40,119,-30,75,-8,44,40,45,40,55,24,69,11,86,2,106,-2,131,-4,166,1,195,18,217,44,230,75,235,110,230,150,217,183,195,208,166,224,129,230,83,221,50,197,29,163,18,126,15,89,15,69,16,49,18,29,22,10,28,-6,65,-50,110,-71,154,-79,189,-88,205,-107,16383,16383,190,108,188,82,183,55,173,32,157,15,133,9,105,17,85,37,70,66,62,101,60,137,63,166,71,188,83,203,100,213,120,216,141,210,160,195,175,171,186,142,190,108,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,74,180,77,205,82,229,88,251,97,271,108,286,121,299,134,308,149,315,164,318,180,320,194,319,207,316,219,311,231,305,242,296,256,281,268,261,277,237,284,210,286,180,16383,16383,287,157,285,126,279,98,271,73,260,52,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,51,91,73,82,98,
-28,-6,65,-50,44,40,44,40,65,-50,75,-8,75,-8,65,-50,110,-71,75,-8,110,-71,119,-30,119,-30,110,-71,154,-79,119,-30,154,-79,166,-40,166,-40,154,-79,189,-88,166,-40,189,-88,202,-54,202,-54,189,-88,205,-107,202,-54,205,-107,217,-86,217,-86,205,-107,213,-107,217,-86,213,-107,214,-103,55,24,69,11,60,137,60,137,63,166,50,197,50,197,63,166,71,188,50,197,71,188,83,221,83,221,71,188,83,203,83,221,83,203,129,230,129,230,83,203,100,213,129,230,100,213,120,216,120,216,141,210,129,230,129,230,141,210,166,224,133,9,106,-2,131,-4,133,9,131,-4,166,1,133,9,105,17,106,-2,86,2,106,-2,105,17,86,2,105,17,85,37,86,2,85,37,70,66,86,2,70,66,69,11,62,101,60,137,69,11,62,101,69,11,70,66,188,82,183,55,195,18,195,18,183,55,173,32,195,18,173,32,166,1,166,1,173,32,157,15,166,1,157,15,133,9,175,171,186,142,195,208,195,208,186,142,190,108,195,18,190,108,188,82,166,224,141,210,160,195,166,224,160,195,175,171,166,224,175,171,195,208,195,18,217,44,217,183,217,183,217,44,230,75,217,183,230,75,230,150,230,150,230,75,235,110,195,208,190,108,195,18,195,208,195,18,217,183,217,-86,214,-103,215,-98,217,-86,215,-98,216,-93,217,-86,216,-93,217,-89,16,49,18,29,18,126,18,126,18,29,22,10,18,126,22,10,29,163,29,163,22,10,28,-6,29,163,28,-6,44,40,18,126,15,89,15,69,18,126,15,69,16,49,44,40,45,40,50,197,50,197,45,40,55,24,50,197,55,24,60,137,50,197,29,163,44,40,
-196,56,183,41,169,29,155,22,139,17,123,16,100,21,82,35,68,56,60,82,57,112,155,112,155,127,57,127,61,151,69,175,82,196,99,210,119,215,142,212,158,203,169,191,177,177,183,162,191,162,184,230,176,230,174,224,173,222,171,220,167,220,160,221,152,223,144,226,133,229,118,230,82,223,53,205,31,178,17,145,12,108,17,74,30,44,50,18,78,1,112,-4,136,-1,157,5,176,17,191,33,204,52,23,169,37,184,50,195,65,203,80,208,97,209,119,204,138,190,151,169,159,143,162,113,65,113,65,98,162,98,159,73,150,50,137,29,120,15,100,9,77,13,61,21,50,34,42,48,36,63,28,63,36,-4,44,-4,44,-1,46,3,52,5,60,4,67,1,76,0,87,-3,101,-4,137,2,167,20,189,47,202,80,207,117,203,150,190,181,169,207,142,224,108,230,84,227,62,220,44,208,28,192,16,172,243,411,
-155,112,155,127,57,112,57,112,57,127,53,205,53,205,57,127,61,151,53,205,61,151,82,223,82,223,61,151,69,175,82,223,69,175,82,196,68,56,78,1,82,35,82,35,78,1,112,-4,82,35,112,-4,100,21,100,21,112,-4,123,16,139,17,123,16,136,-1,139,17,136,-1,157,5,60,82,57,112,50,18,60,82,50,18,78,1,60,82,78,1,68,56,12,108,17,74,17,145,17,145,17,74,30,44,17,145,30,44,31,178,31,178,30,44,50,18,31,178,50,18,53,205,53,205,50,18,57,112,158,203,169,191,160,221,160,221,169,191,167,220,171,220,167,220,169,191,171,220,169,191,177,177,184,230,176,230,177,177,184,230,177,177,183,162,184,230,183,162,191,162,177,177,176,230,175,227,177,177,175,227,174,224,177,177,174,224,173,222,177,177,173,222,171,220,133,229,119,215,142,212,133,229,142,212,144,226,144,226,142,212,158,203,144,226,158,203,152,223,152,223,158,203,160,221,204,52,196,56,191,33,191,33,196,56,183,41,191,33,183,41,176,17,176,17,183,41,169,29,176,17,169,29,157,5,157,5,169,29,155,22,157,5,155,22,139,17,123,16,112,-4,136,-1,118,230,82,223,82,196,118,230,82,196,99,210,118,230,99,210,119,215,118,230,119,215,133,229,57,127,57,112,155,127,
-350,0,350,9,337,12,327,17,319,26,311,38,304,55,180,337,171,337,68,93,52,58,41,34,31,20,19,13,4,9,4,0,104,0,104,9,91,10,81,12,74,16,70,22,69,30,69,34,70,38,71,43,72,47,74,51,97,108,228,108,248,61,254,45,256,38,257,31,257,23,256,21,255,18,251,14,247,12,239,10,232,10,223,9,223,0,16383,16383,220,128,105,128,162,266,108,183,108,294,109,301,111,306,114,310,119,311,126,312,188,312,202,311,217,307,230,300,242,287,251,267,252,263,253,258,255,254,256,250,256,247,268,247,266,331,9,331,9,321,30,320,44,315,52,308,56,295,57,275,57,56,56,37,52,24,43,16,29,11,9,9,9,0,169,0,209,4,242,16,267,35,283,60,289,91,280,132,256,159,223,174,185,181,146,183,16383,16383,108,163,
-52,58,70,22,69,30,69,30,69,34,68,93,68,93,69,34,70,38,68,93,70,38,71,43,243,11,239,10,350,0,350,0,239,10,232,10,350,0,232,10,223,9,72,47,74,51,171,337,171,337,74,51,97,108,171,337,97,108,105,128,105,128,97,108,228,108,105,128,228,108,220,128,220,128,228,108,304,55,220,128,304,55,180,337,256,21,255,18,350,0,350,0,255,18,253,16,350,0,253,16,251,14,251,14,247,12,350,0,350,0,247,12,243,11,257,26,350,0,327,17,257,26,327,17,319,26,257,26,319,26,311,38,257,26,311,38,304,55,257,26,304,55,257,31,304,55,228,108,248,61,304,55,248,61,251,53,304,55,251,53,254,45,304,55,254,45,256,38,304,55,256,38,257,31,171,337,105,128,162,266,171,337,162,266,220,128,171,337,220,128,180,337,68,93,52,58,69,30,72,47,171,337,68,93,72,47,68,93,71,43,337,12,327,17,350,0,337,12,350,0,350,9,257,23,256,21,350,0,257,23,350,0,257,26,104,0,104,9,91,10,104,0,91,10,81,12,104,0,81,12,41,34,104,0,41,34,31,20,104,0,31,20,19,13,104,0,19,13,4,9,104,0,4,9,4,0,41,34,81,12,74,16,41,34,74,16,70,22,41,34,70,22,52,58,350,0,223,9,223,0,
-108,183,108,294,109,301,111,306,114,310,119,311,126,312,188,312,202,311,217,307,230,300,242,287,251,267,252,263,253,258,255,254,256,250,256,247,268,247,266,331,9,331,9,321,30,320,44,315,52,308,56,295,57,275,57,56,56,37,52,24,43,16,29,11,9,9,9,0,169,0,209,4,242,16,267,35,283,60,289,91,280,132,256,159,223,174,185,181,146,183,16383,16383,108,163,138,163,166,161,191,154,212,141,226,120,231,89,226,59,212,39,190,27,162,21,131,19,120,20,113,22,110,26,108,33,108,41,212,180,226,183,237,187,245,190,253,195,260,200,267,208,273,218,277,229,280,240,281,252,275,281,259,303,233,318,196,328,150,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,178,0,218,4,251,17,276,37,292,63,297,94,296,107,293,120,289,131,282,142,273,151,264,159,255,165,244,171,230,175,212,179,16383,16383,108,188,108,296,109,302,110,307,113,310,116,311,121,312,141,312,173,310,198,302,215,290,226,273,229,250,226,228,217,210,203,198,
-52,24,43,16,169,0,169,0,43,16,29,11,169,0,29,11,9,9,44,315,52,308,266,331,266,331,52,308,119,311,266,331,119,311,126,312,266,331,126,312,188,312,266,331,188,312,202,311,217,307,230,300,266,331,266,331,230,300,242,287,266,331,242,287,251,267,251,267,252,263,266,331,266,331,252,263,253,258,266,331,253,258,255,254,266,331,255,254,256,250,266,331,256,250,256,247,266,331,256,247,268,247,57,275,108,33,108,41,108,183,108,163,138,163,108,183,138,163,146,183,146,183,138,163,166,161,146,183,166,161,185,181,185,181,166,161,191,154,185,181,191,154,223,174,223,174,191,154,212,141,223,174,212,141,226,120,57,275,108,41,108,294,57,275,108,294,109,301,57,275,109,301,111,306,57,275,111,306,114,310,57,275,114,310,56,295,119,311,52,308,56,295,119,311,56,295,114,310,30,320,44,315,266,331,30,320,266,331,9,331,30,320,9,331,9,321,231,89,226,59,242,16,242,16,226,59,212,39,242,16,212,39,209,4,209,4,212,39,190,27,209,4,190,27,169,0,169,0,190,27,162,21,169,0,162,21,131,19,131,19,120,20,169,0,169,0,120,20,113,22,169,0,113,22,56,37,56,37,113,22,57,56,231,89,242,16,256,159,256,159,242,16,267,35,256,159,267,35,280,132,280,132,267,35,283,60,280,132,283,60,289,91,226,120,231,89,256,159,226,120,256,159,223,174,57,56,113,22,110,26,57,56,110,26,108,33,57,56,108,33,57,275,169,0,9,9,9,0,52,24,169,0,56,37,266,331,202,311,217,307,
-212,180,226,183,237,187,245,190,253,195,260,200,267,208,273,218,277,229,280,240,281,252,275,281,259,303,233,318,196,328,150,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,178,0,218,4,251,17,276,37,292,63,297,94,296,107,293,120,289,131,282,142,273,151,264,159,255,165,244,171,230,175,212,179,16383,16383,108,188,108,296,109,302,110,307,113,310,116,311,121,312,141,312,173,310,198,302,215,290,226,273,229,250,226,228,217,210,203,198,182,191,155,188,16383,16383,108,168,139,168,163,167,182,164,199,158,217,148,225,141,232,131,237,120,239,108,240,94,239,82,237,69,233,58,228,48,221,41,208,31,195,25,180,21,162,19,140,19,127,20,119,22,113,26,109,33,108,41,272,242,270,331,9,331,9,321,28,320,41,315,48,307,52,294,53,275,53,57,52,37,48,24,41,16,28,12,9,9,9,0,150,0,150,9,130,12,117,16,109,24,105,37,104,56,104,302,106,307,109,310,114,312,192,312,206,311,221,307,234,300,246,286,255,267,256,262,258,256,259,250,260,245,260,242,323,-75,323,9,303,11,291,17,283,27,279,40,278,57,278,274,280,293,283,307,291,315,304,319,323,321,323,331,47,331,47,321,62,320,75,316,83,308,88,295,90,275,87,172,79,97,65,46,45,18,17,9,7,9,7,-75,19,-75,19,-72,20,-67,21,-60,23,-54,24,-49,32,-29,43,-15,56,-5,71,0,259,0,274,-5,287,-15,298,-29,306,-49,307,-54,308,-60,309,-67,310,-72,311,-75,16383,16383,228,41,227,33,225,27,222,22,217,20,
-52,24,43,16,178,0,178,0,43,16,30,11,178,0,30,11,9,9,56,295,57,275,113,310,56,295,113,310,150,331,150,331,113,310,116,311,150,331,116,311,121,312,150,331,121,312,141,312,150,331,141,312,173,310,208,31,195,25,218,4,218,4,195,25,180,21,218,4,180,21,178,0,178,0,180,21,162,19,178,0,162,19,140,19,140,19,127,20,178,0,178,0,127,20,119,22,178,0,119,22,56,37,56,37,119,22,57,56,259,303,233,318,237,187,237,187,233,318,229,250,237,187,229,250,226,228,237,187,226,228,226,183,226,183,226,228,217,210,226,183,217,210,212,180,212,180,217,210,203,198,212,180,203,198,212,179,212,179,203,198,217,148,212,179,217,148,230,175,230,175,217,148,225,141,155,188,163,167,182,191,182,191,163,167,182,164,182,191,182,164,203,198,203,198,182,164,199,158,203,198,199,158,217,148,237,69,233,58,251,17,251,17,233,58,228,48,251,17,228,48,221,41,221,41,208,31,218,4,163,167,155,188,139,168,139,168,155,188,108,188,139,168,108,188,108,168,109,33,108,41,57,275,109,33,57,275,57,56,57,56,119,22,113,26,57,56,113,26,109,33,273,151,264,159,276,37,276,37,264,159,255,165,276,37,255,165,251,17,251,17,255,165,244,171,251,17,244,171,240,94,240,94,239,82,251,17,251,17,239,82,237,69,244,171,230,175,232,131,244,171,232,131,237,120,244,171,237,120,239,108,244,171,239,108,240,94,233,318,196,328,198,302,233,318,198,302,215,290,233,318,215,290,226,273,233,318,226,273,229,250,196,328,150,331,173,310,196,328,173,310,198,302,57,275,108,41,108,296,57,275,108,296,109,302,57,275,109,302,110,307,57,275,110,307,113,310,150,331,9,331,30,320,150,331,30,320,44,316,150,331,44,316,52,308,150,331,52,308,56,295,267,208,273,218,275,281,275,281,273,218,277,229,275,281,277,229,281,252,281,252,277,229,280,240,245,190,253,195,259,303,259,303,253,195,260,200,259,303,260,200,275,281,275,281,260,200,267,208,293,120,289,131,292,63,293,120,292,63,297,94,293,120,297,94,296,107,282,142,273,151,276,37,282,142,276,37,292,63,282,142,292,63,289,131,221,41,218,4,251,17,259,303,237,187,245,190,30,320,9,331,9,321,230,175,225,141,232,131,178,0,9,9,9,0,52,24,178,0,56,37,
-272,242,270,331,9,331,9,321,28,320,41,315,48,307,52,294,53,275,53,57,52,37,48,24,41,16,28,12,9,9,9,0,150,0,150,9,130,12,117,16,109,24,105,37,104,56,104,302,106,307,109,310,114,312,192,312,206,311,221,307,234,300,246,286,255,267,256,262,258,256,259,250,260,245,260,242,323,-75,323,9,303,11,291,17,283,27,279,40,278,57,278,274,280,293,283,307,291,315,304,319,323,321,323,331,47,331,47,321,62,320,75,316,83,308,88,295,90,275,87,172,79,97,65,46,45,18,17,9,7,9,7,-75,19,-75,19,-72,20,-67,21,-60,23,-54,24,-49,32,-29,43,-15,56,-5,71,0,
-48,24,41,16,150,0,150,0,41,16,28,12,150,0,28,12,9,9,52,294,53,275,109,310,52,294,109,310,48,307,48,307,109,310,114,312,48,307,114,312,270,331,270,331,114,312,122,312,221,307,234,300,270,331,270,331,234,300,246,286,270,331,246,286,255,267,255,267,256,262,270,331,270,331,256,262,258,256,270,331,258,256,259,250,270,331,259,250,260,245,270,331,260,245,260,242,270,331,260,242,272,242,270,331,122,312,192,312,270,331,192,312,206,311,270,331,206,311,221,307,117,16,109,24,53,57,53,57,109,24,105,37,53,57,105,37,53,275,53,275,105,37,104,56,53,275,104,56,104,294,53,275,104,294,104,302,53,275,104,302,106,307,53,275,106,307,109,310,270,331,9,331,28,320,270,331,28,320,41,315,270,331,41,315,48,307,150,0,150,9,130,12,150,0,130,12,117,16,150,0,117,16,52,37,150,0,52,37,48,24,150,0,9,9,9,0,52,37,117,16,53,57,28,320,9,331,9,321,
-323,-75,323,9,303,11,291,17,283,27,279,40,278,57,278,274,280,293,283,307,291,315,304,319,323,321,323,331,47,331,47,321,62,320,75,316,83,308,88,295,90,275,87,172,79,97,65,46,45,18,17,9,7,9,7,-75,19,-75,19,-72,20,-67,21,-60,23,-54,24,-49,32,-29,43,-15,56,-5,71,0,259,0,274,-5,287,-15,298,-29,306,-49,307,-54,308,-60,309,-67,310,-72,311,-75,16383,16383,228,41,227,33,225,27,222,22,217,20,209,19,76,19,91,48,101,88,108,141,112,209,113,294,113,303,115,308,119,311,124,312,210,312,217,311,222,310,225,306,227,301,228,294,304,84,290,84,276,57,260,38,239,27,211,21,174,19,137,19,122,21,113,25,107,32,105,42,105,164,181,164,203,162,218,158,227,150,234,136,238,115,249,115,249,232,238,232,234,211,227,198,218,189,203,185,181,184,105,184,105,294,106,302,108,307,111,310,116,312,189,312,218,311,239,306,252,297,261,282,266,259,278,259,276,331,11,331,11,321,30,320,43,315,50,307,54,294,55,275,55,57,54,37,50,24,43,16,30,12,11,9,11,0,281,0,507,0,507,9,476,18,453,32,435,52,417,79,394,113,382,130,370,144,359,155,345,164,330,172,329,173,342,181,354,193,
-20,-67,21,-60,17,9,17,9,21,-60,23,-54,17,9,23,-54,24,-49,24,-49,32,-29,45,18,45,18,32,-29,43,-15,45,18,43,-15,56,-5,62,320,75,316,323,331,323,331,75,316,124,312,323,331,124,312,131,312,323,331,131,312,210,312,323,331,210,312,217,311,87,172,91,48,90,275,90,275,91,48,113,303,113,303,91,48,113,294,71,0,87,0,76,19,71,0,76,19,79,97,79,97,76,19,91,48,79,97,91,48,87,172,65,46,45,18,56,-5,65,46,56,-5,71,0,65,46,71,0,79,97,45,18,17,9,24,-49,17,9,7,9,19,-75,17,9,19,-75,19,-72,17,9,19,-72,20,-67,323,331,217,311,222,310,323,331,222,310,225,306,323,331,225,306,227,301,323,331,227,301,228,294,323,331,228,294,291,315,323,331,291,315,304,319,323,331,304,319,323,321,291,17,283,27,287,-15,287,-15,283,27,279,40,287,-15,279,40,274,-5,274,-5,279,40,278,57,274,-5,278,57,278,274,228,294,243,0,280,293,280,293,243,0,259,0,280,293,259,0,278,274,278,274,259,0,274,-5,283,307,291,315,228,294,283,307,228,294,280,293,113,294,91,48,101,88,113,294,101,88,108,141,113,294,108,141,112,209,124,312,83,308,119,311,119,311,83,308,88,295,119,311,88,295,115,308,115,308,88,295,90,275,115,308,90,275,113,303,47,331,47,321,62,320,47,331,62,320,323,331,308,-60,323,9,307,-54,307,-54,323,9,306,-49,298,-29,306,-49,303,11,298,-29,303,11,291,17,323,9,308,-60,309,-67,323,9,309,-67,310,-72,323,9,310,-72,311,-75,323,9,311,-75,323,-75,323,9,303,11,306,-49,209,19,76,19,87,0,209,19,87,0,243,0,209,19,243,0,217,20,243,0,228,294,228,41,243,0,228,41,227,33,243,0,227,33,225,27,243,0,225,27,222,22,243,0,222,22,217,20,19,-75,7,9,7,-75,291,17,287,-15,298,-29,124,312,75,316,83,308,
-304,84,290,84,276,57,260,38,239,27,211,21,174,19,137,19,122,21,113,25,107,32,105,42,105,164,181,164,203,162,218,158,227,150,234,136,238,115,249,115,249,232,238,232,234,211,227,198,218,189,203,185,181,184,105,184,105,294,106,302,108,307,111,310,116,312,189,312,218,311,239,306,252,297,261,282,266,259,278,259,276,331,11,331,11,321,30,320,43,315,50,307,54,294,55,275,55,57,54,37,50,24,43,16,30,12,11,9,11,0,281,0,507,0,507,9,476,18,453,32,435,52,417,79,394,113,382,130,370,144,359,155,345,164,330,172,329,173,342,181,354,193,364,209,373,228,382,251,388,266,394,280,401,293,410,301,419,305,425,302,430,295,435,286,443,279,457,276,466,278,473,283,478,289,481,297,482,305,480,315,475,324,467,331,456,336,442,338,419,335,401,325,388,309,376,290,367,267,356,239,345,216,331,197,310,185,280,181,280,293,283,307,291,315,304,319,325,321,325,331,186,331,186,321,
-50,24,43,16,281,0,281,0,43,16,30,12,281,0,30,12,11,9,54,294,55,275,111,310,54,294,111,310,50,307,50,307,111,310,116,312,50,307,116,312,276,331,276,331,116,312,123,312,50,24,122,21,54,37,54,37,122,21,113,25,54,37,113,25,55,57,55,57,113,25,107,32,55,57,107,32,55,275,55,275,107,32,105,42,55,275,105,42,105,294,105,184,105,164,181,164,105,184,181,164,181,184,203,185,181,184,203,162,203,185,203,162,218,189,218,189,203,162,218,158,218,189,218,158,227,198,227,198,218,158,227,150,227,198,227,150,234,211,234,211,227,150,234,136,234,211,234,136,238,232,238,232,234,136,238,115,238,232,238,115,249,115,276,331,123,312,189,312,276,331,189,312,218,311,276,331,218,311,239,306,276,331,239,306,252,297,276,331,252,297,261,282,276,331,261,282,266,259,276,331,266,259,278,259,55,275,105,294,106,302,55,275,106,302,108,307,55,275,108,307,111,310,276,331,11,331,30,320,276,331,30,320,43,315,276,331,43,315,50,307,260,38,239,27,281,0,281,0,239,27,211,21,281,0,211,21,174,19,281,0,304,84,290,84,281,0,290,84,276,57,281,0,276,57,260,38,281,0,174,19,156,19,281,0,156,19,137,19,281,0,137,19,122,21,281,0,122,21,50,24,281,0,11,9,11,0,30,320,11,331,11,321,181,184,181,164,203,162,238,232,249,115,249,232,
-507,0,507,9,476,18,453,32,435,52,417,79,394,113,382,130,370,144,359,155,345,164,330,172,329,173,342,181,354,193,364,209,373,228,382,251,388,266,394,280,401,293,410,301,419,305,425,302,430,295,435,286,443,279,457,276,466,278,473,283,478,289,481,297,482,305,480,315,475,324,467,331,456,336,442,338,419,335,401,325,388,309,376,290,367,267,356,239,345,216,331,197,310,185,280,181,280,293,283,307,291,315,304,319,325,321,325,331,186,331,186,321,206,320,220,315,227,307,230,294,231,275,231,181,203,185,182,197,167,216,154,239,143,267,134,290,123,309,109,325,91,335,68,338,54,336,43,331,35,324,30,315,28,305,29,297,32,289,37,283,44,278,53,276,67,279,75,286,80,295,85,302,91,305,100,301,109,293,115,280,122,266,128,251,137,228,146,209,156,193,168,181,181,173,180,172,165,164,152,155,140,144,129,130,117,113,94,79,75,52,57,32,35,18,4,9,4,0,99,0,109,10,120,23,131,40,144,60,158,84,177,116,190,138,201,152,213,159,231,161,231,55,230,36,228,23,222,16,210,11,193,9,193,0,323,0,323,9,305,12,292,16,284,23,281,36,280,55,280,161,297,159,309,152,320,138,333,116,352,84,367,60,380,40,391,23,401,10,411,0,177,175,201,180,222,192,240,208,251,229,256,253,252,281,239,304,217,322,185,334,142,338,131,338,121,337,111,335,100,333,89,330,83,328,67,324,60,322,54,321,49,322,44,324,40,328,37,332,35,338,25,338,23,220,35,220,43,253,56,280,76,301,101,314,131,319,156,316,176,308,191,294,201,277,204,257,204,245,201,232,196,219,188,207,175,196,165,191,155,187,143,185,127,183,104,183,104,163,128,163,146,161,160,158,172,153,184,146,194,138,202,129,209,118,213,105,215,91,211,64,201,43,183,28,159,18,128,15,105,17,85,23,65,33,44,47,23,65,14,57,32,35,54,17,80,4,109,-3,141,-6,160,-6,177,-3,193,0,208,5,223,13,239,25,253,39,264,55,270,74,272,95,267,121,252,142,230,158,204,169,177,174,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,212,331,212,321,230,319,242,315,251,309,255,299,257,285,105,82,105,274,106,294,110,307,118,315,131,319,150,321,150,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,148,9,131,11,118,16,110,23,106,33,105,48,257,252,257,62,256,41,252,26,245,17,
-75,52,57,32,99,0,99,0,57,32,35,18,99,0,35,18,4,9,75,286,80,295,91,335,91,335,80,295,85,302,91,335,85,302,91,305,91,305,100,301,109,325,109,325,100,301,109,293,109,325,109,293,115,280,44,278,53,276,54,336,54,336,53,276,67,279,54,336,67,279,68,338,68,338,67,279,75,286,68,338,75,286,91,335,28,305,29,297,30,315,30,315,29,297,32,289,30,315,32,289,35,324,35,324,32,289,37,283,35,324,37,283,43,331,43,331,37,283,44,278,43,331,44,278,54,336,115,280,122,266,123,309,123,309,122,266,128,251,123,309,128,251,134,290,134,290,128,251,137,228,134,290,137,228,143,267,143,267,137,228,146,209,143,267,146,209,154,239,154,239,146,209,156,193,154,239,156,193,167,216,167,216,156,193,168,181,167,216,168,181,182,197,182,197,168,181,181,173,182,197,181,173,190,138,190,138,181,173,180,172,228,23,222,16,323,0,323,0,222,16,210,11,323,0,210,11,193,9,304,319,325,321,325,331,304,319,325,331,291,315,291,315,325,331,230,294,291,315,230,294,231,275,231,161,231,275,231,181,231,161,284,23,281,36,323,0,323,9,305,12,323,0,305,12,292,16,323,0,292,16,230,36,323,0,230,36,228,23,280,55,280,181,231,161,280,55,231,161,281,36,231,55,230,36,292,16,231,55,292,16,284,23,231,55,284,23,231,161,280,161,297,159,280,181,280,181,280,274,231,161,231,161,280,274,280,293,231,161,280,293,283,307,283,307,291,315,231,275,283,307,231,275,231,161,325,331,186,331,206,320,325,331,206,320,220,315,325,331,220,315,227,307,325,331,227,307,230,294,453,32,435,52,411,0,411,0,435,52,417,79,411,0,417,79,401,10,401,10,417,79,394,113,401,10,394,113,391,23,391,23,394,113,382,130,391,23,382,130,380,40,380,40,382,130,370,144,380,40,370,144,367,60,367,60,370,144,359,155,367,60,359,155,352,84,352,84,359,155,345,164,352,84,345,164,333,116,333,116,345,164,330,172,333,116,330,172,329,173,476,18,453,32,411,0,476,18,411,0,507,0,476,18,507,0,507,9,320,138,329,173,331,197,331,197,329,173,342,181,331,197,342,181,345,216,345,216,342,181,354,193,345,216,354,193,356,239,356,239,354,193,364,209,356,239,364,209,367,267,367,267,364,209,373,228,367,267,373,228,376,290,376,290,373,228,382,251,376,290,382,251,388,309,388,309,382,251,388,266,388,309,388,266,401,325,401,325,388,266,394,280,401,325,394,280,401,293,310,185,280,181,297,159,310,185,297,159,309,152,310,185,309,152,320,138,310,185,320,138,331,197,442,338,419,335,425,302,425,302,419,335,419,305,410,301,419,305,419,335,410,301,419,335,401,325,457,276,466,278,467,331,467,331,466,278,473,283,467,331,473,283,475,324,475,324,473,283,478,289,475,324,478,289,480,315,480,315,478,289,481,297,480,315,481,297,482,305,430,295,435,286,442,338,442,338,435,286,443,279,442,338,443,279,456,336,456,336,443,279,457,276,456,336,457,276,467,331,190,138,201,152,203,185,203,185,201,152,213,159,203,185,213,159,231,181,231,181,213,159,231,161,99,0,109,10,117,113,117,113,109,10,120,23,117,113,120,23,129,130,129,130,120,23,131,40,129,130,131,40,140,144,140,144,131,40,144,60,140,144,144,60,152,155,152,155,144,60,158,84,152,155,158,84,165,164,165,164,158,84,177,116,165,164,177,116,180,172,180,172,177,116,190,138,94,79,75,52,99,0,94,79,99,0,117,113,109,325,91,335,91,305,109,325,115,280,123,309,99,0,4,9,4,0,182,197,190,138,203,185,333,116,329,173,320,138,442,338,425,302,430,295,401,325,401,293,410,301,206,320,186,331,186,321,323,0,193,9,193,0,
-177,175,201,180,222,192,240,208,251,229,256,253,252,281,239,304,217,322,185,334,142,338,131,338,121,337,111,335,100,333,89,330,83,328,67,324,60,322,54,321,49,322,44,324,40,328,37,332,35,338,25,338,23,220,35,220,43,253,56,280,76,301,101,314,131,319,156,316,176,308,191,294,201,277,204,257,204,245,201,232,196,219,188,207,175,196,165,191,155,187,143,185,127,183,104,183,104,163,128,163,146,161,160,158,172,153,184,146,194,138,202,129,209,118,213,105,215,91,211,64,201,43,183,28,159,18,128,15,105,17,85,23,65,33,44,47,23,65,14,57,32,35,54,17,80,4,109,-3,141,-6,160,-6,177,-3,193,0,208,5,223,13,239,25,253,39,264,55,270,74,272,95,267,121,252,142,230,158,204,169,177,174,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,212,331,212,321,230,319,242,315,251,309,255,299,257,285,105,82,105,274,106,294,110,307,118,315,131,319,150,321,150,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,148,9,131,11,118,16,110,23,106,33,105,48,257,252,257,62,256,41,252,26,245,17,232,12,213,9,213,0,248,424,246,436,242,445,235,452,227,456,219,458,211,456,208,453,206,450,205,445,207,438,213,434,225,430,227,425,226,418,221,413,212,408,199,406,180,405,162,406,149,408,140,413,135,418,134,425,136,430,148,434,154,438,156,445,156,450,154,453,151,456,148,457,
-40,328,43,253,44,324,44,324,43,253,56,280,44,324,56,280,49,322,49,322,56,280,54,321,60,322,54,321,56,280,60,322,56,280,76,301,201,232,196,219,201,180,201,180,196,219,188,207,201,180,188,207,177,175,177,175,188,207,175,196,177,175,175,196,177,174,177,174,175,196,172,153,172,153,175,196,165,191,172,153,165,191,160,158,160,158,165,191,155,187,160,158,155,187,146,161,146,161,155,187,143,185,146,161,143,185,128,163,128,163,143,185,127,183,128,163,127,183,104,183,23,65,32,35,44,47,44,47,32,35,54,17,44,47,54,17,65,33,65,33,54,17,80,4,65,33,80,4,85,23,85,23,80,4,109,-3,85,23,109,-3,105,17,105,17,109,-3,128,15,159,18,128,15,141,-6,159,18,141,-6,160,-6,131,319,121,337,111,335,131,319,111,335,101,314,131,319,131,338,121,337,101,314,111,335,100,333,101,314,100,333,89,330,101,314,89,330,83,328,101,314,83,328,76,301,76,301,83,328,75,326,76,301,75,326,67,324,76,301,67,324,60,322,156,316,176,308,185,334,185,334,176,308,191,294,185,334,191,294,217,322,217,322,191,294,201,277,217,322,201,277,204,257,204,257,204,245,222,192,222,192,204,245,201,232,222,192,201,232,201,180,156,316,185,334,142,338,156,316,142,338,131,338,156,316,131,338,131,319,217,322,222,192,239,304,239,304,222,192,240,208,239,304,240,208,252,281,252,281,240,208,251,229,252,281,251,229,256,253,204,257,222,192,217,322,177,174,172,153,184,146,184,146,194,138,204,169,204,169,194,138,202,129,204,169,202,129,209,118,267,121,252,142,253,39,267,121,253,39,264,55,267,121,264,55,270,74,267,121,270,74,272,95,160,-6,177,-3,183,28,183,28,177,-3,193,0,183,28,193,0,201,43,201,43,193,0,208,5,201,43,208,5,211,64,211,64,208,5,223,13,211,64,223,13,215,91,215,91,223,13,230,158,230,158,223,13,239,25,230,158,239,25,252,142,252,142,239,25,253,39,204,169,209,118,230,158,230,158,209,118,213,105,230,158,213,105,215,91,204,169,177,174,184,146,128,15,109,-3,141,-6,40,328,37,332,43,253,43,253,37,332,35,338,43,253,35,338,35,220,35,220,35,338,25,338,35,220,25,338,23,220,32,35,23,65,14,57,159,18,160,-6,183,28,128,163,104,183,104,163,
-352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,212,331,212,321,230,319,242,315,251,309,255,299,257,285,105,82,105,274,106,294,110,307,118,315,131,319,150,321,150,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,148,9,131,11,118,16,110,23,106,33,105,48,257,252,257,62,256,41,252,26,245,17,232,12,213,9,213,0,248,424,246,436,242,445,235,452,227,456,219,458,211,456,208,453,206,450,205,445,207,438,213,434,225,430,227,425,226,418,221,413,212,408,199,406,180,405,162,406,149,408,140,413,135,418,134,425,136,430,148,434,154,438,156,445,156,450,154,453,151,456,148,457,144,458,135,456,127,452,120,445,115,436,113,424,117,408,129,395,145,386,163,380,180,378,198,380,216,385,232,395,243,407,248,424,16383,16383,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,
-50,25,42,16,149,0,149,0,42,16,29,12,149,0,29,12,9,9,257,285,105,82,105,48,105,48,105,274,54,274,54,274,105,274,106,294,54,274,106,294,110,307,150,331,9,331,29,319,150,331,29,319,42,315,150,331,42,315,50,307,150,331,50,307,53,294,150,331,53,294,118,315,150,331,118,315,131,319,150,331,131,319,150,321,54,274,110,307,118,315,54,274,118,315,53,294,252,26,245,17,352,0,352,0,245,17,232,12,352,0,232,12,213,9,242,315,251,309,352,331,352,331,251,309,255,299,352,331,255,299,257,285,257,285,257,252,309,37,309,37,257,252,257,62,309,37,257,62,312,25,312,25,257,62,320,17,333,319,352,321,352,331,333,319,352,331,320,315,320,315,352,331,257,285,320,315,257,285,312,307,312,307,257,285,309,293,307,55,307,274,257,285,307,55,257,285,309,37,230,319,242,315,352,331,230,319,352,331,212,331,230,319,212,331,212,321,352,0,352,9,333,12,352,0,333,12,320,17,352,0,320,17,256,41,352,0,256,41,252,26,149,0,148,9,131,11,149,0,131,11,118,16,149,0,118,16,53,39,149,0,53,39,50,25,106,33,105,48,54,274,106,33,54,274,54,61,106,33,54,61,110,23,54,61,53,39,118,16,54,61,118,16,110,23,149,0,9,9,9,0,352,0,213,9,213,0,256,41,320,17,257,62,309,293,257,285,307,274,257,285,105,48,257,252,29,319,9,331,9,321,
-248,424,246,436,242,445,235,452,227,456,219,458,211,456,208,453,206,450,205,445,207,438,213,434,225,430,227,425,226,418,221,413,212,408,199,406,180,405,162,406,149,408,140,413,135,418,134,425,136,430,148,434,154,438,156,445,156,450,154,453,151,456,148,457,144,458,135,456,127,452,120,445,115,436,113,424,117,408,129,395,145,386,163,380,180,378,198,380,216,385,232,395,243,407,248,424,16383,16383,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,212,331,212,321,230,319,242,316,250,310,254,300,256,285,105,82,105,274,106,294,110,307,118,315,131,319,150,321,150,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,148,9,131,11,119,15,111,22,107,33,105,48,257,252,257,62,256,41,252,26,245,17,232,12,213,9,213,0,343,0,343,9,321,13,312,17,302,23,292,30,282,40,271,54,259,71,246,92,230,114,218,131,206,145,193,155,180,164,164,171,164,172,178,181,190,193,201,208,211,227,220,251,225,266,232,281,239,294,247,303,257,306,263,303,267,296,272,287,281,280,294,277,303,279,310,284,315,291,318,299,319,306,317,317,313,325,305,332,295,337,281,338,257,335,239,325,224,309,213,290,204,267,196,245,187,226,176,209,162,195,142,185,137,183,131,182,124,181,106,181,106,274,107,293,110,307,117,315,130,319,151,321,151,331,10,331,10,321,30,319,43,315,51,306,54,293,55,275,55,65,54,42,51,27,43,17,29,12,9,9,9,0,151,0,151,9,132,12,119,16,111,23,107,36,106,55,106,161,113,161,119,160,125,158,130,156,134,154,140,149,149,140,160,126,174,108,189,85,203,61,216,40,227,24,238,10,248,0,332,0,332,9,313,12,300,17,292,25,288,37,287,55,
-149,408,140,413,145,386,145,386,140,413,135,418,145,386,135,418,129,395,129,395,135,418,134,425,135,456,134,425,136,430,135,456,136,430,144,458,144,458,136,430,142,432,144,458,142,432,148,434,148,457,148,434,151,456,151,456,148,434,154,438,151,456,154,438,154,453,154,453,154,438,156,445,154,453,156,445,156,450,129,395,134,425,135,456,129,395,135,456,127,452,129,395,127,452,120,445,129,395,120,445,117,408,115,436,113,424,117,408,115,436,117,408,120,445,149,408,163,380,162,406,162,406,163,380,180,405,199,406,180,405,180,378,199,406,180,378,198,380,246,436,242,445,243,407,243,407,242,445,235,452,243,407,235,452,232,395,232,395,235,452,227,456,232,395,227,456,227,425,227,456,219,458,219,432,227,456,219,432,225,430,227,456,225,430,227,425,215,457,211,456,213,434,215,457,213,434,219,432,215,457,219,432,219,458,208,453,206,450,207,438,208,453,207,438,213,434,208,453,213,434,211,456,227,425,226,418,232,395,232,395,226,418,221,413,232,395,221,413,216,385,216,385,221,413,212,408,216,385,212,408,199,406,180,405,163,380,180,378,50,25,42,16,149,0,149,0,42,16,29,12,149,0,29,12,9,9,119,15,111,22,54,61,54,61,111,22,107,33,54,61,107,33,54,274,54,274,107,33,105,48,105,82,105,48,256,285,150,331,9,331,29,319,150,331,29,319,42,315,150,331,42,315,50,307,150,331,50,307,53,294,150,331,53,294,118,315,150,331,118,315,131,319,150,331,131,319,150,321,105,274,106,294,54,274,105,274,54,274,105,48,105,274,105,48,105,82,54,274,106,294,110,307,54,274,110,307,118,315,54,274,118,315,53,294,252,26,245,17,352,0,352,0,245,17,232,12,352,0,232,12,213,9,352,331,212,331,230,319,352,331,230,319,242,316,352,331,242,316,250,310,352,331,250,310,254,300,352,331,254,300,256,285,352,331,256,285,320,315,352,331,320,315,333,319,352,331,333,319,352,321,320,17,312,25,257,62,257,62,312,25,309,37,257,62,309,37,257,252,257,252,309,37,307,55,257,252,307,55,307,274,257,252,307,274,309,293,257,252,309,293,312,307,257,252,312,307,320,315,257,252,320,315,256,285,257,252,256,285,105,48,352,0,352,9,333,12,352,0,333,12,320,17,352,0,320,17,256,41,352,0,256,41,252,26,149,0,148,9,131,11,149,0,131,11,119,15,149,0,119,15,53,39,149,0,53,39,50,25,149,0,9,9,9,0,53,39,119,15,54,61,352,0,213,9,213,0,256,41,320,17,257,62,230,319,212,331,212,321,29,319,9,331,9,321,199,406,198,380,216,385,246,436,243,407,248,424,207,438,206,450,205,445,149,408,145,386,163,380,144,458,148,434,148,457,
-343,0,343,9,321,13,312,17,302,23,292,30,282,40,271,54,259,71,246,92,230,114,218,131,206,145,193,155,180,164,164,171,164,172,178,181,190,193,201,208,211,227,220,251,225,266,232,281,239,294,247,303,257,306,263,303,267,296,272,287,281,280,294,277,303,279,310,284,315,291,318,299,319,306,317,317,313,325,305,332,295,337,281,338,257,335,239,325,224,309,213,290,204,267,196,245,187,226,176,209,162,195,142,185,137,183,131,182,124,181,106,181,106,274,107,293,110,307,117,315,130,319,151,321,151,331,10,331,10,321,30,319,43,315,51,306,54,293,55,275,55,65,54,42,51,27,43,17,29,12,9,9,9,0,151,0,151,9,132,12,119,16,111,23,107,36,106,55,106,161,113,161,119,160,125,158,130,156,134,154,140,149,149,140,160,126,174,108,189,85,203,61,216,40,227,24,238,10,248,0,332,0,332,9,313,12,300,17,292,25,288,37,287,55,287,274,288,293,292,307,300,315,313,319,332,321,332,331,65,331,65,321,80,320,93,316,101,308,107,295,108,275,108,112,105,78,100,47,89,26,73,17,65,21,54,43,46,53,32,57,25,56,18,53,11,48,6,40,4,30,7,14,14,4,25,-2,39,-5,55,-6,92,2,114,27,126,60,130,97,131,131,131,292,132,300,133,305,136,309,141,311,148,312,219,312,226,311,231,309,234,305,236,300,237,292,237,63,236,41,232,26,225,17,212,12,193,9,193,0,435,0,435,9,417,12,404,17,397,25,393,38,392,56,392,275,393,294,397,307,404,316,417,320,435,321,435,331,335,331,225,80,109,331,11,331,11,321,31,319,45,315,53,307,57,294,58,275,58,75,57,47,53,29,44,18,30,12,9,9,9,0,127,0,127,9,107,12,94,18,85,29,
-151,0,151,9,132,12,151,0,132,12,119,16,151,0,119,16,54,42,151,0,54,42,51,27,151,0,51,27,43,17,151,0,43,17,29,12,151,0,29,12,9,9,151,0,9,9,9,0,55,275,107,36,106,55,106,181,106,161,113,161,55,275,106,55,106,181,106,181,113,161,116,181,116,181,113,161,119,160,116,181,119,160,124,181,124,181,119,160,125,158,124,181,125,158,131,182,131,182,125,158,130,156,131,182,130,156,134,154,134,154,140,149,137,183,137,183,140,149,142,185,162,195,142,185,149,140,162,195,149,140,160,126,55,65,54,42,119,16,55,65,119,16,111,23,55,65,111,23,107,36,55,65,107,36,55,275,151,331,10,331,30,319,151,331,30,319,43,315,151,331,43,315,51,306,151,331,51,306,54,293,151,331,54,293,117,315,151,331,117,315,130,319,151,331,130,319,151,321,106,274,107,293,55,275,106,274,55,275,106,181,55,275,107,293,110,307,55,275,110,307,117,315,55,275,117,315,54,293,137,183,131,182,134,154,196,245,187,226,190,193,196,245,190,193,201,208,196,245,201,208,204,267,190,193,187,226,178,181,178,181,187,226,176,209,178,181,176,209,164,172,164,172,176,209,162,195,164,172,162,195,164,171,164,171,162,195,160,126,164,171,160,126,174,108,225,266,232,281,239,325,239,325,232,281,239,294,239,325,239,294,257,335,257,335,239,294,247,303,257,335,247,303,257,306,257,306,263,303,257,335,257,335,263,303,281,338,204,267,211,227,213,290,213,290,211,227,220,251,213,290,220,251,224,309,224,309,220,251,225,266,224,309,225,266,239,325,332,11,321,13,343,0,343,0,321,13,312,17,343,0,312,17,248,0,248,0,312,17,302,23,248,0,302,23,292,30,292,30,282,40,248,0,248,0,282,40,271,54,248,0,271,54,259,71,193,155,189,85,203,61,193,155,203,61,206,145,206,145,203,61,216,40,206,145,216,40,218,131,218,131,216,40,227,24,218,131,227,24,230,114,230,114,227,24,238,10,230,114,238,10,246,92,246,92,238,10,248,0,246,92,248,0,259,71,272,287,281,280,281,338,281,338,281,280,294,277,281,338,294,277,295,337,295,337,294,277,303,279,295,337,303,279,305,332,305,332,303,279,310,284,305,332,310,284,313,325,313,325,310,284,315,291,313,325,315,291,317,317,317,317,315,291,318,299,317,317,318,299,319,306,281,338,263,303,267,296,281,338,267,296,272,287,180,164,164,171,174,108,180,164,174,108,189,85,180,164,189,85,193,155,142,185,140,149,149,140,332,11,343,0,343,9,211,227,204,267,201,208,30,319,10,331,10,321,
-332,0,332,9,313,12,300,17,292,25,288,37,287,55,287,274,288,293,292,307,300,315,313,319,332,321,332,331,65,331,65,321,80,320,93,316,101,308,107,295,108,275,108,112,105,78,100,47,89,26,73,17,65,21,54,43,46,53,32,57,25,56,18,53,11,48,6,40,4,30,7,14,14,4,25,-2,39,-5,55,-6,92,2,114,27,126,60,130,97,131,131,131,292,132,300,133,305,136,309,141,311,148,312,219,312,226,311,231,309,234,305,236,300,237,292,237,63,236,41,232,26,225,17,212,12,193,9,193,0,435,0,435,9,417,12,404,17,397,25,393,38,392,56,392,275,393,294,397,307,404,316,417,320,435,321,435,331,335,331,225,80,109,331,11,331,11,321,31,319,45,315,53,307,57,294,58,275,58,75,57,47,53,29,44,18,30,12,9,9,9,0,127,0,127,9,107,12,94,18,85,29,81,48,80,75,80,275,206,0,213,0,340,286,340,40,336,26,328,17,315,12,296,9,296,0,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,213,331,213,321,
-108,112,105,78,114,27,114,27,105,78,100,47,114,27,100,47,92,2,92,2,100,47,89,26,92,2,89,26,73,17,73,17,65,21,92,2,92,2,65,21,55,-6,107,295,108,275,136,309,107,295,136,309,101,308,101,308,136,309,141,311,101,308,141,311,332,331,332,331,141,311,148,312,232,26,225,17,332,0,332,0,225,17,212,12,332,0,212,12,193,9,332,331,148,312,219,312,332,331,219,312,226,311,332,331,226,311,231,309,332,331,231,309,234,305,332,331,234,305,236,300,332,331,236,300,237,292,332,331,237,292,300,315,332,331,300,315,313,319,332,331,313,319,332,321,287,55,287,274,237,292,237,292,287,274,288,293,237,292,288,293,292,307,300,17,292,25,237,63,237,63,292,25,288,37,237,63,288,37,237,292,131,292,132,300,114,27,131,292,114,27,126,60,131,292,126,60,130,97,131,292,130,97,131,131,108,275,108,145,114,27,108,275,114,27,132,300,108,275,132,300,133,305,108,275,133,305,136,309,332,331,65,331,80,320,332,331,80,320,93,316,332,331,93,316,101,308,332,0,332,9,313,12,332,0,313,12,300,17,332,0,300,17,236,41,332,0,236,41,232,26,55,-6,65,21,60,31,55,-6,60,31,54,43,55,-6,54,43,46,53,55,-6,46,53,39,-5,46,53,32,57,39,-5,39,-5,32,57,25,56,39,-5,25,56,25,-2,25,-2,25,56,18,53,25,-2,18,53,14,4,14,4,18,53,11,48,14,4,11,48,7,14,7,14,11,48,6,40,7,14,6,40,4,30,108,112,114,27,108,145,332,0,193,9,193,0,236,41,300,17,237,63,237,292,288,37,287,55,80,320,65,331,65,321,300,315,237,292,292,307,
-435,0,435,9,417,12,404,17,397,25,393,38,392,56,392,275,393,294,397,307,404,316,417,320,435,321,435,331,335,331,225,80,109,331,11,331,11,321,31,319,45,315,53,307,57,294,58,275,58,75,57,47,53,29,44,18,30,12,9,9,9,0,127,0,127,9,107,12,94,18,85,29,81,48,80,75,80,275,206,0,213,0,340,286,340,40,336,26,328,17,315,12,296,9,296,0,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,213,331,213,321,232,319,245,315,252,307,256,294,257,274,257,180,105,180,105,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,
-53,29,44,18,127,0,127,0,44,18,30,12,127,0,30,12,9,9,336,26,328,17,435,0,435,0,328,17,315,12,435,0,315,12,296,9,417,320,435,321,435,331,417,320,435,331,404,316,404,316,435,331,340,286,404,316,340,286,397,307,397,307,340,286,393,294,404,17,397,25,340,61,340,61,397,25,393,38,340,61,393,38,340,286,340,286,393,38,392,56,340,286,392,56,392,275,206,0,213,0,225,80,225,80,213,0,340,286,225,80,340,286,335,331,335,331,340,286,435,331,109,331,11,331,31,319,109,331,31,319,45,315,109,331,45,315,53,307,109,331,53,307,57,294,109,331,57,294,58,275,109,331,58,275,80,275,109,331,80,275,206,0,109,331,206,0,225,80,80,75,80,275,58,275,80,75,58,275,81,48,81,48,58,275,58,75,81,48,58,75,85,29,85,29,58,75,57,47,85,29,57,47,94,18,94,18,57,47,53,29,94,18,53,29,127,0,435,0,435,9,417,12,435,0,417,12,404,17,435,0,404,17,340,40,435,0,340,40,336,26,107,12,94,18,127,0,107,12,127,0,127,9,127,0,9,9,9,0,435,0,296,9,296,0,340,40,404,17,340,61,31,319,11,331,11,321,393,294,340,286,392,275,
-352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,213,331,213,321,232,319,245,315,252,307,256,294,257,274,257,180,105,180,105,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,110,25,106,38,105,56,105,157,257,157,257,62,256,41,252,26,245,17,232,12,213,9,213,0,345,166,337,222,316,269,281,306,236,330,181,338,127,330,82,307,47,271,26,224,18,167,26,109,47,61,82,24,127,1,181,-6,235,1,280,24,315,60,337,108,345,166,16383,16383,288,169,286,134,281,103,273,76,261,53,247,35,235,26,223,19,210,15,197,12,182,11,168,12,155,15,143,19,131,25,120,33,103,52,91,75,82,102,77,132,75,166,76,194,81,222,88,247,98,269,109,286,122,298,135,308,150,314,165,318,181,320,194,319,207,316,220,311,231,305,243,296,258,279,271,257,
-50,25,42,16,149,0,149,0,42,16,29,12,149,0,29,12,9,9,149,331,9,331,29,319,149,331,29,319,42,315,149,331,42,315,50,307,149,331,50,307,53,294,149,331,53,294,118,315,149,331,118,315,130,319,149,331,130,319,149,321,54,274,106,38,105,56,105,180,105,157,257,157,105,180,257,157,257,180,257,180,257,157,312,25,257,180,312,25,309,37,54,274,105,56,105,274,54,274,105,274,106,294,54,274,106,294,110,307,54,274,110,307,118,315,54,274,118,315,53,294,252,26,245,17,352,0,352,0,245,17,232,12,352,0,232,12,213,9,333,319,352,321,352,331,333,319,352,331,320,315,320,315,352,331,256,294,320,315,256,294,257,274,309,37,257,274,257,180,307,55,307,274,257,274,257,274,307,274,309,293,257,274,309,293,312,307,352,331,213,331,232,319,352,331,232,319,245,315,352,331,245,315,252,307,352,331,252,307,256,294,352,0,352,9,333,12,352,0,333,12,320,17,352,0,320,17,256,41,352,0,256,41,252,26,257,62,256,41,320,17,257,62,320,17,312,25,257,62,312,25,257,157,149,0,149,9,130,12,149,0,130,12,118,17,149,0,118,17,53,39,149,0,53,39,50,25,54,61,53,39,118,17,54,61,118,17,110,25,54,61,110,25,106,38,54,61,106,38,54,274,149,0,9,9,9,0,352,0,213,9,213,0,257,274,309,37,307,55,232,319,213,331,213,321,320,315,257,274,312,307,29,319,9,331,9,321,
-345,166,337,222,316,269,281,306,236,330,181,338,127,330,82,307,47,271,26,224,18,167,26,109,47,61,82,24,127,1,181,-6,235,1,280,24,315,60,337,108,345,166,16383,16383,288,169,286,134,281,103,273,76,261,53,247,35,235,26,223,19,210,15,197,12,182,11,168,12,155,15,143,19,131,25,120,33,103,52,91,75,82,102,77,132,75,166,76,194,81,222,88,247,98,269,109,286,122,298,135,308,150,314,165,318,181,320,194,319,207,316,220,311,231,305,243,296,258,279,271,257,280,231,286,201,288,169,353,0,353,9,333,12,321,17,313,25,309,37,308,55,308,274,309,293,313,307,321,315,334,319,353,321,353,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,110,25,106,38,105,56,105,300,107,306,111,309,116,311,124,312,238,312,246,311,251,309,255,306,257,300,257,62,256,41,253,26,246,17,233,12,213,9,213,0,9,331,9,321,28,319,40,315,47,307,51,294,51,39,48,25,41,16,29,12,9,9,
-150,314,181,338,135,308,135,308,181,338,127,330,135,308,127,330,122,298,122,298,127,330,109,286,98,269,109,286,127,330,98,269,127,330,82,307,82,102,82,24,91,75,91,75,82,24,127,1,91,75,127,1,103,52,103,52,127,1,120,33,131,25,120,33,127,1,131,25,127,1,181,-6,236,330,181,338,194,319,194,319,181,338,181,320,165,318,181,320,181,338,165,318,181,338,150,314,223,19,210,15,235,1,235,1,210,15,197,12,235,1,197,12,182,11,182,11,168,12,181,-6,181,-6,168,12,155,15,181,-6,155,15,143,19,207,316,220,311,236,330,236,330,220,311,231,305,236,330,231,305,243,296,243,296,258,279,281,306,281,306,258,279,271,257,281,306,271,257,280,231,281,103,273,76,280,24,280,24,273,76,261,53,280,24,261,53,247,35,247,35,235,26,280,24,280,24,235,26,235,1,345,166,337,222,337,108,337,108,337,222,316,269,337,108,316,269,315,60,315,60,316,269,288,169,286,201,288,169,316,269,286,201,316,269,281,306,286,201,281,306,280,231,281,306,236,330,243,296,315,60,288,169,286,134,315,60,286,134,281,103,315,60,281,103,280,24,182,11,181,-6,235,1,82,307,47,271,47,61,82,307,47,61,75,166,82,307,75,166,76,194,82,307,76,194,81,222,82,307,81,222,88,247,82,307,88,247,98,269,82,102,77,132,82,24,82,24,77,132,75,166,26,109,47,61,47,271,26,109,47,271,26,224,26,109,26,224,18,167,82,24,75,166,47,61,223,19,235,1,235,26,236,330,194,319,207,316,131,25,181,-6,143,19,
-353,0,353,9,333,12,321,17,313,25,309,37,308,55,308,274,309,293,313,307,321,315,334,319,353,321,353,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,110,25,106,38,105,56,105,300,107,306,111,309,116,311,124,312,238,312,246,311,251,309,255,306,257,300,257,62,256,41,253,26,246,17,233,12,213,9,213,0,9,331,9,321,28,319,40,315,47,307,51,294,51,39,48,25,41,16,29,12,9,9,9,0,150,0,150,9,129,12,115,16,107,24,104,37,103,56,103,146,110,145,115,145,120,144,132,144,161,145,184,147,204,153,221,161,239,175,249,185,257,197,263,210,266,225,267,240,266,254,263,268,258,280,252,291,243,300,227,310,209,319,187,325,162,329,134,331,16383,16383,103,294,103,301,105,306,108,310,113,311,120,312,156,309,
-50,25,42,16,149,0,149,0,42,16,29,12,149,0,29,12,9,9,42,315,50,307,353,331,353,331,50,307,116,311,353,331,116,311,124,312,353,331,124,312,238,312,353,331,238,312,246,311,253,26,246,17,353,0,353,0,246,17,233,12,353,0,233,12,213,9,353,331,246,311,251,309,353,331,251,309,255,306,353,331,255,306,257,300,353,331,257,300,257,292,353,331,257,292,321,315,353,331,321,315,334,319,353,331,334,319,353,321,308,55,308,274,257,292,257,292,308,274,309,293,257,292,309,293,313,307,321,17,313,25,257,62,257,62,313,25,309,37,257,62,309,37,257,292,118,17,110,25,54,61,54,61,110,25,106,38,54,61,106,38,54,274,54,274,106,38,105,56,54,274,105,56,105,291,54,274,105,291,105,300,54,274,105,300,107,306,54,274,107,306,111,309,54,274,111,309,53,294,116,311,50,307,53,294,116,311,53,294,111,309,29,319,42,315,353,331,29,319,353,331,9,331,29,319,9,331,9,321,353,0,353,9,333,12,353,0,333,12,321,17,353,0,321,17,256,41,353,0,256,41,253,26,149,0,149,9,130,12,149,0,130,12,118,17,149,0,118,17,53,39,149,0,53,39,50,25,149,0,9,9,9,0,53,39,118,17,54,61,353,0,213,9,213,0,256,41,321,17,257,62,257,292,309,37,308,55,321,315,257,292,313,307,
-9,331,9,321,28,319,40,315,47,307,51,294,51,39,48,25,41,16,29,12,9,9,9,0,150,0,150,9,129,12,115,16,107,24,104,37,103,56,103,146,110,145,115,145,120,144,132,144,161,145,184,147,204,153,221,161,239,175,249,185,257,197,263,210,266,225,267,240,266,254,263,268,258,280,252,291,243,300,227,310,209,319,187,325,162,329,134,331,16383,16383,103,294,103,301,105,306,108,310,113,311,120,312,156,309,182,302,200,287,210,266,213,238,210,213,199,192,182,177,158,167,128,164,118,164,113,165,109,165,103,166,311,65,289,47,269,32,248,23,226,17,201,15,180,17,161,21,143,28,126,38,112,51,99,68,89,88,82,112,77,140,76,171,81,219,96,260,121,291,154,311,196,318,215,316,232,311,248,304,263,293,276,280,283,272,289,263,294,252,299,240,302,224,314,224,310,338,300,338,297,332,289,324,284,322,278,321,273,322,266,324,258,326,244,330,232,333,208,337,196,338,185,338,157,336,131,330,106,320,83,305,63,286,47,266,35,243,26,218,20,191,18,162,20,133,26,106,36,80,49,57,66,37,85,22,107,9,131,0,157,-4,
-113,311,120,312,120,312,134,331,120,312,156,309,134,331,156,309,162,329,162,329,156,309,182,302,162,329,182,302,187,325,187,325,182,302,200,287,187,325,200,287,209,319,209,319,200,287,210,266,209,319,210,266,227,310,227,310,210,266,213,238,227,310,213,238,221,161,221,161,210,213,204,153,204,153,210,213,199,192,204,153,199,192,184,147,184,147,199,192,182,177,184,147,182,177,161,145,161,145,182,177,158,167,161,145,158,167,132,144,132,144,158,167,128,164,132,144,128,164,125,144,125,144,128,164,122,164,125,144,122,164,120,144,120,144,122,164,118,164,120,144,118,164,115,145,115,145,118,164,113,165,115,145,113,165,110,145,110,145,113,165,109,165,110,145,109,165,103,146,103,146,109,165,103,166,103,146,103,166,103,56,103,56,103,166,51,276,103,56,51,276,104,37,104,37,51,276,51,61,267,240,266,254,266,225,266,225,266,254,263,268,266,225,263,268,263,210,263,210,263,268,258,280,263,210,258,280,257,197,257,197,258,280,252,291,257,197,252,291,249,185,249,185,252,291,243,300,249,185,243,300,239,175,239,175,243,300,227,310,239,175,227,310,221,161,134,331,9,331,28,319,134,331,28,319,40,315,134,331,40,315,47,307,134,331,47,307,51,294,134,331,51,294,51,276,134,331,51,276,108,310,134,331,108,310,113,311,134,331,113,311,120,312,103,294,103,301,51,276,103,294,51,276,103,166,105,306,108,310,51,276,105,306,51,276,103,301,150,0,150,9,129,12,150,0,129,12,115,16,150,0,115,16,51,39,150,0,51,39,48,25,150,0,48,25,41,16,150,0,41,16,29,12,150,0,29,12,9,9,150,0,9,9,9,0,51,61,51,39,115,16,51,61,115,16,107,24,51,61,107,24,104,37,28,319,9,331,9,321,210,213,221,161,213,238,
-311,65,289,47,269,32,248,23,226,17,201,15,180,17,161,21,143,28,126,38,112,51,99,68,89,88,82,112,77,140,76,171,81,219,96,260,121,291,154,311,196,318,215,316,232,311,248,304,263,293,276,280,283,272,289,263,294,252,299,240,302,224,314,224,310,338,300,338,297,332,289,324,284,322,278,321,273,322,266,324,258,326,244,330,232,333,208,337,196,338,185,338,157,336,131,330,106,320,83,305,63,286,47,266,35,243,26,218,20,191,18,162,20,133,26,106,36,80,49,57,66,37,85,22,107,9,131,0,157,-4,184,-6,218,-4,249,3,277,16,301,34,320,56,296,246,292,331,18,331,15,246,27,246,33,274,42,292,54,303,73,309,100,310,130,310,130,61,129,39,125,25,117,16,104,12,83,9,83,0,229,0,229,9,208,11,194,16,186,23,182,36,181,55,181,310,210,310,237,309,256,303,269,292,277,274,284,246,347,331,243,331,243,322,254,320,263,316,269,312,273,306,274,299,273,292,271,284,268,273,263,260,257,245,204,118,132,245,123,262,110,288,107,297,106,303,107,309,112,314,119,318,129,321,142,322,142,331,7,331,7,322,15,320,27,316,37,310,42,305,46,300,51,294,61,278,181,67,172,53,163,41,154,33,146,28,
-66,37,77,140,76,171,76,171,83,305,66,37,66,37,83,305,63,286,66,37,63,286,49,57,49,57,63,286,47,266,49,57,47,266,36,80,36,80,47,266,35,243,36,80,35,243,26,106,26,106,35,243,26,218,26,106,26,218,20,133,20,133,26,218,20,191,20,133,20,191,18,162,82,112,85,22,89,88,89,88,85,22,107,9,89,88,107,9,99,68,99,68,107,9,112,51,126,38,112,51,131,0,126,38,131,0,143,28,143,28,131,0,157,-4,143,28,157,-4,161,21,161,21,157,-4,184,-6,161,21,184,-6,180,17,180,17,184,-6,201,15,226,17,201,15,218,-4,226,17,218,-4,249,3,77,140,66,37,85,22,77,140,85,22,82,112,112,51,107,9,131,0,258,326,263,293,266,324,266,324,263,293,276,280,266,324,276,280,273,322,273,322,276,280,278,321,284,322,278,321,283,272,284,322,283,272,289,263,278,321,276,280,283,272,232,333,232,311,244,330,244,330,232,311,248,304,244,330,248,304,251,328,251,328,248,304,263,293,251,328,263,293,258,326,220,335,208,337,215,316,220,335,215,316,232,311,220,335,232,311,232,333,208,337,196,338,215,316,215,316,196,338,196,318,154,311,196,318,157,336,154,311,157,336,131,330,314,224,310,338,302,224,302,224,310,338,300,338,302,224,300,338,299,240,299,240,300,338,297,332,299,240,297,332,294,252,294,252,297,332,293,328,294,252,293,328,289,263,289,263,293,328,289,324,289,263,289,324,284,322,320,56,311,65,301,34,301,34,311,65,289,47,301,34,289,47,277,16,277,16,289,47,269,32,277,16,269,32,249,3,249,3,269,32,248,23,249,3,248,23,226,17,201,15,184,-6,218,-4,196,318,196,338,185,338,196,318,185,338,157,336,76,171,81,219,83,305,83,305,81,219,96,260,83,305,96,260,106,320,106,320,96,260,121,291,106,320,121,291,131,330,131,330,121,291,154,311,
-296,246,292,331,18,331,15,246,27,246,33,274,42,292,54,303,73,309,100,310,130,310,130,61,129,39,125,25,117,16,104,12,83,9,83,0,229,0,229,9,208,11,194,16,186,23,182,36,181,55,181,310,210,310,237,309,256,303,269,292,277,274,284,246,347,331,243,331,243,322,254,320,263,316,269,312,273,306,274,299,273,292,271,284,268,273,263,260,257,245,204,118,132,245,123,262,110,288,107,297,106,303,107,309,112,314,119,318,129,321,142,322,142,331,7,331,7,322,15,320,27,316,37,310,42,305,46,300,
-292,331,18,331,73,309,292,331,73,309,100,310,292,331,100,310,130,310,292,331,130,310,181,310,292,331,181,310,210,310,292,331,210,310,237,309,292,331,237,309,256,303,292,331,256,303,269,292,292,331,269,292,277,274,292,331,277,274,284,246,292,331,284,246,296,246,194,16,186,23,130,61,130,61,186,23,182,36,130,61,182,36,130,310,130,310,182,36,181,55,130,310,181,55,181,310,18,331,15,246,27,246,18,331,27,246,33,274,18,331,33,274,42,292,18,331,42,292,54,303,18,331,54,303,73,309,229,0,229,9,208,11,229,0,208,11,194,16,229,0,194,16,129,39,229,0,129,39,125,25,229,0,125,25,117,16,229,0,117,16,104,12,229,0,104,12,83,9,229,0,83,9,83,0,129,39,194,16,130,61,
-347,331,243,331,243,322,254,320,263,316,269,312,273,306,274,299,273,292,271,284,268,273,263,260,257,245,204,118,132,245,123,262,110,288,107,297,106,303,107,309,112,314,119,318,129,321,142,322,142,331,7,331,7,322,15,320,27,316,37,310,42,305,46,300,51,294,61,278,181,67,172,53,163,41,154,33,146,28,138,27,136,27,133,28,131,29,127,30,124,32,118,35,108,39,104,40,99,41,92,40,85,37,80,32,77,26,76,20,78,10,84,3,93,-2,104,-5,117,-6,132,-4,147,0,161,9,175,22,188,40,194,51,202,65,210,81,219,100,228,122,291,272,300,289,310,302,321,312,333,319,347,322,218,290,219,301,223,310,232,316,247,320,269,321,269,331,116,331,116,321,138,320,152,317,161,311,165,302,166,290,166,280,124,276,84,263,50,241,27,209,19,165,24,128,41,97,69,72,107,57,158,51,166,51,166,37,164,27,158,19,148,14,134,10,116,9,116,0,269,0,269,9,248,11,233,14,224,19,219,27,218,38,218,51,230,51,265,56,302,69,334,91,357,123,366,165,357,209,333,241,300,263,260,276,218,280,16383,16383,217,262,251,256,278,240,296,216,307,188,311,159,305,128,291,103,270,85,244,74,217,70,16383,16383,167,70,135,75,108,88,89,107,78,132,74,159,78,189,91,216,111,240,136,256,
-21,318,27,316,142,331,142,331,27,316,32,313,142,331,32,313,37,310,37,310,42,305,142,331,142,331,42,305,46,300,142,331,46,300,51,294,61,278,181,67,107,297,61,278,107,297,106,303,106,303,107,309,61,278,61,278,107,309,112,314,61,278,112,314,56,286,142,331,51,294,56,286,142,331,56,286,112,314,142,331,112,314,119,318,142,331,119,318,129,321,142,331,129,321,142,322,15,320,21,318,142,331,15,320,142,331,7,331,15,320,7,331,7,322,133,28,131,29,132,-4,132,-4,131,29,127,30,132,-4,127,30,124,32,124,32,118,35,132,-4,132,-4,118,35,117,-6,181,67,172,53,175,22,175,22,172,53,163,41,175,22,163,41,161,9,161,9,163,41,154,33,161,9,154,33,147,0,147,0,154,33,146,28,147,0,146,28,138,27,138,27,136,27,147,0,147,0,136,27,133,28,147,0,133,28,132,-4,257,245,204,118,210,81,257,245,210,81,219,100,257,245,219,100,228,122,257,245,228,122,291,272,347,331,243,331,254,320,347,331,254,320,263,316,347,331,263,316,269,312,347,331,269,312,273,306,347,331,273,306,274,299,347,331,274,299,321,312,347,331,321,312,333,319,347,331,333,319,347,322,291,272,300,289,274,299,291,272,274,299,273,292,291,272,273,292,271,284,291,272,271,284,268,273,291,272,268,273,263,260,291,272,263,260,257,245,310,302,321,312,274,299,310,302,274,299,300,289,204,118,132,245,181,67,204,118,181,67,188,40,204,118,188,40,194,51,204,118,194,51,202,65,204,118,202,65,210,81,181,67,132,245,123,262,181,67,123,262,116,276,181,67,116,276,110,288,181,67,110,288,107,297,118,35,113,37,117,-6,117,-6,113,37,108,39,117,-6,108,39,104,-5,104,-5,108,39,104,40,104,-5,104,40,99,41,93,-2,104,-5,99,41,93,-2,99,41,92,40,93,-2,92,40,85,37,93,-2,85,37,84,3,80,32,77,26,78,10,80,32,78,10,84,3,80,32,84,3,85,37,78,10,77,26,76,20,181,67,175,22,188,40,254,320,243,331,243,322,
-218,290,219,301,223,310,232,316,247,320,269,321,269,331,116,331,116,321,138,320,152,317,161,311,165,302,166,290,166,280,124,276,84,263,50,241,27,209,19,165,24,128,41,97,69,72,107,57,158,51,166,51,166,37,164,27,158,19,148,14,134,10,116,9,116,0,269,0,269,9,248,11,233,14,224,19,219,27,218,38,218,51,230,51,265,56,302,69,334,91,357,123,366,165,357,209,333,241,300,263,260,276,218,280,16383,16383,217,262,251,256,278,240,296,216,307,188,311,159,305,128,291,103,270,85,244,74,217,70,16383,16383,167,70,135,75,108,88,89,107,78,132,74,159,78,189,91,216,111,240,136,256,167,262,352,0,352,9,337,12,326,16,316,22,306,32,296,46,200,184,272,272,289,292,303,305,316,314,330,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,262,301,260,296,256,290,250,282,243,272,187,202,165,234,151,255,139,272,130,286,125,297,123,306,124,312,127,316,132,319,139,320,147,320,161,321,161,331,11,331,11,321,28,319,43,312,58,299,77,276,102,242,155,164,77,66,57,42,42,26,30,17,18,12,4,9,4,0,121,0,121,9,105,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,99,57,109,70,169,145,216,74,225,60,232,48,238,38,241,31,242,25,241,20,
-269,321,269,321,247,320,247,320,269,321,269,331,247,320,269,331,232,316,232,316,269,331,166,290,232,316,166,290,223,310,223,310,166,290,167,262,219,27,167,262,167,70,219,27,167,70,224,19,224,19,167,70,166,51,224,19,166,51,166,37,218,38,217,70,167,262,167,262,217,70,217,262,167,262,217,262,218,290,218,290,217,262,218,280,219,301,223,310,167,262,219,301,167,262,218,290,166,290,269,331,165,302,269,331,116,331,138,320,269,331,138,320,152,317,269,331,152,317,161,311,269,331,161,311,165,302,91,216,111,240,124,276,124,276,111,240,136,256,124,276,136,256,166,280,166,280,136,256,167,262,166,280,167,262,166,290,84,263,50,241,74,159,84,263,74,159,78,189,84,263,78,189,91,216,84,263,91,216,124,276,19,165,24,128,27,209,27,209,24,128,41,97,27,209,41,97,50,241,50,241,41,97,69,72,50,241,69,72,74,159,334,91,311,159,305,128,334,91,305,128,302,69,302,69,305,128,291,103,302,69,291,103,270,85,307,188,311,159,333,241,333,241,311,159,334,91,333,241,334,91,357,209,357,209,334,91,357,123,357,209,357,123,366,165,300,263,260,276,278,240,300,263,278,240,296,216,300,263,296,216,307,188,300,263,307,188,333,241,251,256,278,240,260,276,251,256,260,276,218,280,251,256,218,280,217,262,218,51,230,51,244,74,244,74,230,51,265,56,244,74,265,56,270,85,270,85,265,56,302,69,218,38,167,262,219,27,218,38,218,51,217,70,269,0,269,9,248,11,269,0,248,11,233,14,269,0,233,14,166,37,269,0,166,37,164,27,269,0,164,27,158,19,269,0,158,19,148,14,269,0,148,14,134,10,269,0,134,10,116,9,269,0,116,9,116,0,158,51,166,51,167,70,158,51,167,70,135,75,158,51,135,75,108,88,158,51,108,88,107,57,74,159,69,72,78,132,78,132,69,72,107,57,78,132,107,57,89,107,89,107,107,57,108,88,166,37,233,14,224,19,217,70,218,51,244,74,138,320,116,331,116,321,
-352,0,352,9,337,12,326,16,316,22,306,32,296,46,200,184,272,272,289,292,303,305,316,314,330,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,262,301,260,296,256,290,250,282,243,272,187,202,165,234,151,255,139,272,130,286,125,297,123,306,124,312,127,316,132,319,139,320,147,320,161,321,161,331,11,331,11,321,28,319,43,312,58,299,77,276,102,242,155,164,77,66,57,42,42,26,30,17,18,12,4,9,4,0,121,0,121,9,105,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,99,57,109,70,169,145,216,74,225,60,232,48,238,38,241,31,242,25,241,20,237,16,232,14,225,12,217,11,204,9,204,0,348,-75,348,9,329,12,316,16,308,24,305,37,304,57,304,292,308,306,316,315,329,319,348,321,348,331,209,331,209,321,228,319,240,315,248,306,251,293,252,275,252,28,250,23,247,21,242,19,115,19,110,21,107,23,105,28,105,269,106,290,109,305,117,314,129,319,149,321,149,331,9,331,9,321,28,319,41,314,49,306,53,294,54,276,54,57,53,37,49,24,41,16,28,12,9,9,9,0,284,0,299,-5,312,-15,323,-29,331,-49,332,-54,333,-60,335,-67,335,-72,336,-75,320,0,320,9,301,12,288,16,280,24,276,37,275,57,275,269,276,291,280,306,288,315,301,319,320,321,320,331,186,331,186,321,204,319,214,316,221,309,223,299,224,283,224,174,216,170,
-30,17,121,0,42,26,42,26,121,0,88,17,42,26,88,17,57,42,57,42,88,17,84,21,57,42,84,21,83,26,83,26,84,31,77,66,77,66,84,31,87,38,77,66,87,38,155,164,155,164,87,38,92,46,155,164,92,46,99,57,102,242,155,164,125,297,102,242,125,297,123,306,123,306,124,312,102,242,155,164,99,57,109,70,109,70,169,145,155,164,155,164,169,145,165,234,155,164,165,234,151,255,77,66,57,42,83,26,161,331,11,331,28,319,161,331,28,319,43,312,161,331,43,312,58,299,161,331,58,299,132,319,161,331,132,319,139,320,161,331,139,320,147,320,161,331,147,320,161,321,132,319,58,299,127,316,127,316,58,299,77,276,127,316,77,276,124,312,124,312,77,276,102,242,260,296,256,290,272,272,272,272,256,290,250,282,272,272,250,282,243,272,243,272,187,202,200,184,200,184,187,202,216,74,200,184,216,74,296,46,296,46,216,74,225,60,296,46,225,60,232,48,348,331,229,331,243,320,348,331,243,320,253,319,348,331,253,319,259,316,348,331,259,316,262,311,348,331,262,311,263,305,348,331,263,305,316,314,348,331,316,314,330,319,348,331,330,319,348,321,263,305,272,272,289,292,263,305,289,292,303,305,263,305,303,305,316,314,262,301,260,296,272,272,262,301,272,272,263,305,243,272,200,184,272,272,237,16,232,14,352,0,352,0,232,14,225,12,352,0,225,12,217,11,242,25,352,0,326,16,242,25,326,16,316,22,242,25,316,22,306,32,242,25,306,32,296,46,242,25,296,46,241,31,296,46,232,48,238,38,296,46,238,38,241,31,187,202,165,234,169,145,187,202,169,145,216,74,337,12,326,16,352,0,337,12,352,0,352,9,241,20,237,16,352,0,241,20,352,0,242,25,204,9,204,0,352,0,204,9,352,0,217,11,155,164,151,255,139,272,155,164,139,272,130,286,155,164,130,286,125,297,121,0,121,9,105,11,121,0,105,11,95,13,121,0,95,13,88,17,18,12,4,9,121,0,18,12,121,0,30,17,121,0,4,9,4,0,243,320,229,331,229,321,28,319,11,331,11,321,
-348,-75,348,9,329,12,316,16,308,24,305,37,304,57,304,292,308,306,316,315,329,319,348,321,348,331,209,331,209,321,228,319,240,315,248,306,251,293,252,275,252,28,250,23,247,21,242,19,115,19,110,21,107,23,105,28,105,269,106,290,109,305,117,314,129,319,149,321,149,331,9,331,9,321,28,319,41,314,49,306,53,294,54,276,54,57,53,37,49,24,41,16,28,12,9,9,9,0,284,0,299,-5,312,-15,323,-29,331,-49,332,-54,333,-60,335,-67,335,-72,336,-75,320,0,320,9,301,12,288,16,280,24,276,37,275,57,275,269,276,291,280,306,288,315,301,319,320,321,320,331,186,331,186,321,204,319,214,316,221,309,223,299,224,283,224,174,216,170,204,166,190,161,173,158,155,156,132,158,116,165,105,176,99,193,97,216,97,273,98,294,101,307,109,315,121,319,139,321,139,331,2,331,2,321,21,319,34,315,41,307,45,293,46,273,46,211,50,178,62,155,80,142,104,136,133,134,157,136,178,140,197,145,212,152,224,157,224,57,223,37,
-49,24,41,16,268,0,268,0,41,16,28,12,268,0,28,12,9,9,149,331,9,331,28,319,149,331,28,319,41,314,149,331,41,314,49,306,149,331,49,306,53,294,149,331,53,294,117,314,149,331,117,314,129,319,149,331,129,319,149,321,110,21,107,23,54,57,54,57,107,23,105,28,54,57,105,28,54,276,54,276,105,28,105,34,54,276,105,34,105,269,54,276,105,269,106,290,54,276,106,290,109,305,54,276,109,305,117,314,54,276,117,314,53,294,329,319,348,321,348,331,329,319,348,331,316,315,316,315,348,331,251,293,316,315,251,293,252,275,268,0,252,275,252,35,268,0,252,35,252,28,316,16,308,24,312,-15,312,-15,308,24,305,37,312,-15,305,37,299,-5,299,-5,305,37,304,57,299,-5,304,57,304,270,252,275,268,0,304,292,304,292,268,0,284,0,304,292,284,0,304,270,304,270,284,0,299,-5,308,306,316,315,252,275,308,306,252,275,304,292,348,331,209,331,228,319,348,331,228,319,240,315,348,331,240,315,248,306,348,331,248,306,251,293,333,-60,348,9,332,-54,332,-54,348,9,331,-49,323,-29,331,-49,329,12,323,-29,329,12,316,16,348,9,333,-60,335,-67,348,9,335,-67,335,-72,348,9,335,-72,336,-75,348,9,336,-75,348,-75,348,9,329,12,331,-49,268,0,252,28,250,23,268,0,250,23,247,21,268,0,247,21,242,19,268,0,242,19,235,19,268,0,235,19,123,19,268,0,123,19,115,19,268,0,115,19,49,24,110,21,54,57,53,37,110,21,53,37,49,24,110,21,49,24,115,19,268,0,9,9,9,0,316,16,312,-15,323,-29,228,319,209,331,209,321,28,319,9,331,9,321,
-320,0,320,9,301,12,288,16,280,24,276,37,275,57,275,269,276,291,280,306,288,315,301,319,320,321,320,331,186,331,186,321,204,319,214,316,221,309,223,299,224,283,224,174,216,170,204,166,190,161,173,158,155,156,132,158,116,165,105,176,99,193,97,216,97,273,98,294,101,307,109,315,121,319,139,321,139,331,2,331,2,321,21,319,34,315,41,307,45,293,46,273,46,211,50,178,62,155,80,142,104,136,133,134,157,136,178,140,197,145,212,152,224,157,224,57,223,37,219,24,211,16,199,12,180,9,180,0,483,0,483,9,463,12,450,16,443,24,439,37,438,57,438,270,439,292,443,306,450,315,463,319,483,321,483,331,343,331,344,321,362,319,375,315,383,306,386,293,387,275,387,28,385,23,382,21,377,19,282,19,277,21,274,23,272,27,272,269,273,290,276,305,283,314,296,319,315,321,315,331,183,331,183,321,200,319,210,314,217,306,220,294,220,28,218,23,215,21,210,19,120,19,115,21,112,23,110,28,110,269,111,291,114,306,120,315,131,320,147,321,147,331,15,331,15,321,34,319,46,314,54,306,58,294,59,276,
-139,321,139,321,121,319,121,319,139,321,139,331,121,319,139,331,109,315,109,315,139,331,45,293,109,315,45,293,46,273,50,178,46,273,46,211,132,158,116,165,133,134,133,134,116,165,105,176,133,134,105,176,104,136,104,136,105,176,99,193,104,136,99,193,80,142,80,142,99,193,97,216,80,142,97,216,97,273,46,273,50,178,101,307,101,307,50,178,62,155,101,307,62,155,98,294,98,294,62,155,80,142,98,294,80,142,97,273,139,331,2,331,21,319,139,331,21,319,34,315,139,331,34,315,41,307,139,331,41,307,45,293,224,283,224,174,224,157,224,157,224,174,216,170,224,157,216,170,212,152,212,152,216,170,204,166,212,152,204,166,197,145,197,145,204,166,190,161,197,145,190,161,178,140,178,140,190,161,173,158,178,140,173,158,157,136,157,136,173,158,155,156,133,134,157,136,155,156,133,134,155,156,132,158,320,331,186,331,204,319,320,331,204,319,214,316,320,331,214,316,221,309,320,331,221,309,223,299,320,331,223,299,224,283,320,331,224,283,288,315,320,331,288,315,301,319,320,331,301,319,320,321,275,57,275,269,224,157,224,157,275,269,276,291,224,157,276,291,280,306,224,283,224,157,280,306,224,283,280,306,288,315,320,0,320,9,301,12,320,0,301,12,288,16,320,0,288,16,223,37,320,0,223,37,219,24,320,0,219,24,211,16,320,0,211,16,199,12,320,0,199,12,180,9,320,0,180,9,180,0,224,157,280,24,276,37,224,157,276,37,275,57,224,57,223,37,288,16,224,57,288,16,280,24,224,57,280,24,224,157,204,319,186,331,186,321,21,319,2,331,2,321,109,315,46,273,101,307,
-483,0,483,9,463,12,450,16,443,24,439,37,438,57,438,270,439,292,443,306,450,315,463,319,483,321,483,331,343,331,344,321,362,319,375,315,383,306,386,293,387,275,387,28,385,23,382,21,377,19,282,19,277,21,274,23,272,27,272,269,273,290,276,305,283,314,296,319,315,321,315,331,183,331,183,321,200,319,210,314,217,306,220,294,220,28,218,23,215,21,210,19,120,19,115,21,112,23,110,28,110,269,111,291,114,306,120,315,131,320,147,321,147,331,15,331,15,321,34,319,46,314,54,306,58,294,59,276,59,57,58,37,54,24,46,16,33,12,15,9,15,0,483,-75,483,9,463,12,450,16,443,24,439,37,438,57,438,270,439,292,443,306,450,315,463,319,483,321,483,331,343,331,344,321,362,319,375,315,383,306,386,293,387,275,387,28,385,23,382,21,377,19,282,19,277,21,274,23,272,27,272,269,273,290,276,305,283,314,296,319,315,321,315,331,183,331,183,321,200,319,210,314,217,306,220,294,220,28,218,23,215,21,210,19,120,19,115,21,112,23,110,28,110,269,111,291,114,306,120,315,131,320,147,321,147,331,15,331,15,321,34,319,46,314,54,306,58,294,59,276,59,57,58,37,54,24,46,16,33,12,15,9,15,0,
-59,57,58,37,115,21,115,21,58,37,54,24,115,21,54,24,120,19,120,19,54,24,46,16,120,19,46,16,483,0,483,0,46,16,33,12,483,0,33,12,15,9,147,331,15,331,34,319,147,331,34,319,46,314,147,331,46,314,54,306,147,331,54,306,58,294,147,331,58,294,120,315,147,331,120,315,131,320,147,331,131,320,147,321,115,21,112,23,59,57,59,57,112,23,110,28,59,57,110,28,59,276,59,276,110,28,110,34,59,276,110,34,110,269,59,276,110,269,111,291,59,276,111,291,114,306,59,276,114,306,120,315,59,276,120,315,58,294,296,319,315,321,315,331,296,319,315,331,283,314,283,314,315,331,220,294,283,314,220,294,220,276,272,27,220,276,220,35,272,27,220,35,274,23,274,23,220,35,277,21,272,33,272,269,220,276,220,276,272,269,273,290,220,276,273,290,276,305,315,331,183,331,200,319,315,331,200,319,210,314,315,331,210,314,217,306,315,331,217,306,220,294,463,319,483,321,483,331,463,319,483,331,450,315,450,315,483,331,386,293,450,315,386,293,387,275,439,37,387,275,387,35,439,37,387,35,443,24,443,24,387,35,450,16,438,57,438,270,387,275,387,275,438,270,439,292,387,275,439,292,443,306,483,331,343,331,344,321,483,331,344,321,362,319,483,331,362,319,375,315,483,331,375,315,383,306,483,331,383,306,386,293,483,0,483,9,463,12,483,0,463,12,450,16,483,0,450,16,387,35,483,0,387,35,387,28,483,0,387,28,385,23,483,0,385,23,382,21,483,0,382,21,377,19,483,0,377,19,371,19,483,0,371,19,289,19,483,0,289,19,282,19,483,0,282,19,218,23,483,0,218,23,215,21,483,0,215,21,210,19,483,0,210,19,203,19,483,0,203,19,127,19,483,0,127,19,120,19,282,19,277,21,220,35,282,19,220,35,220,28,282,19,220,28,218,23,483,0,15,9,15,0,220,276,272,27,272,33,387,275,439,37,438,57,450,315,387,275,443,306,200,319,183,331,183,321,283,314,220,276,276,305,34,319,15,331,15,321,
-483,-75,483,9,463,12,450,16,443,24,439,37,438,57,438,270,439,292,443,306,450,315,463,319,483,321,483,331,343,331,344,321,362,319,375,315,383,306,386,293,387,275,387,28,385,23,382,21,377,19,282,19,277,21,274,23,272,27,272,269,273,290,276,305,283,314,296,319,315,321,315,331,183,331,183,321,200,319,210,314,217,306,220,294,220,28,218,23,215,21,210,19,120,19,115,21,112,23,110,28,110,269,111,291,114,306,120,315,131,320,147,321,147,331,15,331,15,321,34,319,46,314,54,306,58,294,59,276,59,57,58,37,54,24,46,16,33,12,15,9,15,0,419,0,433,-5,446,-15,457,-29,465,-49,467,-55,468,-61,469,-68,470,-73,470,-75,171,183,171,274,172,293,177,307,186,315,200,319,219,321,219,331,10,331,7,246,18,246,25,274,33,293,45,304,63,309,90,310,120,310,120,56,119,37,114,24,106,16,92,11,72,9,72,0,231,0,271,4,305,15,330,34,346,59,352,91,345,126,327,153,299,170,262,180,219,183,16383,16383,171,163,204,163,231,161,256,154,276,141,289,120,294,89,289,59,275,39,253,27,226,21,195,19,185,20,178,22,174,26,171,33,171,41,432,0,432,9,414,12,401,17,393,25,389,38,388,57,388,274,389,294,393,307,401,315,414,319,432,321,432,331,292,331,292,321,312,319,325,315,332,307,336,294,337,274,337,61,336,39,333,25,325,16,312,12,292,9,292,0,
-59,57,58,37,115,21,115,21,58,37,54,24,115,21,54,24,120,19,120,19,54,24,46,16,120,19,46,16,402,0,402,0,46,16,33,12,402,0,33,12,15,9,147,331,15,331,34,319,147,331,34,319,46,314,147,331,46,314,54,306,147,331,54,306,58,294,147,331,58,294,120,315,147,331,120,315,131,320,147,331,131,320,147,321,115,21,112,23,59,57,59,57,112,23,110,28,59,57,110,28,59,276,59,276,110,28,110,34,59,276,110,34,110,269,59,276,110,269,111,291,59,276,111,291,114,306,59,276,114,306,120,315,59,276,120,315,58,294,296,319,315,321,315,331,296,319,315,331,283,314,283,314,315,331,220,294,283,314,220,294,220,276,272,27,220,276,220,35,272,27,220,35,274,23,274,23,220,35,277,21,272,33,272,269,220,276,220,276,272,269,273,290,220,276,273,290,276,305,315,331,183,331,200,319,315,331,200,319,210,314,315,331,210,314,217,306,315,331,217,306,220,294,463,319,483,321,483,331,463,319,483,331,450,315,450,315,483,331,386,293,450,315,386,293,387,275,402,0,387,275,387,35,402,0,387,35,387,28,450,16,443,24,446,-15,446,-15,443,24,439,37,446,-15,439,37,433,-5,433,-5,439,37,438,57,433,-5,438,57,438,270,387,275,402,0,439,292,439,292,402,0,419,0,439,292,419,0,438,270,438,270,419,0,433,-5,443,306,450,315,387,275,443,306,387,275,439,292,483,331,343,331,344,321,483,331,344,321,362,319,483,331,362,319,375,315,483,331,375,315,383,306,483,331,383,306,386,293,468,-61,483,9,467,-55,467,-55,483,9,465,-49,457,-29,465,-49,463,12,457,-29,463,12,450,16,483,9,468,-61,469,-68,483,9,469,-68,470,-73,483,9,470,-73,470,-75,483,9,470,-75,483,-75,483,9,463,12,465,-49,402,0,387,28,385,23,402,0,385,23,382,21,402,0,382,21,377,19,402,0,377,19,371,19,402,0,371,19,289,19,402,0,289,19,282,19,402,0,282,19,220,28,402,0,220,28,218,23,402,0,218,23,215,21,402,0,215,21,210,19,402,0,210,19,203,19,402,0,203,19,127,19,402,0,127,19,120,19,220,35,220,28,282,19,220,35,282,19,277,21,402,0,15,9,15,0,220,276,272,27,272,33,450,16,446,-15,457,-29,200,319,183,331,183,321,283,314,220,276,276,305,34,319,15,331,15,321,
-171,183,171,274,172,293,177,307,186,315,200,319,219,321,219,331,10,331,7,246,18,246,25,274,33,293,45,304,63,309,90,310,120,310,120,56,119,37,114,24,106,16,92,11,72,9,72,0,231,0,271,4,305,15,330,34,346,59,352,91,345,126,327,153,299,170,262,180,219,183,16383,16383,171,163,204,163,231,161,256,154,276,141,289,120,294,89,289,59,275,39,253,27,226,21,195,19,185,20,178,22,174,26,171,33,171,41,432,0,432,9,414,12,401,17,393,25,389,38,388,57,388,274,389,294,393,307,401,315,414,319,432,321,432,331,292,331,292,321,312,319,325,315,332,307,336,294,337,274,337,61,336,39,333,25,325,16,312,12,292,9,292,0,16383,16383,108,183,108,274,110,293,115,307,123,315,137,319,156,321,156,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,170,0,210,4,
-114,24,106,16,231,0,231,0,106,16,92,11,231,0,92,11,72,9,177,307,186,315,120,310,120,310,186,315,219,331,120,310,219,331,90,310,63,309,90,310,219,331,63,309,219,331,10,331,200,319,219,321,219,331,200,319,219,331,186,315,120,310,171,33,171,41,171,183,171,163,204,163,171,183,204,163,219,183,219,183,204,163,231,161,219,183,231,161,262,180,262,180,231,161,256,154,262,180,256,154,276,141,120,310,171,41,171,274,120,310,171,274,172,293,120,310,172,293,177,307,10,331,7,246,18,246,10,331,18,246,25,274,10,331,25,274,33,293,10,331,33,293,45,304,10,331,45,304,63,309,294,89,289,59,305,15,305,15,289,59,275,39,305,15,275,39,271,4,271,4,275,39,253,27,271,4,253,27,231,0,231,0,253,27,226,21,231,0,226,21,195,19,195,19,185,20,231,0,231,0,185,20,178,22,231,0,178,22,119,37,119,37,178,22,120,56,299,170,294,89,305,15,299,170,305,15,327,153,327,153,305,15,330,34,327,153,330,34,345,126,345,126,330,34,346,59,345,126,346,59,352,91,299,170,262,180,276,141,299,170,276,141,289,120,299,170,289,120,294,89,120,56,178,22,174,26,120,56,174,26,171,33,120,56,171,33,120,310,231,0,72,9,72,0,114,24,231,0,119,37,
-432,0,432,9,414,12,401,17,393,25,389,38,388,57,388,274,389,294,393,307,401,315,414,319,432,321,432,331,292,331,292,321,312,319,325,315,332,307,336,294,337,274,337,61,336,39,333,25,325,16,312,12,292,9,292,0,16383,16383,108,183,108,274,110,293,115,307,123,315,137,319,156,321,156,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,170,0,210,4,244,15,268,34,284,59,290,91,283,126,265,153,238,170,201,180,158,183,16383,16383,108,163,142,163,170,161,194,154,214,141,227,120,232,89,227,59,214,39,193,27,166,21,134,19,123,20,115,22,111,26,109,33,108,41,108,183,108,274,110,293,115,307,123,315,137,319,156,321,156,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,170,0,210,4,243,15,268,34,284,59,289,91,283,126,265,153,237,170,201,180,158,183,16383,16383,108,163,142,163,170,161,194,154,214,141,227,120,232,89,227,59,213,39,193,27,166,21,134,19,123,20,115,22,111,26,109,33,108,41,26,338,23,224,36,224,39,239,42,252,46,263,51,272,57,280,71,293,85,304,101,311,118,316,136,318,173,312,203,293,226,265,241,228,248,184,103,184,103,161,248,161,248,142,246,124,242,108,237,92,231,78,218,57,201,39,181,26,
-432,321,432,321,414,319,414,319,432,321,432,331,414,319,432,331,401,315,401,315,432,331,336,294,401,315,336,294,337,274,389,38,337,274,337,61,389,38,337,61,393,25,393,25,337,61,401,17,388,57,388,274,337,274,337,274,388,274,389,294,337,274,389,294,393,307,432,331,292,331,312,319,432,331,312,319,325,315,432,331,325,315,332,307,432,331,332,307,336,294,432,0,432,9,414,12,432,0,414,12,401,17,432,0,401,17,336,39,432,0,336,39,333,25,432,0,333,25,325,16,432,0,325,16,312,12,432,0,312,12,292,9,432,0,292,9,292,0,52,24,43,16,170,0,170,0,43,16,30,11,170,0,30,11,9,9,156,331,9,331,30,320,156,331,30,320,44,316,156,331,44,316,52,308,156,331,52,308,56,295,156,331,56,295,123,315,156,331,123,315,137,319,156,331,137,319,156,321,57,275,109,33,108,41,108,183,108,163,142,163,108,183,142,163,158,183,158,183,142,163,170,161,158,183,170,161,201,180,201,180,170,161,194,154,201,180,194,154,214,141,57,275,108,41,108,274,57,275,108,274,110,293,57,275,110,293,115,307,57,275,115,307,123,315,57,275,123,315,56,295,232,89,227,59,244,15,244,15,227,59,214,39,244,15,214,39,210,4,210,4,214,39,193,27,210,4,193,27,170,0,170,0,193,27,166,21,170,0,166,21,134,19,134,19,123,20,170,0,170,0,123,20,115,22,170,0,115,22,56,37,56,37,115,22,57,56,238,170,232,89,244,15,238,170,244,15,265,153,265,153,244,15,268,34,265,153,268,34,283,126,283,126,268,34,284,59,283,126,284,59,290,91,238,170,201,180,214,141,238,170,214,141,227,120,238,170,227,120,232,89,57,56,115,22,111,26,57,56,111,26,109,33,57,56,109,33,57,275,170,0,9,9,9,0,52,24,170,0,56,37,30,320,9,331,9,321,336,39,401,17,337,61,337,274,389,38,388,57,312,319,292,331,292,321,401,315,337,274,393,307,
-108,183,108,274,110,293,115,307,123,315,137,319,156,321,156,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,170,0,210,4,243,15,268,34,284,59,289,91,283,126,265,153,237,170,201,180,158,183,16383,16383,108,163,142,163,170,161,194,154,214,141,227,120,232,89,227,59,213,39,193,27,166,21,134,19,123,20,115,22,111,26,109,33,108,41,26,338,23,224,36,224,39,239,42,252,46,263,51,272,57,280,71,293,85,304,101,311,118,316,136,318,173,312,203,293,226,265,241,228,248,184,103,184,103,161,248,161,248,142,246,124,242,108,237,92,231,78,218,57,201,39,181,26,158,18,131,15,107,17,86,23,65,32,45,46,25,65,15,55,33,33,55,16,80,3,109,-4,141,-6,168,-4,194,0,218,9,240,22,258,37,275,57,288,79,298,104,304,131,
-52,24,43,16,170,0,170,0,43,16,30,11,170,0,30,11,9,9,156,331,9,331,30,320,156,331,30,320,44,316,156,331,44,316,52,308,156,331,52,308,56,295,156,331,56,295,123,315,156,331,123,315,137,319,156,331,137,319,156,321,57,275,109,33,108,41,108,183,108,163,142,163,108,183,142,163,158,183,158,183,142,163,170,161,158,183,170,161,201,180,201,180,170,161,194,154,201,180,194,154,214,141,57,275,108,41,108,274,57,275,108,274,110,293,57,275,110,293,115,307,57,275,115,307,123,315,57,275,123,315,56,295,57,56,56,37,115,22,115,22,56,37,170,0,115,22,170,0,123,20,123,20,170,0,134,19,166,21,134,19,170,0,166,21,170,0,193,27,193,27,170,0,210,4,193,27,210,4,213,39,213,39,210,4,243,15,213,39,243,15,227,59,227,59,243,15,232,89,237,170,232,89,243,15,237,170,243,15,265,153,265,153,243,15,268,34,265,153,268,34,283,126,283,126,268,34,284,59,283,126,284,59,289,91,237,170,201,180,214,141,237,170,214,141,227,120,237,170,227,120,232,89,57,56,115,22,111,26,57,56,111,26,109,33,57,56,109,33,57,275,170,0,9,9,9,0,52,24,170,0,56,37,30,320,9,331,9,321,
-26,338,23,224,36,224,39,239,42,252,46,263,51,272,57,280,71,293,85,304,101,311,118,316,136,318,173,312,203,293,226,265,241,228,248,184,103,184,103,161,248,161,248,142,246,124,242,108,237,92,231,78,218,57,201,39,181,26,158,18,131,15,107,17,86,23,65,32,45,46,25,65,15,55,33,33,55,16,80,3,109,-4,141,-6,168,-4,194,0,218,9,240,22,258,37,275,57,288,79,298,104,304,131,306,160,305,188,299,215,290,240,278,263,263,284,244,304,222,319,198,330,173,336,147,338,136,338,124,337,113,336,101,333,90,330,83,328,75,326,61,322,55,321,50,322,45,324,41,328,38,332,36,338,105,180,105,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,110,25,106,38,105,56,105,157,149,157,157,102,177,57,207,22,245,0,291,-6,337,1,376,24,405,60,425,108,431,166,425,222,406,269,377,306,338,330,291,338,245,331,207,310,178,276,158,232,149,180,16383,16383,377,169,376,134,373,103,367,76,359,53,347,35,337,26,327,19,315,15,303,12,291,11,279,12,268,15,257,19,247,25,237,33,224,52,214,75,208,102,204,132,203,166,204,194,207,222,211,247,
-36,338,36,338,38,332,38,332,36,338,39,239,38,332,39,239,41,328,41,328,39,239,42,252,41,328,42,252,45,324,45,324,42,252,46,263,45,324,46,263,50,322,50,322,46,263,51,272,50,322,51,272,55,321,55,321,51,272,57,280,55,321,57,280,61,322,36,224,39,239,36,338,36,224,36,338,26,338,36,224,26,338,23,224,75,326,68,324,71,293,71,293,68,324,61,322,71,293,61,322,57,280,90,330,83,328,85,304,90,330,85,304,101,311,90,330,101,311,101,333,75,326,71,293,85,304,75,326,85,304,83,328,248,142,246,124,258,37,258,37,246,124,242,108,258,37,242,108,240,22,240,22,242,108,237,92,240,22,237,92,231,78,231,78,218,57,218,9,218,9,218,57,201,39,218,9,201,39,194,0,194,0,201,39,181,26,194,0,181,26,168,-4,168,-4,181,26,158,18,168,-4,158,18,141,-6,141,-6,158,18,131,15,131,15,107,17,109,-4,109,-4,107,17,86,23,109,-4,86,23,80,3,80,3,86,23,65,32,80,3,65,32,55,16,55,16,65,32,45,46,55,16,45,46,33,33,33,33,45,46,25,65,33,33,25,65,15,55,136,318,136,338,124,337,136,318,124,337,118,316,136,318,147,338,136,338,118,316,124,337,113,336,118,316,113,336,101,333,118,316,101,333,101,311,306,160,305,188,304,131,304,131,305,188,299,215,304,131,299,215,298,104,298,104,299,215,290,240,298,104,290,240,288,79,288,79,290,240,278,263,288,79,278,263,275,57,275,57,278,263,263,284,275,57,263,284,258,37,258,37,263,284,248,161,258,37,248,161,248,142,263,284,248,184,248,161,248,161,248,184,103,184,244,304,222,319,226,265,244,304,226,265,241,228,244,304,241,228,248,184,244,304,248,184,263,284,203,293,226,265,222,319,203,293,222,319,198,330,203,293,198,330,173,336,203,293,173,336,173,312,173,312,173,336,147,338,173,312,147,338,136,318,231,78,218,9,240,22,141,-6,131,15,109,-4,248,161,103,184,103,161,
-105,180,105,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,110,25,106,38,105,56,105,157,149,157,157,102,177,57,207,22,245,0,291,-6,337,1,376,24,405,60,425,108,431,166,425,222,406,269,377,306,338,330,291,338,245,331,207,310,178,276,158,232,149,180,16383,16383,377,169,376,134,373,103,367,76,359,53,347,35,337,26,327,19,315,15,303,12,291,11,279,12,268,15,257,19,247,25,237,33,224,52,214,75,208,102,204,132,203,166,204,194,207,222,211,247,219,269,228,286,239,299,251,308,263,315,276,318,290,320,302,319,313,316,324,311,334,305,343,296,356,279,366,257,372,231,376,201,377,169,309,0,309,9,290,12,277,16,270,25,267,39,267,276,268,294,271,307,278,315,290,319,309,321,309,331,180,331,136,329,98,321,69,306,49,282,42,246,47,216,60,193,81,176,108,164,141,157,49,35,41,26,31,19,22,14,12,11,2,9,2,0,83,0,198,155,216,155,216,56,215,37,211,24,203,16,189,12,169,9,169,0,16383,16383,216,174,186,174,156,177,131,186,113,200,101,219,97,244,99,261,103,276,111,288,121,298,133,305,143,308,153,310,164,311,177,312,190,312,200,311,207,309,212,304,215,296,216,286,223,33,218,29,210,25,206,24,201,23,196,25,192,28,189,35,187,44,186,56,186,152,185,168,184,181,181,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,
-50,25,42,16,149,0,149,0,42,16,29,12,149,0,29,12,9,9,149,331,9,331,29,319,149,331,29,319,42,315,149,331,42,315,50,307,149,331,50,307,53,294,149,331,53,294,118,315,149,331,118,315,130,319,149,331,130,319,149,321,158,232,149,180,149,157,149,157,149,180,105,180,149,157,105,180,105,157,106,38,105,56,54,274,106,38,54,274,54,61,54,274,105,56,105,274,54,274,105,274,106,294,54,274,106,294,110,307,54,274,110,307,118,315,54,274,118,315,53,294,149,0,149,9,130,12,149,0,130,12,118,17,149,0,118,17,53,39,149,0,53,39,50,25,54,61,53,39,118,17,54,61,118,17,110,25,54,61,110,25,106,38,263,315,291,338,251,308,251,308,291,338,245,331,251,308,245,331,239,299,239,299,245,331,228,286,219,269,228,286,245,331,219,269,245,331,207,310,208,102,207,22,214,75,214,75,207,22,245,0,214,75,245,0,224,52,224,52,245,0,237,33,247,25,237,33,245,0,247,25,245,0,291,-6,338,330,291,338,302,319,302,319,291,338,290,320,276,318,290,320,291,338,276,318,291,338,263,315,207,310,178,276,203,166,207,310,203,166,204,194,207,310,204,194,207,222,207,310,207,222,211,247,207,310,211,247,219,269,208,102,204,132,207,22,207,22,204,132,203,166,268,15,291,-6,279,12,279,12,291,-6,291,11,303,12,291,11,291,-6,303,12,291,-6,337,1,313,316,324,311,338,330,338,330,324,311,334,305,338,330,334,305,343,296,343,296,356,279,377,306,377,306,356,279,366,257,377,306,366,257,372,231,373,103,367,76,376,24,376,24,367,76,359,53,376,24,359,53,347,35,347,35,337,26,376,24,376,24,337,26,337,1,431,166,425,222,425,108,425,108,425,222,406,269,425,108,406,269,405,60,405,60,406,269,377,169,377,306,372,231,376,201,377,306,376,201,377,169,377,306,377,169,406,269,377,306,338,330,343,296,376,134,373,103,376,24,376,134,376,24,405,60,376,134,405,60,377,169,337,1,337,26,327,19,337,1,327,19,315,15,337,1,315,15,303,12,257,19,247,25,291,-6,257,19,291,-6,268,15,149,157,157,102,158,232,158,232,157,102,177,57,158,232,177,57,178,276,178,276,177,57,207,22,178,276,207,22,203,166,338,330,302,319,313,316,149,0,9,9,9,0,29,319,9,331,9,321,
-309,0,309,9,290,12,277,16,270,25,267,39,267,276,268,294,271,307,278,315,290,319,309,321,309,331,180,331,136,329,98,321,69,306,49,282,42,246,47,216,60,193,81,176,108,164,141,157,49,35,41,26,31,19,22,14,12,11,2,9,2,0,83,0,198,155,216,155,216,56,215,37,211,24,203,16,189,12,169,9,169,0,16383,16383,216,174,186,174,156,177,131,186,113,200,101,219,97,244,99,261,103,276,111,288,121,298,133,305,143,308,153,310,164,311,177,312,190,312,200,311,207,309,212,304,215,296,216,286,223,33,218,29,210,25,206,24,201,23,196,25,192,28,189,35,187,44,186,56,186,152,185,168,184,181,181,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,207,83,212,93,215,104,217,117,215,129,210,138,202,144,190,146,173,146,146,116,135,93,126,76,118,63,112,54,105,42,97,33,87,
-31,19,22,14,83,0,83,0,22,14,12,11,83,0,12,11,2,9,99,261,103,276,98,321,98,321,103,276,111,288,98,321,111,288,136,329,136,329,111,288,121,298,136,329,121,298,133,305,133,305,143,308,136,329,136,329,143,308,180,331,101,219,97,244,108,164,108,164,97,244,81,176,81,176,97,244,98,321,98,321,97,244,99,261,42,246,47,216,49,282,49,282,47,216,60,193,49,282,60,193,69,306,69,306,60,193,81,176,69,306,81,176,98,321,141,157,83,0,198,155,141,157,198,155,156,177,141,157,156,177,131,186,141,157,131,186,113,200,141,157,113,200,108,164,211,24,203,16,309,0,309,0,203,16,189,12,309,0,189,12,169,9,153,310,164,311,180,331,180,331,164,311,177,312,180,331,177,312,190,312,190,312,200,311,309,331,309,331,200,311,207,309,309,331,207,309,212,304,211,24,309,0,215,37,215,37,309,0,277,16,215,37,277,16,216,56,216,56,277,16,270,25,216,56,270,25,216,155,216,155,270,25,216,174,216,155,216,174,198,155,198,155,216,174,186,174,198,155,186,174,156,177,83,0,141,157,49,35,83,0,49,35,41,26,83,0,41,26,31,19,290,319,309,321,309,331,290,319,309,331,278,315,278,315,309,331,216,286,278,315,216,286,271,307,271,307,216,286,268,294,216,286,267,39,267,61,267,276,268,294,216,286,267,276,216,286,267,61,309,331,212,304,215,296,309,331,215,296,216,286,309,331,180,331,190,312,290,12,277,16,309,0,290,12,309,0,309,9,216,174,270,25,267,39,216,174,267,39,216,286,309,0,169,9,169,0,83,0,2,9,2,0,180,331,143,308,153,310,101,219,108,164,113,200,
-223,33,218,29,210,25,206,24,201,23,196,25,192,28,189,35,187,44,186,56,186,152,185,168,184,181,181,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,207,83,212,93,215,104,217,117,215,129,210,138,202,144,190,146,173,146,146,116,135,93,126,76,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,99,0,114,6,130,16,146,31,149,17,153,7,160,0,168,-3,178,-4,188,-3,197,-1,206,2,214,9,223,19,16383,16383,146,65,145,57,144,50,140,44,135,38,128,32,122,29,110,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,78,68,84,73,91,79,97,88,104,99,111,112,118,128,125,146,132,42,174,47,203,59,230,77,253,100,270,129,278,142,279,169,279,182,280,194,283,210,293,220,306,226,320,229,333,230,343,220,343,217,332,212,325,205,320,195,318,183,317,150,317,94,304,57,269,34,223,23,172,20,127,24,87,36,52,57,22,87,2,127,-4,164,1,195,17,219,43,234,76,239,116,233,154,218,186,195,210,166,225,131,230,111,228,92,223,74,213,57,196,43,173,16383,16383,194,102,192,70,184,44,172,25,155,13,135,9,125,10,115,13,106,18,98,25,91,34,81,51,74,70,69,91,66,113,65,137,67,164,75,186,87,202,102,212,122,216,134,215,144,211,153,206,161,199,169,191,178,177,185,161,190,142,193,122,194,102,153,118,169,121,183,128,194,137,202,151,205,168,201,188,191,204,174,215,149,222,118,225,12,225,12,218,26,216,35,214,40,209,42,200,43,187,43,39,42,25,40,16,35,11,26,8,12,7,12,0,149,0,161,2,171,4,181,8,190,12,200,19,208,28,214,39,218,51,
-37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,111,230,104,217,117,215,111,230,117,215,127,229,127,229,117,215,129,210,127,229,129,210,140,226,140,226,129,210,138,202,140,226,138,202,144,190,76,207,83,212,85,227,85,227,83,212,93,215,85,227,93,215,98,229,98,229,93,215,104,217,98,229,104,217,111,230,73,224,70,194,71,201,73,224,71,201,76,207,73,224,76,207,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,186,56,186,152,185,168,186,56,185,168,184,181,186,56,184,181,181,191,186,56,181,191,188,-3,192,28,197,-1,196,25,196,25,197,-1,201,23,206,24,201,23,206,2,206,24,206,2,214,9,189,35,187,44,188,-3,189,35,188,-3,197,-1,189,35,197,-1,192,28,178,-4,188,-3,181,191,178,-4,181,191,176,199,178,-4,176,199,170,208,178,-4,170,208,168,-3,162,215,152,222,153,7,162,215,153,7,160,0,162,215,160,0,168,-3,162,215,168,-3,170,208,152,222,140,226,144,190,152,222,144,190,146,173,152,222,146,173,146,132,152,222,146,132,146,31,152,222,146,31,149,17,152,222,149,17,153,7,146,146,146,132,146,173,218,29,214,27,214,9,218,29,214,9,223,19,218,29,223,19,223,33,210,25,206,24,214,9,210,25,214,9,214,27,201,23,197,-1,206,2,146,31,146,132,146,65,146,31,146,65,145,57,146,31,145,57,144,50,146,31,144,50,140,44,146,31,140,44,135,38,146,31,135,38,130,16,130,16,135,38,128,32,128,32,122,29,130,16,130,16,122,29,116,27,130,16,116,27,114,6,114,6,116,27,110,25,114,6,110,25,103,24,99,111,112,118,116,135,116,135,112,118,128,125,116,135,128,125,146,146,146,146,128,125,146,132,65,78,68,84,76,118,76,118,68,84,73,91,76,118,73,91,79,97,79,97,88,104,93,126,93,126,88,104,99,111,93,126,99,111,116,135,93,126,76,118,79,97,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,78,63,112,65,78,76,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,99,0,86,25,86,25,99,0,97,24,103,24,97,24,99,0,103,24,99,0,114,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,186,56,188,-3,187,44,29,167,29,183,28,175,
-42,174,47,203,59,230,77,253,100,270,129,278,142,279,169,279,182,280,194,283,210,293,220,306,226,320,229,333,230,343,220,343,217,332,212,325,205,320,195,318,183,317,150,317,94,304,57,269,34,223,23,172,20,127,24,87,36,52,57,22,87,2,127,-4,164,1,195,17,219,43,234,76,239,116,233,154,218,186,195,210,166,225,131,230,111,228,92,223,74,213,57,196,43,173,16383,16383,194,102,192,70,184,44,172,25,155,13,135,9,125,10,115,13,106,18,98,25,91,34,81,51,74,70,69,91,66,113,65,137,67,164,75,186,87,202,102,212,122,216,134,215,144,211,153,206,161,199,169,191,178,177,185,161,190,142,193,122,194,102,153,118,169,121,183,128,194,137,202,151,205,168,201,188,191,204,174,215,149,222,118,225,12,225,12,218,26,216,35,214,40,209,42,200,43,187,43,39,42,25,40,16,35,11,26,8,12,7,12,0,149,0,161,2,171,4,181,8,190,12,200,19,208,28,214,39,218,51,219,63,215,82,206,96,191,107,174,114,153,118,16383,16383,85,195,86,202,88,207,92,209,97,211,103,211,127,209,145,203,156,194,162,182,164,166,161,151,154,139,143,130,128,125,110,123,99,124,92,125,87,128,85,132,85,139,16383,16383,85,97,85,102,87,105,91,108,98,109,127,109,144,105,159,98,170,84,174,62,174,63,170,42,160,28,146,19,127,15,106,14,
-169,279,183,317,156,279,156,279,183,317,150,317,156,279,150,317,142,279,142,279,150,317,129,278,100,270,129,278,150,317,100,270,150,317,94,304,229,333,230,343,226,320,226,320,230,343,220,343,226,320,220,343,220,306,220,306,220,343,217,332,220,306,217,332,212,325,210,293,220,306,212,325,210,293,212,325,205,320,210,293,205,320,195,318,210,293,195,318,194,283,169,279,182,280,183,317,183,317,182,280,194,283,183,317,194,283,195,318,42,174,47,203,57,269,57,269,47,203,59,230,57,269,59,230,94,304,94,304,59,230,77,253,94,304,77,253,100,270,42,174,57,269,34,223,42,174,34,223,36,52,42,174,36,52,57,22,42,174,57,22,43,173,24,87,36,52,34,223,24,87,34,223,23,172,24,87,23,172,20,127,74,70,87,2,81,51,81,51,87,2,91,34,98,25,91,34,87,2,98,25,87,2,127,-4,65,137,57,196,66,113,66,113,57,196,57,22,66,113,57,22,69,91,69,91,57,22,87,2,69,91,87,2,74,70,131,230,122,216,134,215,131,230,134,215,166,225,166,225,134,215,144,211,166,225,144,211,153,206,75,186,87,202,92,223,92,223,87,202,102,212,92,223,102,212,111,228,111,228,102,212,122,216,111,228,122,216,131,230,74,213,57,196,67,164,74,213,67,164,75,186,74,213,75,186,92,223,67,164,57,196,65,137,192,70,184,44,195,17,195,17,184,44,172,25,195,17,172,25,164,1,164,1,172,25,155,13,164,1,155,13,135,9,135,9,125,10,127,-4,127,-4,125,10,115,13,127,-4,115,13,106,18,185,161,195,210,178,177,178,177,195,210,169,191,161,199,169,191,166,225,161,199,166,225,153,206,195,210,194,102,195,17,195,210,195,17,218,186,218,186,195,17,219,43,218,186,219,43,233,154,233,154,219,43,234,76,233,154,234,76,239,116,195,210,185,161,190,142,195,210,190,142,193,122,195,210,193,122,194,102,195,210,166,225,169,191,135,9,127,-4,164,1,192,70,195,17,194,102,98,25,127,-4,106,18,43,173,57,22,57,196,
-153,118,169,121,183,128,194,137,202,151,205,168,201,188,191,204,174,215,149,222,118,225,12,225,12,218,26,216,35,214,40,209,42,200,43,187,43,39,42,25,40,16,35,11,26,8,12,7,12,0,149,0,161,2,171,4,181,8,190,12,200,19,208,28,214,39,218,51,219,63,215,82,206,96,191,107,174,114,153,118,16383,16383,85,195,86,202,88,207,92,209,97,211,103,211,127,209,145,203,156,194,162,182,164,166,161,151,154,139,143,130,128,125,110,123,99,124,92,125,87,128,85,132,85,139,16383,16383,85,97,85,102,87,105,91,108,98,109,127,109,144,105,159,98,170,84,174,62,174,63,170,42,160,28,146,19,127,15,106,14,98,15,92,17,88,20,85,26,85,34,194,155,191,225,8,225,8,218,22,217,31,215,36,211,39,204,40,194,40,40,39,25,36,16,30,11,21,9,8,7,8,0,113,0,113,7,100,9,91,13,85,18,82,26,81,36,81,194,82,200,83,205,86,208,91,209,98,210,130,208,154,201,170,190,180,175,185,155,219,225,21,225,21,218,34,216,44,212,51,206,55,197,56,183,56,99,55,66,51,40,42,22,28,11,7,7,7,-68,16,-68,26,-37,37,-17,47,-5,58,0,172,0,182,-5,191,-17,200,-37,210,-68,219,-68,219,7,206,9,197,11,192,16,189,25,189,198,192,207,198,213,206,216,219,218,16383,16383,147,41,146,30,143,23,139,18,133,15,126,14,58,14,64,28,68,43,71,59,73,75,73,190,74,199,
-40,16,35,11,137,0,137,0,35,11,26,8,137,0,26,8,12,7,86,202,88,207,43,187,43,187,88,207,92,209,43,187,92,209,118,225,118,225,92,209,97,211,118,225,97,211,103,211,103,211,127,209,118,225,118,225,127,209,149,222,159,98,170,84,174,114,174,114,170,84,174,62,174,114,174,62,174,63,174,63,174,62,181,8,181,8,174,62,171,4,171,4,174,62,170,42,171,4,170,42,161,2,161,2,170,42,160,28,161,2,160,28,149,0,149,0,160,28,146,19,149,0,146,19,137,0,137,0,146,19,127,15,137,0,127,15,106,14,106,14,98,15,137,0,137,0,98,15,92,17,137,0,92,17,42,25,42,25,92,17,43,39,127,109,110,123,109,109,98,109,109,109,99,124,98,109,99,124,92,125,85,139,85,102,85,132,85,132,85,102,87,105,85,132,87,105,87,128,87,128,87,105,91,108,87,128,91,108,92,125,92,125,91,108,98,109,110,123,99,124,109,109,161,151,169,121,164,166,164,166,169,121,174,215,174,215,169,121,183,128,174,215,183,128,191,204,191,204,183,128,194,137,191,204,194,137,201,188,201,188,194,137,202,151,201,188,202,151,205,168,127,209,145,203,149,222,149,222,145,203,156,194,149,222,156,194,174,215,174,215,156,194,162,182,174,215,162,182,164,166,159,98,153,118,144,105,144,105,153,118,154,139,154,139,153,118,169,121,154,139,169,121,161,151,110,123,127,109,128,125,128,125,127,109,144,105,128,125,144,105,143,130,143,130,144,105,154,139,215,82,206,96,208,28,215,82,208,28,214,39,215,82,214,39,218,51,215,82,218,51,219,63,181,8,190,12,191,107,191,107,190,12,200,19,191,107,200,19,206,96,206,96,200,19,208,28,191,107,174,114,174,63,191,107,174,63,181,8,85,26,85,34,43,187,85,26,43,187,43,39,85,26,43,39,88,20,85,195,86,202,43,187,85,195,43,187,85,34,35,214,40,209,118,225,118,225,40,209,42,200,118,225,42,200,43,187,26,216,35,214,118,225,26,216,118,225,12,225,26,216,12,225,12,218,137,0,12,7,12,0,40,16,137,0,42,25,43,39,92,17,88,20,153,118,159,98,174,114,85,102,85,139,85,97,
-194,155,191,225,8,225,8,218,22,217,31,215,36,211,39,204,40,194,40,40,39,25,36,16,30,11,21,9,8,7,8,0,113,0,113,7,100,9,91,13,85,18,82,26,81,36,81,194,82,200,83,205,86,208,91,209,98,210,130,208,154,201,170,190,180,175,185,155,219,225,21,225,21,218,34,216,44,212,51,206,55,197,56,183,56,99,55,66,51,40,42,22,28,11,7,7,7,-68,16,-68,26,-37,37,-17,47,-5,58,0,172,0,182,-5,191,-17,200,-37,210,-68,219,-68,219,7,206,9,197,11,192,16,189,25,189,198,192,207,198,213,
-36,211,39,204,191,225,191,225,39,204,91,209,191,225,91,209,98,210,98,210,130,208,191,225,191,225,130,208,154,201,191,225,154,201,170,190,191,225,170,190,180,175,191,225,180,175,185,155,191,225,185,155,194,155,81,36,81,194,40,194,40,194,81,194,82,200,40,194,82,200,83,205,40,194,83,205,86,208,40,194,86,208,91,209,40,194,91,209,39,204,40,194,82,26,81,36,191,225,8,225,22,217,191,225,22,217,31,215,191,225,31,215,36,211,113,0,113,7,100,9,113,0,100,9,91,13,113,0,91,13,40,40,113,0,40,40,39,25,113,0,39,25,36,16,113,0,36,16,30,11,113,0,30,11,21,9,113,0,21,9,8,7,113,0,8,7,8,0,40,40,91,13,85,18,40,40,85,18,82,26,40,40,82,26,40,194,22,217,8,225,8,218,
-219,225,21,225,21,218,34,216,44,212,51,206,55,197,56,183,56,99,55,66,51,40,42,22,28,11,7,7,7,-68,16,-68,26,-37,37,-17,47,-5,58,0,172,0,182,-5,191,-17,200,-37,210,-68,219,-68,219,7,206,9,197,11,192,16,189,25,189,198,192,207,198,213,206,216,219,218,16383,16383,147,41,146,30,143,23,139,18,133,15,126,14,58,14,64,28,68,43,71,59,73,75,73,190,74,199,76,205,80,209,85,210,92,211,135,211,141,209,145,205,146,199,147,190,210,82,196,63,182,48,167,39,150,33,132,31,102,37,80,53,66,77,58,106,55,137,209,137,208,152,205,165,202,176,197,186,192,195,181,207,169,217,156,224,140,228,123,230,88,224,59,207,37,182,24,148,19,108,23,70,35,39,55,15,81,0,114,-4,142,-1,167,9,188,26,205,49,219,79,16383,16383,56,151,61,172,69,190,80,203,93,211,109,214,126,211,139,203,148,191,154,173,158,151,353,0,353,7,347,8,341,10,331,14,327,17,323,21,317,28,311,37,304,47,
-34,216,44,212,219,225,219,225,44,212,85,210,219,225,85,210,92,211,219,225,92,211,127,211,219,225,127,211,135,211,126,14,58,14,68,0,126,14,68,0,161,0,126,14,161,0,133,15,147,190,161,0,189,198,189,198,161,0,172,0,189,198,172,0,189,183,189,183,172,0,182,-5,189,183,182,-5,189,41,189,41,182,-5,191,-17,189,41,191,-17,189,25,161,0,147,190,147,41,161,0,147,41,146,30,161,0,146,30,143,23,161,0,143,23,139,18,161,0,139,18,133,15,219,225,135,211,141,209,219,225,141,209,145,205,219,225,145,205,146,199,219,225,146,199,147,190,219,225,147,190,198,213,219,225,198,213,206,216,219,225,206,216,219,218,192,207,198,213,147,190,192,207,147,190,189,198,73,190,74,199,58,14,73,190,58,14,64,28,73,190,64,28,68,43,73,190,68,43,71,59,73,190,71,59,73,75,73,190,73,75,73,89,58,0,68,0,58,14,58,0,58,14,56,183,58,0,56,183,56,99,58,0,56,99,55,66,58,0,55,66,51,40,58,0,51,40,47,-5,58,14,74,199,56,183,56,183,74,199,76,205,56,183,76,205,55,197,55,197,76,205,80,209,55,197,80,209,51,206,51,206,80,209,85,210,51,206,85,210,44,212,21,225,21,218,34,216,21,225,34,216,219,225,219,-68,219,7,210,-68,210,-68,219,7,206,9,210,-68,206,9,200,-37,200,-37,206,9,197,11,200,-37,197,11,192,16,192,16,189,25,191,-17,192,16,191,-17,200,-37,16,-68,26,-37,28,11,28,11,26,-37,37,-17,28,11,37,-17,42,22,42,22,37,-17,47,-5,42,22,47,-5,51,40,7,7,7,-68,16,-68,7,7,16,-68,28,11,
-210,82,196,63,182,48,167,39,150,33,132,31,102,37,80,53,66,77,58,106,55,137,209,137,208,152,205,165,202,176,197,186,192,195,181,207,169,217,156,224,140,228,123,230,88,224,59,207,37,182,24,148,19,108,23,70,35,39,55,15,81,0,114,-4,142,-1,167,9,188,26,205,49,219,79,16383,16383,56,151,61,172,69,190,80,203,93,211,109,214,126,211,139,203,148,191,154,173,158,151,353,0,353,7,347,8,341,10,331,14,327,17,323,21,317,28,311,37,304,47,298,58,286,79,275,94,264,105,253,113,240,120,240,121,258,137,269,156,278,172,286,185,297,190,301,189,306,187,318,183,324,182,332,183,338,186,343,191,346,197,347,204,346,211,342,218,336,223,327,227,316,228,306,227,297,224,289,218,282,211,275,201,267,187,259,171,251,156,242,143,233,135,228,132,222,130,215,128,
-80,53,66,77,81,0,81,0,66,77,58,106,81,0,58,106,55,15,55,15,58,106,55,137,56,151,55,137,209,137,56,151,209,137,158,151,158,151,209,137,169,217,140,228,123,230,126,211,126,211,123,230,109,214,93,211,109,214,123,230,93,211,123,230,88,224,156,224,140,228,148,191,156,224,148,191,154,173,156,224,154,173,158,151,156,224,158,151,169,217,140,228,126,211,139,203,140,228,139,203,148,191,56,151,61,172,59,207,59,207,61,172,69,190,59,207,69,190,88,224,88,224,69,190,80,203,88,224,80,203,93,211,37,182,24,148,35,39,37,182,35,39,55,15,37,182,55,15,55,137,37,182,55,137,56,151,37,182,56,151,59,207,24,148,19,108,23,70,24,148,23,70,35,39,81,0,114,-4,102,37,102,37,114,-4,132,31,150,33,132,31,142,-1,150,33,142,-1,167,9,209,137,208,152,205,165,209,137,205,165,202,176,209,137,202,176,197,186,209,137,197,186,192,195,209,137,192,195,181,207,209,137,181,207,169,217,219,79,210,82,205,49,205,49,210,82,196,63,205,49,196,63,188,26,188,26,196,63,182,48,188,26,182,48,167,9,167,9,182,48,167,39,167,9,167,39,150,33,132,31,114,-4,142,-1,80,53,81,0,102,37,
-353,0,353,7,347,8,341,10,331,14,327,17,323,21,317,28,311,37,304,47,298,58,286,79,275,94,264,105,253,113,240,120,240,121,258,137,269,156,278,172,286,185,297,190,301,189,306,187,318,183,324,182,332,183,338,186,343,191,346,197,347,204,346,211,342,218,336,223,327,227,316,228,306,227,297,224,289,218,282,211,275,201,267,187,259,171,251,156,242,143,233,135,228,132,222,130,215,128,208,127,200,127,200,190,201,199,204,207,210,212,219,216,232,218,232,225,128,225,128,218,140,216,149,214,154,209,158,201,158,127,151,127,144,128,138,129,132,132,127,135,117,145,108,157,101,170,88,196,82,207,75,216,67,223,56,227,44,228,34,227,26,224,20,219,15,212,14,204,15,197,18,191,23,186,29,183,36,182,43,183,50,185,60,189,65,190,74,185,80,172,87,155,100,137,121,121,121,120,107,114,95,107,85,95,74,79,62,57,63,57,56,46,50,36,44,28,38,21,33,17,29,14,25,12,19,10,14,8,7,7,7,0,73,0,124,83,133,96,139,104,145,109,151,112,158,113,158,25,155,18,151,13,145,10,137,8,126,7,126,0,234,0,234,7,214,9,207,12,203,17,201,24,200,33,200,113,209,111,216,108,222,104,228,95,237,82,287,0,114,121,130,126,146,134,158,146,167,160,170,177,168,188,164,198,158,207,149,215,139,221,121,227,111,229,99,230,80,230,75,229,69,228,64,226,57,224,49,222,46,220,42,219,35,219,29,223,27,226,26,230,20,230,16,150,25,150,30,172,38,190,50,204,65,213,85,216,98,214,110,209,119,200,125,188,127,172,126,163,123,155,118,147,112,140,104,135,97,132,89,129,81,128,72,127,60,127,60,113,86,111,106,106,120,96,129,82,132,62,130,47,124,34,114,23,99,15,79,13,65,14,52,18,40,24,28,33,14,46,7,39,19,23,32,11,46,2,64,-2,85,-4,113,-2,125,1,137,5,147,12,157,20,166,29,173,40,177,52,179,65,175,84,165,99,151,110,133,117,114,121,251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,84,60,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,178,165,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,229,12,224,17,221,26,220,40,220,183,221,198,223,207,229,213,238,216,251,218,201,319,199,330,195,340,
-25,12,19,10,73,0,73,0,19,10,14,8,73,0,14,8,7,7,50,36,44,28,73,0,73,0,44,28,38,21,73,0,38,21,33,17,33,17,29,14,73,0,73,0,29,14,25,12,95,107,85,95,124,83,124,83,85,95,74,79,124,83,74,79,73,0,73,0,74,79,62,57,73,0,62,57,56,46,56,46,62,57,63,57,67,223,65,190,74,185,67,223,74,185,75,216,75,216,74,185,80,172,75,216,80,172,82,207,82,207,80,172,87,155,82,207,87,155,88,196,88,196,87,155,100,137,88,196,100,137,94,184,94,184,100,137,101,170,50,185,55,187,56,227,56,227,55,187,60,189,56,227,60,189,67,223,67,223,60,189,65,190,44,228,34,227,36,182,44,228,36,182,43,183,44,228,43,183,50,185,44,228,50,185,56,227,14,204,15,197,15,212,15,212,15,197,18,191,15,212,18,191,20,219,20,219,18,191,23,186,20,219,23,186,26,224,26,224,23,186,29,183,26,224,29,183,34,227,34,227,29,183,36,182,127,135,121,121,124,83,127,135,124,83,133,96,127,135,117,145,121,121,121,121,117,145,108,157,121,121,108,157,101,170,121,121,101,170,100,137,155,18,151,13,234,0,234,0,151,13,145,10,234,0,145,10,137,8,137,8,126,7,234,0,234,0,126,7,126,0,234,0,234,7,224,8,234,0,224,8,214,9,234,0,214,9,207,12,234,0,207,12,158,33,234,0,158,33,158,25,234,0,158,25,155,18,201,24,200,33,158,113,201,24,158,113,203,17,203,17,158,113,158,33,158,113,200,33,200,127,158,113,200,127,200,190,158,113,200,190,201,199,158,113,201,199,204,207,158,113,204,207,158,189,158,113,158,189,158,127,215,128,208,127,209,111,209,111,208,127,200,127,232,225,128,225,140,216,232,225,140,216,149,214,232,225,149,214,154,209,232,225,154,209,158,201,232,225,158,201,158,189,232,225,158,189,210,212,232,225,210,212,219,216,232,225,219,216,232,218,264,105,253,113,287,0,287,0,253,113,240,120,287,0,240,120,237,82,237,82,240,120,240,121,237,82,240,121,233,135,237,82,233,135,228,95,228,95,233,135,228,132,228,95,228,132,222,104,222,104,228,132,222,130,222,104,222,130,216,108,216,108,222,130,215,128,216,108,215,128,209,111,317,28,311,37,287,0,287,0,311,37,304,47,287,0,304,47,298,58,297,224,297,190,301,189,297,224,301,189,306,227,306,227,301,189,306,187,306,227,306,187,316,228,316,228,306,187,312,185,316,228,312,185,318,183,297,190,289,218,286,185,286,185,289,218,282,211,286,185,282,211,278,172,278,172,282,211,275,201,278,172,275,201,269,156,269,156,275,201,267,187,269,156,267,187,259,171,258,137,269,156,259,171,258,137,259,171,251,156,258,137,251,156,242,143,258,137,242,143,240,121,242,143,233,135,240,121,318,183,324,182,327,227,327,227,324,182,332,183,327,227,332,183,336,223,336,223,332,183,338,186,336,223,338,186,342,218,342,218,338,186,343,191,342,218,343,191,346,211,346,211,343,191,346,197,346,211,346,197,347,204,317,28,287,0,323,21,323,21,287,0,327,17,331,14,327,17,287,0,331,14,287,0,353,0,353,0,353,7,347,8,353,0,347,8,341,10,353,0,341,10,336,12,353,0,336,12,331,14,287,0,298,58,286,79,287,0,286,79,275,94,287,0,275,94,264,105,145,109,151,112,151,127,151,127,151,112,158,113,151,127,158,113,158,127,132,132,127,135,133,96,132,132,133,96,138,129,138,129,133,96,139,104,138,129,139,104,144,128,144,128,139,104,145,109,144,128,145,109,151,127,124,83,121,121,121,120,124,83,121,120,107,114,124,83,107,114,95,107,73,0,7,7,7,0,50,36,73,0,56,46,316,228,318,183,327,227,297,190,297,224,289,218,200,127,200,113,209,111,140,216,128,225,128,218,210,212,158,189,204,207,158,33,207,12,203,17,
-114,121,130,126,146,134,158,146,167,160,170,177,168,188,164,198,158,207,149,215,139,221,121,227,111,229,99,230,80,230,75,229,69,228,64,226,57,224,49,222,46,220,42,219,35,219,29,223,27,226,26,230,20,230,16,150,25,150,30,172,38,190,50,204,65,213,85,216,98,214,110,209,119,200,125,188,127,172,126,163,123,155,118,147,112,140,104,135,97,132,89,129,81,128,72,127,60,127,60,113,86,111,106,106,120,96,129,82,132,62,130,47,124,34,114,23,99,15,79,13,65,14,52,18,40,24,28,33,14,46,7,39,19,23,32,11,46,2,64,-2,85,-4,113,-2,125,1,137,5,147,12,157,20,166,29,173,40,177,52,179,65,175,84,165,99,151,110,133,117,114,121,251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,84,60,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,178,165,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,229,12,224,17,221,26,220,40,220,183,221,198,223,207,229,213,238,216,251,218,201,319,199,330,195,340,188,347,180,351,171,352,167,352,161,348,159,344,158,339,160,332,166,329,172,327,178,324,180,319,179,313,174,307,166,303,152,300,133,299,115,300,102,303,93,307,88,313,87,319,89,324,95,327,101,329,107,332,
-26,230,20,230,25,150,26,230,25,150,30,172,26,230,30,172,27,226,49,222,46,220,50,204,50,204,46,220,42,219,50,204,42,219,39,219,39,219,35,219,38,190,38,190,35,219,32,221,38,190,32,221,30,172,30,172,32,221,29,223,30,172,29,223,27,226,64,-2,85,-4,65,14,65,14,85,-4,79,13,99,15,79,13,85,-4,99,15,85,-4,99,-3,85,216,80,230,75,229,85,216,75,229,69,228,85,216,69,228,65,213,85,216,86,230,80,230,65,213,69,228,64,226,65,213,64,226,57,224,65,213,57,224,53,223,65,213,53,223,50,204,39,219,38,190,50,204,81,128,86,111,89,129,89,129,86,111,106,106,89,129,106,106,97,132,97,132,106,106,104,135,112,140,104,135,106,106,112,140,106,106,114,121,114,121,106,106,120,96,114,121,120,96,133,117,133,117,120,96,129,82,133,117,129,82,132,62,86,230,98,214,99,230,99,230,98,214,110,209,99,230,110,209,111,229,111,229,110,209,119,200,111,229,119,200,121,227,121,227,119,200,125,188,121,227,125,188,130,224,130,224,125,188,127,172,130,126,127,172,126,163,126,163,123,155,130,126,130,126,123,155,118,147,130,126,118,147,114,121,114,121,118,147,112,140,170,177,168,188,167,160,167,160,168,188,164,198,167,160,164,198,158,146,158,146,164,198,158,207,158,146,158,207,149,215,146,134,158,146,149,215,146,134,149,215,139,221,146,134,139,221,130,224,146,134,130,224,130,126,85,216,98,214,86,230,133,117,132,62,137,5,133,117,137,5,151,110,151,110,137,5,147,12,151,110,147,12,157,20,175,84,165,99,166,29,175,84,166,29,173,40,175,84,173,40,177,52,175,84,177,52,179,65,165,99,151,110,157,20,165,99,157,20,166,29,130,47,124,34,125,1,130,47,125,1,137,5,130,47,137,5,132,62,114,23,99,15,99,-3,114,23,99,-3,113,-2,114,23,113,-2,125,1,114,23,125,1,124,34,72,127,60,127,86,111,72,127,86,111,81,128,14,46,19,23,28,33,28,33,19,23,32,11,28,33,32,11,40,24,40,24,32,11,46,2,40,24,46,2,52,18,52,18,46,2,64,-2,52,18,64,-2,65,14,19,23,14,46,7,39,86,111,60,127,60,113,130,224,127,172,130,126,49,222,50,204,53,223,25,150,20,230,16,150,
-251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,84,60,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,178,165,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,229,12,224,17,221,26,220,40,220,183,221,198,223,207,229,213,238,216,251,218,201,319,199,330,195,340,188,347,180,351,171,352,167,352,161,348,159,344,158,339,160,332,166,329,172,327,178,324,180,319,179,313,174,307,166,303,152,300,133,299,115,300,102,303,93,307,88,313,87,319,89,324,95,327,101,329,107,332,109,339,108,344,107,348,101,352,97,352,88,351,80,347,73,340,68,330,66,319,70,302,82,289,98,280,116,275,133,273,151,275,169,280,185,289,196,302,201,319,16383,16383,251,225,147,225,147,218,160,216,169,213,174,207,
-39,16,33,11,116,0,116,0,33,11,25,9,116,0,25,9,12,7,178,189,84,60,84,36,84,36,84,189,42,183,42,183,84,189,85,199,42,183,85,199,88,207,116,225,12,225,25,216,116,225,25,216,33,212,116,225,33,212,39,206,116,225,39,206,42,197,116,225,42,197,93,212,116,225,93,212,102,216,116,225,102,216,116,218,42,183,88,207,93,212,42,183,93,212,42,197,174,18,169,12,251,0,251,0,169,12,160,9,251,0,160,9,147,7,169,213,174,207,251,225,251,225,174,207,177,200,251,225,177,200,178,189,178,189,178,165,221,26,221,26,178,165,178,37,221,26,178,37,224,17,224,17,178,37,229,12,238,216,251,218,251,225,238,216,251,225,229,213,229,213,251,225,178,189,229,213,178,189,223,207,223,207,178,189,221,198,220,40,220,183,178,189,220,40,178,189,221,26,160,216,169,213,251,225,160,216,251,225,147,225,160,216,147,225,147,218,251,0,251,7,238,9,251,0,238,9,229,12,251,0,229,12,178,37,251,0,178,37,177,26,251,0,177,26,174,18,116,0,116,7,102,9,116,0,102,9,93,13,116,0,93,13,42,40,116,0,42,40,42,25,116,0,42,25,39,16,85,26,84,36,42,183,85,26,42,183,42,40,85,26,42,40,88,18,116,0,12,7,12,0,42,40,93,13,88,18,251,0,147,7,147,0,221,198,178,189,220,183,178,189,84,36,178,165,25,216,12,225,12,218,
-201,319,199,330,195,340,188,347,180,351,171,352,167,352,161,348,159,344,158,339,160,332,166,329,172,327,178,324,180,319,179,313,174,307,166,303,152,300,133,299,115,300,102,303,93,307,88,313,87,319,89,324,95,327,101,329,107,332,109,339,108,344,107,348,101,352,97,352,88,351,80,347,73,340,68,330,66,319,70,302,82,289,98,280,116,275,133,273,151,275,169,280,185,289,196,302,201,319,16383,16383,251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,84,60,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,178,165,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,229,12,224,17,221,26,220,40,220,183,221,198,223,207,229,213,238,216,251,218,248,0,248,7,241,8,235,10,225,14,221,17,217,21,211,28,205,37,198,47,192,58,180,79,168,94,156,105,144,113,131,120,131,121,148,137,160,156,168,172,176,185,188,190,192,189,202,185,208,183,214,182,222,183,228,186,233,191,237,197,238,204,236,211,233,218,226,223,218,227,207,228,196,227,185,223,176,216,168,207,161,196,140,154,132,143,124,135,118,132,112,130,105,128,98,127,91,127,91,190,92,199,95,207,100,212,109,216,122,218,122,225,18,225,18,218,31,216,39,214,45,209,48,201,49,189,49,25,46,18,42,13,36,10,26,8,12,7,12,0,128,0,128,7,117,8,107,9,99,12,94,17,92,24,91,33,91,113,99,111,106,108,112,103,118,95,127,82,181,0,238,225,45,225,45,218,57,216,66,212,71,206,74,197,75,183,75,99,74,77,73,53,69,33,62,18,50,12,46,15,42,22,38,30,32,36,23,39,18,38,13,36,
-102,303,93,307,98,280,98,280,93,307,88,313,98,280,88,313,82,289,82,289,88,313,87,319,88,351,87,319,89,324,88,351,89,324,97,352,97,352,89,324,95,327,97,352,95,327,101,329,101,352,101,329,104,350,104,350,101,329,107,332,104,350,107,332,107,348,107,348,107,332,109,339,107,348,109,339,108,344,82,289,87,319,88,351,82,289,88,351,80,347,82,289,80,347,73,340,82,289,73,340,70,302,68,330,66,319,70,302,68,330,70,302,73,340,102,303,116,275,115,300,115,300,116,275,133,299,152,300,133,299,133,273,152,300,133,273,151,275,196,302,201,319,199,330,196,302,199,330,195,340,196,302,195,340,188,347,196,302,188,347,185,289,185,289,188,347,180,319,185,289,180,319,179,313,185,289,179,313,174,307,185,289,174,307,169,280,180,351,171,352,172,327,180,351,172,327,178,324,180,351,178,324,180,319,180,351,180,319,188,347,167,352,164,350,166,329,167,352,166,329,172,327,167,352,172,327,171,352,161,348,159,344,160,332,161,348,160,332,166,329,161,348,166,329,164,350,169,280,174,307,166,303,169,280,166,303,152,300,169,280,152,300,151,275,133,299,116,275,133,273,39,16,33,11,116,0,116,0,33,11,25,9,116,0,25,9,12,7,178,189,84,60,84,36,84,36,84,189,42,183,42,183,84,189,85,199,42,183,85,199,88,207,116,225,12,225,25,216,116,225,25,216,33,212,116,225,33,212,39,206,116,225,39,206,42,197,116,225,42,197,93,212,116,225,93,212,102,216,116,225,102,216,116,218,42,183,88,207,93,212,42,183,93,212,42,197,174,18,169,12,251,0,251,0,169,12,160,9,251,0,160,9,147,7,169,213,174,207,251,225,251,225,174,207,177,200,251,225,177,200,178,189,178,189,178,165,221,26,221,26,178,165,178,37,221,26,178,37,224,17,224,17,178,37,229,12,238,216,251,218,251,225,238,216,251,225,229,213,229,213,251,225,178,189,229,213,178,189,223,207,223,207,178,189,221,198,220,40,220,183,178,189,220,40,178,189,221,26,160,216,169,213,251,225,160,216,251,225,147,225,160,216,147,225,147,218,251,0,251,7,238,9,251,0,238,9,229,12,251,0,229,12,178,37,251,0,178,37,177,26,251,0,177,26,174,18,116,0,116,7,102,9,116,0,102,9,93,13,116,0,93,13,42,40,116,0,42,40,42,25,116,0,42,25,39,16,85,26,84,36,42,183,85,26,42,183,42,40,85,26,42,40,88,18,116,0,12,7,12,0,42,40,93,13,88,18,251,0,147,7,147,0,221,198,178,189,220,183,178,189,84,36,178,165,25,216,12,225,12,218,160,332,159,344,158,339,102,303,98,280,116,275,97,352,101,329,101,352,
-248,0,248,7,241,8,235,10,225,14,221,17,217,21,211,28,205,37,198,47,192,58,180,79,168,94,156,105,144,113,131,120,131,121,148,137,160,156,168,172,176,185,188,190,192,189,202,185,208,183,214,182,222,183,228,186,233,191,237,197,238,204,236,211,233,218,226,223,218,227,207,228,196,227,185,223,176,216,168,207,161,196,140,154,132,143,124,135,118,132,112,130,105,128,98,127,91,127,91,190,92,199,95,207,100,212,109,216,122,218,122,225,18,225,18,218,31,216,39,214,45,209,48,201,49,189,49,25,46,18,42,13,36,10,26,8,12,7,12,0,128,0,128,7,117,8,107,9,99,12,94,17,92,24,91,33,91,113,99,111,106,108,112,103,118,95,127,82,181,0,238,225,45,225,45,218,57,216,66,212,71,206,74,197,75,183,75,99,74,77,73,53,69,33,62,18,50,12,46,15,42,22,38,30,32,36,23,39,18,38,13,36,8,33,5,27,4,20,6,10,10,3,18,-1,28,-3,39,-4,64,2,79,18,88,41,91,66,92,89,92,198,94,204,98,208,103,210,110,211,154,211,159,209,163,205,165,199,165,37,164,26,161,18,156,12,147,9,134,7,134,0,238,0,238,7,225,9,216,12,211,17,208,26,207,40,207,183,208,198,211,207,216,213,225,216,238,218,297,225,229,225,157,62,79,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,92,0,92,7,78,9,69,12,63,18,60,26,
-46,18,42,13,128,0,128,0,42,13,36,10,128,0,36,10,26,8,26,8,12,7,128,0,128,0,12,7,12,0,128,0,128,7,117,8,128,0,117,8,107,9,128,0,107,9,99,12,128,0,99,12,49,33,128,0,49,33,49,25,128,0,49,25,46,18,91,33,91,127,49,189,91,33,49,189,92,24,49,33,99,12,94,17,49,33,94,17,92,24,49,33,92,24,49,189,91,113,99,111,91,127,91,127,91,190,49,189,49,189,91,190,92,199,49,189,92,199,95,207,122,225,18,225,31,216,122,225,31,216,39,214,122,225,39,214,45,209,122,225,45,209,48,201,122,225,48,201,49,189,122,225,49,189,100,212,122,225,100,212,109,216,122,225,109,216,122,218,106,108,112,103,112,130,112,130,112,103,118,95,112,130,118,95,118,132,118,132,118,95,124,135,132,143,124,135,127,82,105,128,98,127,99,111,105,128,99,111,106,108,105,128,106,108,112,130,127,82,124,135,118,95,202,185,207,228,197,187,197,187,207,228,196,227,197,187,196,227,192,189,192,189,196,227,188,190,176,185,188,190,185,223,176,185,185,223,176,216,147,168,148,137,154,182,154,182,148,137,160,156,154,182,160,156,161,196,161,196,160,156,168,172,161,196,168,172,168,207,168,207,168,172,176,185,168,207,176,185,176,216,156,105,144,113,181,0,181,0,144,113,131,120,181,0,131,120,127,82,127,82,131,120,131,121,127,82,131,121,132,143,132,143,131,121,148,137,132,143,148,137,140,154,140,154,148,137,147,168,208,183,214,182,218,227,218,227,214,182,222,183,218,227,222,183,226,223,226,223,222,183,228,186,226,223,228,186,233,218,233,218,228,186,233,191,233,218,233,191,236,211,236,211,233,191,237,197,236,211,237,197,238,204,207,228,202,185,208,183,207,228,208,183,218,227,196,227,185,223,188,190,211,28,181,0,217,21,217,21,181,0,221,17,225,14,221,17,181,0,225,14,181,0,248,0,248,0,248,7,241,8,248,0,241,8,235,10,248,0,235,10,230,12,248,0,230,12,225,14,181,0,211,28,205,37,181,0,205,37,198,47,181,0,198,47,192,58,181,0,192,58,180,79,181,0,180,79,168,94,181,0,168,94,156,105,91,127,99,111,98,127,31,216,18,225,18,218,100,212,49,189,95,207,
-238,225,45,225,45,218,57,216,66,212,71,206,74,197,75,183,75,99,74,77,73,53,69,33,62,18,50,12,46,15,42,22,38,30,32,36,23,39,18,38,13,36,8,33,5,27,4,20,6,10,10,3,18,-1,28,-3,39,-4,64,2,79,18,88,41,91,66,92,89,92,198,94,204,98,208,103,210,110,211,154,211,159,209,163,205,165,199,165,37,164,26,161,18,156,12,147,9,134,7,134,0,238,0,238,7,225,9,216,12,211,17,208,26,207,40,207,183,208,198,211,207,216,213,225,216,238,218,297,225,229,225,157,62,79,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,92,0,92,7,78,9,69,12,63,18,60,26,59,36,59,172,60,172,143,0,147,0,224,174,224,37,223,26,220,18,214,12,204,9,190,7,190,0,296,0,296,7,284,9,275,12,270,17,267,26,266,40,266,183,267,198,270,207,275,213,284,216,297,218,251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,178,124,84,124,84,189,85,199,88,207,93,212,102,216,
-74,77,73,53,79,18,79,18,73,53,69,33,79,18,69,33,64,2,64,2,69,33,62,18,64,2,62,18,50,12,50,12,46,15,64,2,64,2,46,15,39,-4,57,216,66,212,238,225,238,225,66,212,103,210,238,225,103,210,110,211,238,225,110,211,145,211,238,225,145,211,154,211,161,18,156,12,238,0,238,0,156,12,147,9,238,0,147,9,134,7,238,225,154,211,159,209,238,225,159,209,163,205,238,225,163,205,165,199,238,225,165,199,165,190,238,225,165,190,216,213,238,225,216,213,225,216,238,225,225,216,238,218,207,40,207,183,165,190,165,190,207,183,208,198,165,190,208,198,211,207,216,12,211,17,165,37,165,37,211,17,208,26,165,37,208,26,165,190,92,189,92,198,75,183,92,189,75,183,79,18,92,189,79,18,88,41,92,189,88,41,91,66,92,189,91,66,92,89,75,183,92,198,94,204,75,183,94,204,98,208,75,183,98,208,74,197,71,206,74,197,98,208,71,206,98,208,103,210,71,206,103,210,66,212,45,225,45,218,57,216,45,225,57,216,238,225,238,0,238,7,225,9,238,0,225,9,216,12,238,0,216,12,165,37,238,0,165,37,164,26,238,0,164,26,161,18,75,99,74,77,79,18,75,99,79,18,75,183,39,-4,46,15,42,22,39,-4,42,22,38,30,39,-4,38,30,32,36,39,-4,32,36,28,-3,32,36,23,39,28,-3,28,-3,23,39,18,38,28,-3,18,38,18,-1,18,-1,18,38,13,36,18,-1,13,36,10,3,10,3,13,36,8,33,10,3,8,33,6,10,6,10,8,33,5,27,6,10,5,27,4,20,238,0,134,7,134,0,165,190,208,26,207,40,216,213,165,190,211,207,
-297,225,229,225,157,62,79,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,92,0,92,7,78,9,69,12,63,18,60,26,59,36,59,172,60,172,143,0,147,0,224,174,224,37,223,26,220,18,214,12,204,9,190,7,190,0,296,0,296,7,284,9,275,12,270,17,267,26,266,40,266,183,267,198,270,207,275,213,284,216,297,218,251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,178,124,84,124,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,108,178,108,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,
-39,16,33,11,92,0,92,0,33,11,25,9,92,0,25,9,12,7,220,18,214,12,296,0,296,0,214,12,204,9,296,0,204,9,190,7,229,225,157,62,224,174,229,225,224,174,267,26,229,225,267,26,266,40,229,225,266,40,266,183,229,225,266,183,267,198,229,225,267,198,270,207,229,225,270,207,275,213,229,225,275,213,297,225,59,172,60,172,79,225,79,225,60,172,143,0,79,225,143,0,157,62,157,62,143,0,147,0,157,62,147,0,224,174,92,7,78,9,92,0,92,0,78,9,69,12,92,0,69,12,42,25,42,25,69,12,63,18,42,25,63,18,42,40,42,40,63,18,60,26,42,40,60,26,42,183,42,183,60,26,59,36,42,183,59,36,59,172,79,225,12,225,25,216,79,225,25,216,33,212,79,225,33,212,39,206,79,225,39,206,42,197,79,225,42,197,42,183,79,225,42,183,59,172,284,216,297,218,297,225,284,216,297,225,275,213,296,0,296,7,284,9,296,0,284,9,275,12,296,0,275,12,224,37,296,0,224,37,223,26,296,0,223,26,220,18,224,37,275,12,270,17,224,37,270,17,267,26,224,37,267,26,224,174,92,0,12,7,12,0,39,16,92,0,42,25,296,0,190,7,190,0,25,216,12,225,12,218,
-251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,178,124,84,124,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,108,178,108,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,229,12,224,17,221,26,220,40,220,183,221,198,223,207,229,213,238,216,251,218,238,116,232,154,217,186,194,210,165,225,130,230,92,225,61,209,38,185,23,153,17,114,23,75,38,42,61,17,91,1,126,-4,163,1,194,17,218,43,233,76,238,116,16383,16383,193,102,190,70,183,44,171,25,154,13,134,9,123,10,114,13,104,18,96,25,89,34,79,51,72,70,66,91,63,113,63,137,65,164,73,186,85,202,101,212,121,216,132,215,143,211,152,206,161,199,168,191,177,177,184,161,189,142,192,122,193,102,251,225,12,225,12,218,25,217,33,214,
-39,16,33,11,116,0,116,0,33,11,25,9,116,0,25,9,12,7,116,225,12,225,25,216,116,225,25,216,33,212,116,225,33,212,39,206,116,225,39,206,42,197,116,225,42,197,93,212,116,225,93,212,102,216,116,225,102,216,116,218,42,183,85,26,84,36,84,124,84,108,178,108,84,124,178,108,178,124,178,124,178,108,224,17,178,124,224,17,221,26,42,183,84,36,84,189,42,183,84,189,85,199,42,183,85,199,88,207,42,183,88,207,93,212,42,183,93,212,42,197,174,18,169,12,251,0,251,0,169,12,160,9,251,0,160,9,147,7,251,225,147,225,160,216,251,225,160,216,169,213,251,225,169,213,174,207,251,225,174,207,177,200,251,225,177,200,178,189,251,225,178,189,229,213,251,225,229,213,238,216,251,225,238,216,251,218,220,40,220,183,178,189,178,189,220,183,221,198,178,189,221,198,223,207,178,189,221,26,220,40,251,0,251,7,238,9,251,0,238,9,229,12,251,0,229,12,178,37,251,0,178,37,177,26,251,0,177,26,174,18,178,37,229,12,224,17,178,37,224,17,178,108,116,0,116,7,102,9,116,0,102,9,93,13,116,0,93,13,42,40,116,0,42,40,42,25,116,0,42,25,39,16,42,40,93,13,88,18,42,40,88,18,85,26,42,40,85,26,42,183,116,0,12,7,12,0,251,0,147,7,147,0,178,124,221,26,178,189,160,216,147,225,147,218,229,213,178,189,223,207,25,216,12,225,12,218,
-238,116,232,154,217,186,194,210,165,225,130,230,92,225,61,209,38,185,23,153,17,114,23,75,38,42,61,17,91,1,126,-4,163,1,194,17,218,43,233,76,238,116,16383,16383,193,102,190,70,183,44,171,25,154,13,134,9,123,10,114,13,104,18,96,25,89,34,79,51,72,70,66,91,63,113,63,137,65,164,73,186,85,202,101,212,121,216,132,215,143,211,152,206,161,199,168,191,177,177,184,161,189,142,192,122,193,102,251,225,12,225,12,218,25,217,33,214,39,209,42,200,42,26,39,17,33,12,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,186,85,196,88,203,92,208,98,210,105,211,156,211,163,210,169,208,174,203,177,196,178,186,178,37,177,26,175,18,170,12,161,9,148,7,148,0,251,0,251,7,238,9,229,11,224,16,221,24,220,37,220,184,221,199,224,209,230,214,238,217,251,218,76,229,
-66,91,61,17,72,70,72,70,61,17,91,1,72,70,91,1,79,51,79,51,91,1,89,34,96,25,89,34,91,1,96,25,91,1,126,-4,165,225,130,230,132,215,132,215,130,230,121,216,101,212,121,216,130,230,101,212,130,230,92,225,190,70,183,44,194,17,194,17,183,44,171,25,194,17,171,25,163,1,163,1,171,25,154,13,163,1,154,13,134,9,134,9,123,10,126,-4,126,-4,123,10,114,13,126,-4,114,13,104,18,143,211,152,206,165,225,165,225,152,206,161,199,165,225,161,199,168,191,168,191,177,177,194,210,194,210,177,177,184,161,194,210,184,161,189,142,194,210,193,102,194,17,194,210,194,17,217,186,217,186,194,17,218,43,217,186,218,43,232,154,232,154,218,43,233,76,232,154,233,76,238,116,194,210,189,142,192,122,194,210,192,122,193,102,194,210,165,225,168,191,134,9,126,-4,163,1,61,17,63,113,63,137,63,137,65,164,61,209,61,209,65,164,73,186,61,209,73,186,92,225,92,225,73,186,85,202,92,225,85,202,101,212,61,17,63,137,61,209,61,17,61,209,38,42,38,42,61,209,38,185,38,42,38,185,23,75,23,75,38,185,23,153,23,75,23,153,17,114,63,113,61,17,66,91,190,70,194,17,193,102,165,225,132,215,143,211,96,25,126,-4,104,18,
-251,225,12,225,12,218,25,217,33,214,39,209,42,200,42,26,39,17,33,12,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,186,85,196,88,203,92,208,98,210,105,211,156,211,163,210,169,208,174,203,177,196,178,186,178,37,177,26,175,18,170,12,161,9,148,7,148,0,251,0,251,7,238,9,229,11,224,16,221,24,220,37,220,184,221,199,224,209,230,214,238,217,251,218,76,229,73,230,58,224,44,219,31,214,17,209,1,204,1,196,4,197,13,197,22,196,28,194,32,189,34,180,34,-65,33,-79,30,-88,24,-94,14,-98,0,-100,0,-107,120,-107,120,-100,101,-99,88,-95,81,-89,77,-78,76,-62,76,17,86,8,96,2,107,-1,117,-3,129,-4,163,1,191,19,213,47,227,82,232,123,228,158,216,188,198,210,175,225,148,230,132,228,117,224,103,216,89,205,76,190,16383,16383,76,167,79,176,
-39,17,33,12,116,0,116,0,33,12,25,9,116,0,25,9,12,7,156,211,251,225,105,211,98,210,105,211,39,209,98,210,39,209,42,200,175,18,170,12,251,0,251,0,170,12,161,9,251,0,161,9,148,7,238,217,251,218,251,225,238,217,251,225,230,214,230,214,251,225,177,196,230,214,177,196,178,186,221,24,178,186,178,37,221,24,178,37,224,16,224,16,178,37,229,11,220,37,220,184,178,186,178,186,220,184,221,199,178,186,221,199,224,209,251,225,156,211,163,210,251,225,163,210,169,208,251,225,169,208,174,203,251,225,174,203,177,196,93,13,88,18,42,39,42,39,88,18,85,26,42,39,85,26,42,185,42,185,85,26,84,36,42,185,84,36,84,186,42,185,84,186,85,196,42,185,85,196,88,203,42,185,88,203,92,208,42,185,92,208,42,200,251,225,12,225,25,217,251,225,25,217,33,214,251,225,33,214,39,209,251,225,39,209,105,211,251,0,251,7,238,9,251,0,238,9,229,11,251,0,229,11,178,37,251,0,178,37,177,26,251,0,177,26,175,18,116,0,116,7,102,9,116,0,102,9,93,13,116,0,93,13,42,39,116,0,42,39,42,26,116,0,42,26,39,17,116,0,12,7,12,0,251,0,148,7,148,0,178,186,221,24,220,37,25,217,12,225,12,218,98,210,42,200,92,208,230,214,178,186,224,209,
-76,229,73,230,58,224,44,219,31,214,17,209,1,204,1,196,4,197,13,197,22,196,28,194,32,189,34,180,34,-65,33,-79,30,-88,24,-94,14,-98,0,-100,0,-107,120,-107,120,-100,101,-99,88,-95,81,-89,77,-78,76,-62,76,17,86,8,96,2,107,-1,117,-3,129,-4,163,1,191,19,213,47,227,82,232,123,228,158,216,188,198,210,175,225,148,230,132,228,117,224,103,216,89,205,76,190,16383,16383,76,167,79,176,87,185,99,193,113,198,127,200,148,195,165,183,178,163,186,136,189,103,186,73,178,47,165,27,148,14,128,10,113,12,99,18,87,26,79,35,76,44,207,78,193,60,180,46,167,38,153,33,137,31,111,36,89,49,73,69,63,96,59,128,62,157,71,182,86,200,105,212,127,216,137,215,144,212,149,208,153,201,156,191,160,180,163,172,167,166,171,161,177,158,184,157,191,158,197,161,202,166,206,172,207,179,203,195,192,209,175,220,154,227,130,230,116,229,102,226,88,221,75,213,62,204,63,204,48,189,36,172,28,152,22,130,21,106,25,70,38,39,58,15,84,0,116,-4,128,-3,140,-1,152,3,163,9,173,16,182,24,189,32,197,43,205,57,214,74,213,155,210,225,7,225,4,155,12,155,17,175,24,191,35,202,
-30,-88,24,-94,120,-107,120,-107,24,-94,14,-98,120,-107,14,-98,0,-100,6,197,8,197,17,209,17,209,8,197,11,197,17,209,11,197,13,197,13,197,22,196,17,209,17,209,22,196,31,214,17,209,1,204,4,197,17,209,4,197,6,197,79,35,76,44,86,8,86,8,76,44,76,17,77,-78,76,-62,44,219,77,-78,44,219,34,169,34,169,44,219,34,180,22,196,28,194,31,214,31,214,28,194,32,189,31,214,32,189,44,219,44,219,32,189,34,180,76,190,76,229,73,230,76,190,73,230,76,-62,76,190,76,-62,76,167,76,190,76,167,79,176,76,190,79,176,89,205,232,123,228,158,227,82,227,82,228,158,216,188,227,82,216,188,213,47,213,47,216,188,198,210,213,47,198,210,191,19,191,19,198,210,189,103,191,19,189,103,186,73,191,19,186,73,178,47,198,210,175,225,178,163,198,210,178,163,186,136,198,210,186,136,189,103,132,228,127,200,148,195,132,228,148,195,148,230,148,230,148,195,165,183,148,230,165,183,175,225,175,225,165,183,178,163,128,10,129,-4,148,14,148,14,129,-4,163,1,148,14,163,1,165,27,165,27,163,1,191,19,165,27,191,19,178,47,120,-107,120,-100,101,-99,120,-107,101,-99,88,-95,120,-107,88,-95,33,-79,120,-107,33,-79,30,-88,58,224,44,219,76,-62,58,224,76,-62,73,230,34,-65,33,-79,88,-95,34,-65,88,-95,81,-89,34,-65,81,-89,77,-78,34,-65,77,-78,34,169,79,176,87,185,89,205,89,205,87,185,99,193,89,205,99,193,103,216,103,216,99,193,113,198,103,216,113,198,117,224,117,224,113,198,127,200,117,224,127,200,132,228,113,12,99,18,107,-1,113,12,107,-1,117,-3,113,12,117,-3,128,10,79,35,86,8,87,26,87,26,86,8,96,2,87,26,96,2,99,18,99,18,96,2,107,-1,129,-4,128,10,117,-3,4,197,1,204,1,196,120,-107,0,-100,0,-107,
-207,78,193,60,180,46,167,38,153,33,137,31,111,36,89,49,73,69,63,96,59,128,62,157,71,182,86,200,105,212,127,216,137,215,144,212,149,208,153,201,156,191,160,180,163,172,167,166,171,161,177,158,184,157,191,158,197,161,202,166,206,172,207,179,203,195,192,209,175,220,154,227,130,230,116,229,102,226,88,221,75,213,62,204,63,204,48,189,36,172,28,152,22,130,21,106,25,70,38,39,58,15,84,0,116,-4,128,-3,140,-1,152,3,163,9,173,16,182,24,189,32,197,43,205,57,214,74,213,155,210,225,7,225,4,155,12,155,17,175,24,191,35,202,50,209,70,211,77,211,82,209,85,207,87,202,88,195,88,40,87,25,84,16,78,11,69,9,56,7,56,0,161,0,161,7,148,9,139,13,133,18,130,26,129,36,129,195,130,201,131,206,134,209,139,210,146,211,166,209,182,202,192,191,200,175,204,155,242,225,175,225,175,218,184,217,190,216,195,213,198,210,199,205,199,201,198,198,198,195,197,193,145,55,84,184,83,188,79,196,78,201,78,204,79,209,82,212,87,215,95,217,107,218,
-89,49,73,69,84,0,84,0,73,69,63,96,84,0,63,96,58,15,58,15,63,96,59,128,63,204,59,128,62,157,63,204,62,157,71,182,137,31,116,-4,128,-3,137,31,128,-3,140,-1,137,31,111,36,116,-4,89,49,84,0,116,-4,89,49,116,-4,111,36,203,195,192,209,197,161,203,195,197,161,202,166,203,195,202,166,206,172,203,195,206,172,207,179,192,209,175,220,177,158,192,209,177,158,184,157,192,209,184,157,191,158,192,209,191,158,197,161,175,220,154,227,156,191,175,220,156,191,160,180,175,220,160,180,163,172,175,220,163,172,167,166,175,220,167,166,171,161,175,220,171,161,177,158,144,212,149,208,154,227,154,227,149,208,153,201,154,227,153,201,156,191,130,230,127,216,137,215,130,230,137,215,154,227,154,227,137,215,144,212,182,24,189,32,193,60,193,60,189,32,197,43,193,60,197,43,207,78,207,78,197,43,205,57,207,78,205,57,214,74,140,-1,152,3,153,33,153,33,152,3,163,9,153,33,163,9,167,38,167,38,163,9,173,16,167,38,173,16,180,46,180,46,173,16,182,24,180,46,182,24,193,60,153,33,137,31,140,-1,105,212,127,216,116,229,105,212,116,229,102,226,105,212,102,226,88,221,105,212,88,221,86,200,75,213,63,204,71,182,75,213,71,182,86,200,75,213,86,200,88,221,48,189,36,172,38,39,48,189,38,39,58,15,48,189,58,15,59,128,48,189,59,128,63,204,28,152,22,130,25,70,28,152,25,70,38,39,28,152,38,39,36,172,127,216,130,230,116,229,25,70,22,130,21,106,
-213,155,210,225,7,225,4,155,12,155,17,175,24,191,35,202,50,209,70,211,77,211,82,209,85,207,87,202,88,195,88,40,87,25,84,16,78,11,69,9,56,7,56,0,161,0,161,7,148,9,139,13,133,18,130,26,129,36,129,195,130,201,131,206,134,209,139,210,146,211,166,209,182,202,192,191,200,175,204,155,242,225,175,225,175,218,184,217,190,216,195,213,198,210,199,205,199,201,198,198,198,195,197,193,145,55,84,184,83,188,79,196,78,201,78,204,79,209,82,212,87,215,95,217,107,218,107,225,4,225,4,218,11,217,23,211,27,206,31,200,99,59,105,47,111,34,116,22,120,13,122,6,119,-5,111,-24,100,-44,88,-60,
-84,16,78,11,161,0,161,0,78,11,69,9,161,0,69,9,56,7,24,191,35,202,7,225,7,225,35,202,50,209,7,225,50,209,70,211,70,211,77,211,210,225,210,225,77,211,82,209,210,225,82,209,85,207,85,207,87,202,210,225,210,225,87,202,139,210,210,225,139,210,146,211,146,211,166,209,210,225,210,225,166,209,182,202,210,225,182,202,192,191,210,225,192,191,200,175,210,225,200,175,204,155,210,225,204,155,213,155,129,36,129,195,88,195,88,195,129,195,130,201,88,195,130,201,131,206,88,195,131,206,134,209,88,195,134,209,139,210,88,195,139,210,87,202,88,195,130,26,129,36,210,225,7,225,70,211,7,225,4,155,12,155,7,225,12,155,17,175,7,225,17,175,24,191,161,0,161,7,148,9,161,0,148,9,139,13,161,0,139,13,88,40,161,0,88,40,87,25,161,0,87,25,84,16,88,40,139,13,133,18,88,40,133,18,130,26,88,40,130,26,88,195,161,0,56,7,56,0,
-242,225,175,225,175,218,184,217,190,216,195,213,198,210,199,205,199,201,198,198,198,195,197,193,145,55,84,184,83,188,79,196,78,201,78,204,79,209,82,212,87,215,95,217,107,218,107,225,4,225,4,218,11,217,23,211,27,206,31,200,99,59,105,47,111,34,116,22,120,13,122,6,119,-5,111,-24,100,-44,88,-60,75,-66,70,-66,64,-64,60,-63,55,-60,49,-58,39,-56,33,-56,27,-57,21,-60,16,-65,13,-72,12,-79,14,-88,18,-96,26,-102,35,-106,47,-108,68,-105,86,-94,102,-76,118,-48,134,-11,217,192,221,202,225,208,230,213,235,216,242,218,190,330,186,331,172,325,146,315,132,310,117,305,117,297,119,298,129,298,138,297,144,295,147,290,149,281,150,270,150,204,144,212,136,219,127,225,116,229,104,230,76,225,53,209,36,185,25,153,22,113,23,89,27,66,32,46,41,29,51,15,60,8,69,2,79,-1,91,-3,103,-4,115,-3,126,0,136,6,144,13,150,22,150,-65,149,-79,146,-88,140,-94,129,-98,114,-100,114,-107,233,-107,233,-100,214,-99,202,-95,194,-89,191,-78,190,-62,190,22,195,13,203,6,213,0,224,-3,236,-4,249,-3,260,-1,270,2,279,8,287,15,298,29,306,46,313,66,316,89,
-67,-65,68,-105,70,-66,70,-66,68,-105,86,-94,70,-66,86,-94,73,-66,73,-66,86,-94,75,-66,88,-60,75,-66,86,-94,88,-60,86,-94,102,-76,31,200,78,201,78,204,78,204,79,209,31,200,31,200,79,209,82,212,31,200,82,212,107,225,107,225,82,212,87,215,107,225,87,215,95,217,95,217,107,218,107,225,107,225,4,225,11,217,107,225,11,217,17,214,107,225,17,214,23,211,107,225,23,211,27,206,107,225,27,206,31,200,122,6,134,-11,145,55,145,55,134,-11,217,192,145,55,217,192,197,193,197,193,217,192,198,195,242,225,175,225,184,217,242,225,184,217,190,216,242,225,190,216,195,213,242,225,195,213,198,210,242,225,198,210,199,205,242,225,199,205,230,213,242,225,230,213,235,216,242,225,235,216,242,218,199,205,217,192,221,202,199,205,221,202,225,208,199,205,225,208,230,213,199,204,199,201,217,192,199,204,217,192,199,205,198,198,198,195,217,192,198,198,217,192,199,201,111,34,116,22,145,55,145,55,116,22,120,13,145,55,120,13,122,6,145,55,84,184,99,59,145,55,99,59,105,47,145,55,105,47,111,34,99,59,84,184,83,188,99,59,83,188,81,192,99,59,81,192,79,196,99,59,79,196,78,201,99,59,78,201,31,200,119,-5,111,-24,118,-48,119,-5,118,-48,134,-11,119,-5,134,-11,122,6,102,-76,118,-48,111,-24,102,-76,111,-24,100,-44,102,-76,100,-44,88,-60,68,-105,67,-65,64,-64,68,-105,64,-64,60,-63,68,-105,60,-63,55,-60,68,-105,55,-60,49,-58,68,-105,49,-58,47,-108,49,-58,44,-57,47,-108,47,-108,44,-57,39,-56,47,-108,39,-56,35,-106,35,-106,39,-56,33,-56,35,-106,33,-56,27,-57,35,-106,27,-57,26,-102,26,-102,27,-57,21,-60,26,-102,21,-60,18,-96,18,-96,21,-60,16,-65,18,-96,16,-65,14,-88,14,-88,16,-65,13,-72,14,-88,13,-72,12,-79,184,217,175,225,175,218,11,217,4,225,4,218,
-190,330,186,331,172,325,146,315,132,310,117,305,117,297,119,298,129,298,138,297,144,295,147,290,149,281,150,270,150,204,144,212,136,219,127,225,116,229,104,230,76,225,53,209,36,185,25,153,22,113,23,89,27,66,32,46,41,29,51,15,60,8,69,2,79,-1,91,-3,103,-4,115,-3,126,0,136,6,144,13,150,22,150,-65,149,-79,146,-88,140,-94,129,-98,114,-100,114,-107,233,-107,233,-100,214,-99,202,-95,194,-89,191,-78,190,-62,190,22,195,13,203,6,213,0,224,-3,236,-4,249,-3,260,-1,270,2,279,8,287,15,298,29,306,46,313,66,316,89,318,113,314,153,303,185,286,209,263,225,235,230,223,229,212,225,203,219,195,212,190,204,16383,16383,190,179,192,188,198,197,207,206,219,212,233,215,248,209,260,194,268,172,273,146,275,117,274,99,273,82,271,66,267,51,263,38,258,29,253,21,247,15,240,11,233,10,219,13,207,19,198,28,192,38,190,47,16383,16383,150,47,147,38,141,28,132,19,120,13,105,10,99,11,92,15,86,21,81,29,76,38,72,51,68,66,66,82,65,99,65,117,66,146,71,172,80,194,91,209,105,215,120,212,132,206,141,197,147,187,150,177,238,0,238,7,229,8,221,12,213,18,205,26,197,37,133,136,175,195,181,203,188,209,197,214,215,218,215,225,136,225,136,218,144,217,150,215,154,213,156,210,156,201,154,195,150,187,145,178,138,169,124,149,116,162,108,174,101,185,97,194,94,201,93,206,93,210,96,213,100,216,106,217,114,218,114,225,11,225,11,218,15,218,23,217,31,214,38,208,45,200,54,187,54,188,100,115,45,32,37,22,30,15,23,11,16,9,7,7,7,0,79,0,79,7,72,8,66,9,62,11,60,13,60,19,61,23,63,27,65,33,69,39,108,100,155,28,156,27,156,25,157,23,157,15,155,12,152,9,146,8,137,7,137,0,251,225,146,225,146,218,159,216,168,212,174,207,177,199,178,189,178,39,177,29,174,22,170,17,164,15,157,14,104,14,97,15,92,17,88,22,85,29,84,39,84,188,85,199,88,207,94,213,103,216,116,218,116,225,12,225,12,218,25,216,33,214,39,209,42,201,42,26,39,16,33,11,24,8,12,7,12,0,199,0,210,-3,221,-14,232,-34,243,-68,251,-68,251,7,238,8,229,11,224,16,221,25,220,40,220,186,221,199,223,208,229,213,238,216,251,218,
-69,2,79,-1,72,51,72,51,79,-1,76,38,81,29,76,38,79,-1,81,29,79,-1,91,-3,150,177,150,47,150,22,150,22,150,47,147,38,150,22,147,38,144,13,144,13,147,38,141,28,144,13,141,28,136,6,136,6,141,28,132,19,136,6,132,19,126,0,126,0,132,19,120,13,126,0,120,13,115,-3,115,-3,120,13,105,10,105,10,99,11,103,-4,103,-4,99,11,92,15,103,-4,92,15,91,-3,91,-3,92,15,86,21,91,-3,86,21,81,29,150,270,150,204,150,22,150,22,150,204,150,177,150,177,150,204,147,187,147,187,150,204,144,212,147,187,144,212,141,197,141,197,144,212,136,219,141,197,136,219,132,206,132,206,136,219,127,225,132,206,127,225,120,212,120,212,127,225,116,229,120,212,116,229,105,215,66,146,71,172,76,225,76,225,71,172,80,194,76,225,80,194,104,230,104,230,80,194,91,209,104,230,91,209,105,215,76,225,53,209,66,146,66,146,53,209,65,117,65,99,65,117,60,8,65,99,60,8,69,2,41,29,51,15,53,209,53,209,51,15,60,8,53,209,60,8,65,117,36,185,25,153,27,66,36,185,27,66,32,46,36,185,32,46,41,29,36,185,41,29,53,209,25,153,22,113,23,89,25,153,23,89,27,66,146,-88,140,-94,233,-107,233,-107,140,-94,129,-98,233,-107,129,-98,114,-100,122,298,124,298,132,310,132,310,124,298,126,298,132,310,126,298,129,298,129,298,138,297,132,310,132,310,138,297,146,315,132,310,117,305,119,298,132,310,119,298,122,298,192,38,190,47,195,13,195,13,190,47,190,22,191,-78,190,-62,159,320,191,-78,159,320,150,22,150,22,159,320,150,270,138,297,144,295,146,315,146,315,144,295,147,290,146,315,147,290,159,320,159,320,147,290,149,281,159,320,149,281,150,270,190,204,190,330,186,331,190,204,186,331,190,-62,190,204,190,-62,190,179,190,204,190,179,195,212,274,99,273,82,279,8,279,8,273,82,271,66,279,8,271,66,270,2,270,2,271,66,267,51,270,2,267,51,263,38,263,38,258,29,260,-1,260,-1,258,29,253,21,260,-1,253,21,249,-3,249,-3,253,21,247,15,249,-3,247,15,240,11,213,0,224,-3,219,13,219,13,224,-3,233,10,240,11,233,10,236,-4,240,11,236,-4,249,-3,314,153,303,185,306,46,314,153,306,46,313,66,314,153,313,66,316,89,314,153,316,89,318,113,274,99,279,8,275,117,275,117,279,8,286,209,286,209,279,8,287,15,286,209,287,15,303,185,303,185,287,15,298,29,303,185,298,29,306,46,248,209,260,194,263,225,263,225,260,194,268,172,263,225,268,172,286,209,286,209,268,172,273,146,286,209,273,146,275,117,263,225,235,230,248,209,248,209,235,230,233,215,219,212,233,215,223,229,219,212,223,229,212,225,263,38,260,-1,270,2,233,-107,233,-100,214,-99,233,-107,214,-99,202,-95,233,-107,202,-95,149,-79,233,-107,149,-79,146,-88,172,325,159,320,190,-62,172,325,190,-62,186,331,194,-89,191,-78,150,22,194,-89,150,22,150,-65,194,-89,150,-65,202,-95,69,2,72,51,68,66,69,2,68,66,66,82,69,2,66,82,65,99,192,38,195,13,198,28,198,28,195,13,203,6,198,28,203,6,207,19,207,19,203,6,213,0,207,19,213,0,219,13,190,179,192,188,195,212,195,212,192,188,198,197,195,212,198,197,203,219,203,219,198,197,207,206,203,219,207,206,212,225,212,225,207,206,219,212,235,230,223,229,233,215,233,10,224,-3,236,-4,115,-3,105,10,103,-4,119,298,117,305,117,297,233,-107,114,-100,114,-107,149,-79,202,-95,150,-65,105,215,116,229,104,230,
-238,0,238,7,229,8,221,12,213,18,205,26,197,37,133,136,175,195,181,203,188,209,197,214,215,218,215,225,136,225,136,218,144,217,150,215,154,213,156,210,156,201,154,195,150,187,145,178,138,169,124,149,116,162,108,174,101,185,97,194,94,201,93,206,93,210,96,213,100,216,106,217,114,218,114,225,11,225,11,218,15,218,23,217,31,214,38,208,45,200,54,187,54,188,100,115,45,32,37,22,30,15,23,11,16,9,7,7,7,0,79,0,79,7,72,8,66,9,62,11,60,13,60,19,61,23,63,27,65,33,69,39,108,100,155,28,156,27,156,25,157,23,157,15,155,12,152,9,146,8,137,7,137,0,251,225,146,225,146,218,159,216,168,212,174,207,177,199,178,189,178,39,177,29,174,22,170,17,164,15,157,14,104,14,97,15,92,17,88,22,85,29,84,39,84,188,85,199,88,207,94,213,103,216,116,218,116,225,12,225,12,218,25,216,33,214,39,209,42,201,42,26,39,16,33,11,24,8,12,7,12,0,199,0,210,-3,221,-14,232,-34,243,-68,251,-68,251,7,238,8,229,11,224,16,221,25,220,40,220,186,221,199,223,208,229,213,238,216,251,218,244,225,139,225,139,218,152,216,161,212,167,207,170,200,171,190,171,118,166,116,158,113,148,110,136,108,123,107,106,108,94,112,87,120,83,131,81,147,81,186,
-30,15,23,11,79,0,79,0,23,11,16,9,79,0,16,9,7,7,31,214,38,208,114,225,114,225,38,208,45,200,114,225,45,200,54,188,54,188,45,200,54,187,54,187,100,115,93,206,93,206,93,210,54,187,54,187,93,210,96,213,54,187,96,213,114,225,114,225,96,213,100,216,114,225,100,216,106,217,30,15,79,0,37,22,37,22,79,0,62,11,37,22,62,11,45,32,45,32,62,11,60,13,45,32,60,13,60,17,60,17,60,19,45,32,45,32,60,19,61,23,45,32,61,23,63,27,106,217,114,218,114,225,114,225,11,225,15,218,114,225,15,218,23,217,114,225,23,217,31,214,138,169,124,149,133,136,138,169,133,136,175,195,138,169,175,195,145,178,215,225,136,225,144,217,215,225,144,217,150,215,215,225,150,215,154,213,215,225,154,213,156,210,215,225,156,210,156,206,215,225,156,206,188,209,215,225,188,209,197,214,215,225,197,214,206,216,215,225,206,216,215,218,175,195,181,203,156,206,175,195,156,206,156,201,175,195,156,201,154,195,175,195,154,195,150,187,175,195,150,187,145,178,155,12,152,9,238,0,238,0,152,9,146,8,238,0,146,8,137,7,157,20,238,0,221,12,157,20,221,12,213,18,157,20,213,18,205,26,157,20,205,26,197,37,157,20,197,37,157,21,197,37,133,136,155,28,197,37,155,28,156,27,197,37,156,27,156,25,197,37,156,25,157,23,197,37,157,23,157,21,133,136,124,149,155,28,155,28,124,149,116,162,155,28,116,162,108,100,108,100,116,162,108,174,108,100,108,174,101,185,100,115,45,32,63,27,100,115,63,27,65,33,100,115,65,33,69,39,100,115,69,39,108,100,100,115,108,100,101,185,100,115,101,185,97,194,100,115,97,194,94,201,100,115,94,201,93,206,229,8,221,12,238,0,229,8,238,0,238,7,157,15,155,12,238,0,157,15,238,0,157,20,79,0,79,7,72,8,79,0,72,8,66,9,79,0,66,9,62,11,79,0,7,7,7,0,238,0,137,7,137,0,144,217,136,225,136,218,188,209,156,206,181,203,15,218,11,225,11,218,114,225,54,188,54,187,
-251,225,146,225,146,218,159,216,168,212,174,207,177,199,178,189,178,39,177,29,174,22,170,17,164,15,157,14,104,14,97,15,92,17,88,22,85,29,84,39,84,188,85,199,88,207,94,213,103,216,116,218,116,225,12,225,12,218,25,216,33,214,39,209,42,201,42,26,39,16,33,11,24,8,12,7,12,0,199,0,210,-3,221,-14,232,-34,243,-68,251,-68,251,7,238,8,229,11,224,16,221,25,220,40,220,186,221,199,223,208,229,213,238,216,251,218,244,225,139,225,139,218,152,216,161,212,167,207,170,200,171,190,171,118,166,116,158,113,148,110,136,108,123,107,106,108,94,112,87,120,83,131,81,147,81,186,82,199,86,208,91,213,100,216,113,218,113,225,9,225,9,218,22,216,30,213,36,209,39,200,40,186,40,144,43,121,52,105,66,97,85,93,107,92,124,93,139,96,152,100,162,104,171,108,171,27,168,18,162,13,153,9,141,7,141,0,244,0,244,7,231,9,223,12,217,17,215,25,214,39,
-39,16,33,11,187,0,187,0,33,11,24,8,187,0,24,8,12,7,116,225,12,225,25,216,116,225,25,216,33,214,116,225,33,214,39,209,116,225,39,209,42,201,116,225,42,201,42,188,116,225,42,188,94,213,116,225,94,213,103,216,116,225,103,216,116,218,92,17,88,22,42,41,42,41,88,22,85,29,42,41,85,29,42,188,42,188,85,29,84,39,42,188,84,39,84,188,42,188,84,188,85,199,42,188,85,199,88,207,42,188,88,207,94,213,251,225,146,225,159,216,251,225,159,216,168,212,251,225,168,212,174,207,251,225,174,207,177,199,251,225,177,199,178,189,251,225,178,189,229,213,251,225,229,213,238,216,251,225,238,216,251,218,224,16,221,25,221,-14,221,-14,221,25,220,40,220,40,220,186,210,-3,210,-3,220,186,199,0,178,189,187,0,221,199,221,199,187,0,199,0,221,199,199,0,220,186,223,208,229,213,178,189,223,208,178,189,221,199,251,-68,251,7,243,-68,243,-68,251,7,238,8,243,-68,238,8,232,-34,232,-34,238,8,229,11,232,-34,229,11,224,16,174,22,170,17,187,0,187,0,170,17,164,15,187,0,164,15,157,14,187,0,178,189,178,39,187,0,178,39,177,29,187,0,177,29,174,22,42,26,39,16,97,15,97,15,39,16,187,0,97,15,187,0,104,14,104,14,187,0,157,14,42,26,97,15,92,17,42,26,92,17,42,41,187,0,12,7,12,0,221,-14,220,40,210,-3,224,16,221,-14,232,-34,159,216,146,225,146,218,25,216,12,225,12,218,42,188,42,201,42,187,
-244,225,139,225,139,218,152,216,161,212,167,207,170,200,171,190,171,118,166,116,158,113,148,110,136,108,123,107,106,108,94,112,87,120,83,131,81,147,81,186,82,199,86,208,91,213,100,216,113,218,113,225,9,225,9,218,22,216,30,213,36,209,39,200,40,186,40,144,43,121,52,105,66,97,85,93,107,92,124,93,139,96,152,100,162,104,171,108,171,27,168,18,162,13,153,9,141,7,141,0,244,0,244,7,231,9,223,12,217,17,215,25,214,39,214,199,217,208,223,213,231,216,244,218,373,225,270,225,270,218,282,216,291,213,296,207,299,200,300,189,300,39,299,29,297,22,293,17,287,15,278,14,235,14,228,15,221,17,217,22,214,29,213,39,213,189,214,199,218,207,224,213,232,216,243,218,243,225,141,225,141,218,152,216,160,213,166,207,170,199,171,189,171,39,170,29,168,22,164,17,158,15,150,14,107,14,99,15,93,17,88,22,85,29,84,39,84,189,85,199,88,207,93,212,102,216,114,218,114,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,
-113,218,113,218,100,216,100,216,113,218,113,225,100,216,113,225,91,213,91,213,113,225,40,186,91,213,40,186,86,208,86,208,40,186,43,121,86,208,43,121,82,199,82,199,43,121,52,105,82,199,52,105,66,97,87,120,83,131,85,93,85,93,83,131,81,147,81,147,81,186,66,97,66,97,81,186,82,199,30,213,36,209,113,225,113,225,36,209,39,200,113,225,39,200,40,186,22,216,30,213,113,225,22,216,113,225,9,225,22,216,9,225,9,218,244,7,231,9,244,0,244,0,231,9,223,12,244,0,223,12,171,39,171,39,223,12,217,17,171,39,217,17,171,108,171,108,171,118,166,116,171,108,166,116,162,104,162,104,166,116,158,113,162,104,158,113,152,100,152,100,158,113,148,110,152,100,148,110,139,96,139,96,148,110,136,108,139,96,136,108,124,93,124,93,136,108,123,107,107,92,124,93,123,107,107,92,123,107,106,108,107,92,106,108,94,112,107,92,94,112,87,120,107,92,87,120,85,93,244,225,139,225,152,216,244,225,152,216,161,212,244,225,161,212,167,207,244,225,167,207,170,200,244,225,170,200,171,190,244,225,171,190,223,213,244,225,223,213,231,216,244,225,231,216,244,218,214,39,214,186,171,108,171,108,214,186,214,199,171,108,214,199,217,208,171,190,171,108,217,208,171,190,217,208,223,213,171,108,217,17,215,25,171,108,215,25,214,39,244,0,171,39,171,27,244,0,171,27,168,18,244,0,168,18,162,13,244,0,162,13,153,9,244,0,153,9,141,7,244,0,141,7,141,0,43,121,40,186,40,144,171,118,171,108,171,190,152,216,139,225,139,218,85,93,81,147,66,97,
-373,225,270,225,270,218,282,216,291,213,296,207,299,200,300,189,300,39,299,29,297,22,293,17,287,15,278,14,235,14,228,15,221,17,217,22,214,29,213,39,213,189,214,199,218,207,224,213,232,216,243,218,243,225,141,225,141,218,152,216,160,213,166,207,170,199,171,189,171,39,170,29,168,22,164,17,158,15,150,14,107,14,99,15,93,17,88,22,85,29,84,39,84,189,85,199,88,207,93,212,102,216,114,218,114,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,372,0,372,7,360,8,351,11,345,16,342,25,342,198,345,207,351,213,360,216,373,218,373,225,270,225,270,218,282,216,291,213,296,207,299,200,300,189,300,39,299,29,297,22,293,17,287,15,278,14,235,14,228,15,221,17,217,22,214,29,213,39,213,189,214,199,218,207,224,212,232,216,243,218,243,225,141,225,141,218,142,218,152,216,160,212,166,207,170,199,171,189,171,39,170,29,168,22,164,17,158,15,150,14,107,14,99,15,93,17,88,22,85,29,84,39,84,189,85,199,87,207,93,212,101,216,114,218,114,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,325,0,335,-5,345,-17,354,-37,364,-68,372,-68,372,7,360,8,351,11,345,15,
-39,16,33,11,372,0,372,0,33,11,25,9,372,0,25,9,12,7,114,225,12,225,25,216,114,225,25,216,33,212,114,225,33,212,39,206,114,225,39,206,42,197,114,225,42,197,42,183,114,225,42,183,93,212,114,225,93,212,102,216,114,225,102,216,114,218,93,17,88,22,42,40,42,40,88,22,85,29,42,40,85,29,42,183,42,183,85,29,84,39,42,183,84,39,84,189,42,183,84,189,85,199,42,183,85,199,88,207,42,183,88,207,93,212,93,17,42,25,99,15,99,15,42,25,39,16,99,15,39,16,107,14,107,14,39,16,372,0,107,14,372,0,150,14,150,14,372,0,158,15,243,225,141,225,152,216,243,225,152,216,160,213,243,225,160,213,166,207,243,225,166,207,170,199,243,225,170,199,171,189,243,225,171,189,224,213,243,225,224,213,232,216,243,225,232,216,243,218,213,39,213,189,171,189,171,189,213,189,214,199,171,189,214,199,218,207,221,17,217,22,171,39,171,39,217,22,214,29,171,39,214,29,171,189,297,22,293,17,372,0,372,0,293,17,287,15,372,0,287,15,278,14,373,225,270,225,282,216,373,225,282,216,291,213,373,225,291,213,296,207,373,225,296,207,299,200,373,225,299,200,300,189,373,225,300,189,351,213,373,225,351,213,360,216,373,225,360,216,373,218,342,40,342,183,300,189,300,189,342,183,342,198,300,189,342,198,345,207,351,11,345,16,300,39,300,39,345,16,342,25,300,39,342,25,300,189,372,0,372,7,360,8,372,0,360,8,351,11,372,0,351,11,299,29,372,0,299,29,297,22,372,0,278,14,235,14,372,0,235,14,228,15,372,0,228,15,164,17,372,0,164,17,158,15,170,29,168,22,228,15,170,29,228,15,221,17,170,29,221,17,171,39,372,0,12,7,12,0,42,25,93,17,42,40,164,17,228,15,168,22,171,189,214,29,213,39,299,29,351,11,300,39,300,189,342,25,342,40,282,216,270,225,270,218,351,213,300,189,345,207,152,216,141,225,141,218,224,213,171,189,218,207,25,216,12,225,12,218,
-373,225,270,225,270,218,282,216,291,213,296,207,299,200,300,189,300,39,299,29,297,22,293,17,287,15,278,14,235,14,228,15,221,17,217,22,214,29,213,39,213,189,214,199,218,207,224,212,232,216,243,218,243,225,141,225,141,218,142,218,152,216,160,212,166,207,170,199,171,189,171,39,170,29,168,22,164,17,158,15,150,14,107,14,99,15,93,17,88,22,85,29,84,39,84,189,85,199,87,207,93,212,101,216,114,218,114,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,325,0,335,-5,345,-17,354,-37,364,-68,372,-68,372,7,360,8,351,11,345,15,342,25,342,198,345,207,351,213,360,216,373,218,126,126,126,199,129,207,134,212,143,216,156,218,156,225,8,225,4,161,12,161,18,181,25,195,35,205,46,209,61,211,68,211,74,209,79,207,83,202,84,195,84,40,83,25,80,16,75,11,66,9,52,7,52,0,169,0,196,3,220,10,238,23,249,40,253,62,249,86,235,105,215,117,188,124,158,126,16383,16383,126,112,148,112,167,111,183,107,196,98,205,84,208,64,205,43,196,29,182,20,164,15,142,14,135,14,130,16,127,19,126,23,126,30,323,0,323,8,310,10,301,13,295,18,293,26,292,36,292,199,295,207,300,212,309,216,323,218,323,225,219,225,219,218,232,216,241,212,246,206,249,197,250,183,250,40,249,25,246,16,241,11,232,9,219,7,
-39,16,33,11,315,0,315,0,33,11,25,9,315,0,25,9,12,7,114,225,12,225,25,216,114,225,25,216,33,212,114,225,33,212,39,206,114,225,39,206,42,197,114,225,42,197,42,183,114,225,42,183,93,212,114,225,93,212,101,216,114,225,101,216,114,218,93,17,88,22,42,40,42,40,88,22,85,29,42,40,85,29,42,183,42,183,85,29,84,39,42,183,84,39,84,189,42,183,84,189,85,199,42,183,85,199,87,207,42,183,87,207,93,212,93,17,42,25,99,15,99,15,42,25,39,16,99,15,39,16,107,14,107,14,39,16,315,0,107,14,315,0,150,14,150,14,315,0,158,15,243,225,141,225,142,218,243,225,142,218,152,216,243,225,152,216,160,212,243,225,160,212,166,207,243,225,166,207,170,199,243,225,170,199,171,189,243,225,171,189,224,212,243,225,224,212,232,216,243,225,232,216,243,218,213,39,213,189,171,189,171,189,213,189,214,199,171,189,214,199,218,207,221,17,217,22,171,39,171,39,217,22,214,29,171,39,214,29,171,189,373,225,270,225,282,216,373,225,282,216,291,213,373,225,291,213,296,207,373,225,296,207,299,200,373,225,299,200,300,189,373,225,300,189,351,213,373,225,351,213,360,216,373,225,360,216,373,218,345,15,342,25,345,-17,345,-17,342,25,342,40,342,40,342,183,335,-5,335,-5,342,183,325,0,300,189,315,0,342,198,342,198,315,0,325,0,342,198,325,0,342,183,345,207,351,213,300,189,345,207,300,189,342,198,372,-68,372,7,364,-68,364,-68,372,7,360,8,364,-68,360,8,354,-37,354,-37,360,8,351,11,354,-37,351,11,345,15,297,22,293,17,315,0,315,0,293,17,287,15,315,0,287,15,278,14,315,0,300,189,300,39,315,0,300,39,299,29,315,0,299,29,297,22,315,0,278,14,235,14,315,0,235,14,228,15,315,0,228,15,168,22,315,0,168,22,164,17,315,0,164,17,158,15,170,29,168,22,228,15,170,29,228,15,221,17,170,29,221,17,171,39,315,0,12,7,12,0,42,25,93,17,42,40,171,189,214,29,213,39,345,-17,342,40,335,-5,345,15,345,-17,354,-37,282,216,270,225,270,218,142,218,141,225,141,218,224,212,171,189,218,207,25,216,12,225,12,218,
-126,126,126,199,129,207,134,212,143,216,156,218,156,225,8,225,4,161,12,161,18,181,25,195,35,205,46,209,61,211,68,211,74,209,79,207,83,202,84,195,84,40,83,25,80,16,75,11,66,9,52,7,52,0,169,0,196,3,220,10,238,23,249,40,253,62,249,86,235,105,215,117,188,124,158,126,16383,16383,126,112,148,112,167,111,183,107,196,98,205,84,208,64,205,43,196,29,182,20,164,15,142,14,135,14,130,16,127,19,126,23,126,30,323,0,323,8,310,10,301,13,295,18,293,26,292,36,292,199,295,207,300,212,309,216,323,218,323,225,219,225,219,218,232,216,241,212,246,206,249,197,250,183,250,40,249,25,246,16,241,11,232,9,219,7,219,0,16383,16383,84,126,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,127,0,155,3,179,10,197,23,209,40,213,62,208,86,194,105,
-80,16,75,11,169,0,169,0,75,11,66,9,169,0,66,9,52,7,74,209,156,225,68,211,68,211,156,225,61,211,46,209,61,211,156,225,46,209,156,225,8,225,156,225,74,209,79,207,156,225,79,207,83,202,156,225,83,202,84,195,156,225,84,195,134,212,156,225,134,212,143,216,156,225,143,216,156,218,84,195,126,23,126,30,126,126,126,112,148,112,126,126,148,112,158,126,158,126,148,112,167,111,158,126,167,111,188,124,188,124,167,111,183,107,188,124,183,107,196,98,84,195,126,30,126,189,84,195,126,189,126,199,84,195,126,199,129,207,84,195,129,207,134,212,8,225,4,161,12,161,8,225,12,161,18,181,8,225,18,181,25,195,8,225,25,195,35,205,8,225,35,205,46,209,205,43,196,29,196,3,196,3,196,29,182,20,196,3,182,20,169,0,169,0,182,20,164,15,169,0,164,15,142,14,142,14,135,14,169,0,169,0,135,14,130,16,169,0,130,16,83,25,83,25,130,16,84,40,196,3,220,10,205,43,205,43,220,10,208,64,215,117,208,64,220,10,215,117,220,10,235,105,235,105,220,10,238,23,235,105,238,23,249,86,249,86,238,23,249,40,249,86,249,40,253,62,215,117,188,124,196,98,215,117,196,98,205,84,215,117,205,84,208,64,84,40,130,16,127,19,84,40,127,19,126,23,84,40,126,23,84,195,169,0,52,7,52,0,80,16,169,0,83,25,
-323,0,323,8,310,10,301,13,295,18,293,26,292,36,292,199,295,207,300,212,309,216,323,218,323,225,219,225,219,218,232,216,241,212,246,206,249,197,250,183,250,40,249,25,246,16,241,11,232,9,219,7,219,0,16383,16383,84,126,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,127,0,155,3,179,10,197,23,209,40,213,62,208,86,194,105,174,117,148,124,118,126,16383,16383,84,112,107,112,126,111,142,107,155,98,164,84,167,64,164,43,155,29,141,20,123,15,102,14,94,14,89,16,86,19,85,23,84,30,84,126,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,127,0,155,3,179,10,197,23,209,40,213,62,208,86,194,105,174,117,148,124,118,126,16383,16383,84,112,107,112,126,111,142,107,155,98,164,84,167,64,164,43,155,29,141,20,123,15,102,14,94,14,89,16,86,19,85,23,84,30,30,228,23,157,32,157,38,173,46,189,58,203,75,212,99,216,122,212,140,200,154,182,162,157,165,128,75,128,75,112,165,112,160,87,150,64,135,47,114,35,88,31,71,33,56,37,42,46,28,59,15,78,7,74,18,53,
-323,218,323,218,309,216,309,216,323,218,323,225,309,216,323,225,300,212,300,212,323,225,249,197,300,212,249,197,250,183,293,26,250,183,250,40,293,26,250,40,295,18,295,18,250,40,301,13,292,36,292,189,250,183,250,183,292,189,292,199,250,183,292,199,295,207,323,225,219,225,232,216,323,225,232,216,241,212,323,225,241,212,246,206,323,225,246,206,249,197,323,0,323,8,310,10,323,0,310,10,301,13,323,0,301,13,250,40,323,0,250,40,249,25,323,0,249,25,246,16,323,0,246,16,241,11,323,0,241,11,232,9,323,0,232,9,219,7,323,0,219,7,219,0,39,16,33,11,127,0,127,0,33,11,25,9,127,0,25,9,12,7,116,225,12,225,25,216,116,225,25,216,33,212,116,225,33,212,39,206,116,225,39,206,42,197,116,225,42,197,93,212,116,225,93,212,102,216,116,225,102,216,116,218,42,183,85,23,84,30,84,126,84,112,107,112,84,126,107,112,118,126,118,126,107,112,126,111,118,126,126,111,148,124,148,124,126,111,142,107,148,124,142,107,155,98,42,183,84,30,84,189,42,183,84,189,85,199,42,183,85,199,88,207,42,183,88,207,93,212,42,183,93,212,42,197,164,43,155,29,155,3,155,3,155,29,141,20,155,3,141,20,127,0,127,0,141,20,123,15,127,0,123,15,102,14,102,14,94,14,127,0,127,0,94,14,89,16,127,0,89,16,42,25,42,25,89,16,42,40,155,3,179,10,164,43,164,43,179,10,167,64,174,117,167,64,179,10,174,117,179,10,194,105,194,105,179,10,197,23,194,105,197,23,208,86,208,86,197,23,209,40,208,86,209,40,213,62,174,117,148,124,155,98,174,117,155,98,164,84,174,117,164,84,167,64,42,40,89,16,86,19,42,40,86,19,85,23,42,40,85,23,42,183,127,0,12,7,12,0,39,16,127,0,42,25,25,216,12,225,12,218,250,183,293,26,292,36,232,216,219,225,219,218,300,212,250,183,295,207,
-84,126,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,127,0,155,3,179,10,197,23,209,40,213,62,208,86,194,105,174,117,148,124,118,126,16383,16383,84,112,107,112,126,111,142,107,155,98,164,84,167,64,164,43,155,29,141,20,123,15,102,14,94,14,89,16,86,19,85,23,84,30,30,228,23,157,32,157,38,173,46,189,58,203,75,212,99,216,122,212,140,200,154,182,162,157,165,128,75,128,75,112,165,112,160,87,150,64,135,47,114,35,88,31,71,33,56,37,42,46,28,59,15,78,7,74,18,53,32,32,49,14,72,0,101,-4,136,1,165,16,187,41,200,73,205,110,201,147,189,179,169,206,140,223,102,230,92,230,84,229,63,222,59,220,56,218,52,217,48,217,
-39,16,33,11,127,0,127,0,33,11,25,9,127,0,25,9,12,7,116,225,12,225,25,216,116,225,25,216,33,212,116,225,33,212,39,206,116,225,39,206,42,197,116,225,42,197,93,212,116,225,93,212,102,216,116,225,102,216,116,218,42,183,85,23,84,30,84,126,84,112,107,112,84,126,107,112,118,126,118,126,107,112,126,111,118,126,126,111,148,124,148,124,126,111,142,107,148,124,142,107,155,98,42,183,84,30,84,189,42,183,84,189,85,199,42,183,85,199,88,207,42,183,88,207,93,212,42,183,93,212,42,197,164,43,155,29,155,3,155,3,155,29,141,20,155,3,141,20,127,0,127,0,141,20,123,15,127,0,123,15,102,14,102,14,94,14,127,0,127,0,94,14,89,16,127,0,89,16,42,25,42,25,89,16,42,40,155,3,179,10,164,43,164,43,179,10,167,64,174,117,167,64,179,10,174,117,179,10,194,105,194,105,179,10,197,23,194,105,197,23,208,86,208,86,197,23,209,40,208,86,209,40,213,62,174,117,148,124,155,98,174,117,155,98,164,84,174,117,164,84,167,64,42,40,89,16,86,19,42,40,86,19,85,23,42,40,85,23,42,183,127,0,12,7,12,0,39,16,127,0,42,25,25,216,12,225,12,218,
-30,228,23,157,32,157,38,173,46,189,58,203,75,212,99,216,122,212,140,200,154,182,162,157,165,128,75,128,75,112,165,112,160,87,150,64,135,47,114,35,88,31,71,33,56,37,42,46,28,59,15,78,7,74,18,53,32,32,49,14,72,0,101,-4,136,1,165,16,187,41,200,73,205,110,201,147,189,179,169,206,140,223,102,230,92,230,84,229,63,222,59,220,56,218,52,217,48,217,44,218,42,219,40,221,38,224,37,228,84,124,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,108,131,108,138,70,153,39,176,16,205,0,239,-4,276,1,308,17,331,43,346,76,352,116,346,154,331,186,308,210,278,225,243,230,207,225,177,211,154,189,138,160,131,124,16383,16383,306,102,304,70,296,44,284,25,
-59,220,56,218,58,203,58,203,56,218,52,217,58,203,52,217,48,217,48,217,44,218,46,189,46,189,44,218,42,219,46,189,42,219,40,221,30,228,32,157,37,228,37,228,32,157,38,173,37,228,38,173,38,224,38,224,38,173,46,189,38,224,46,189,40,221,15,78,18,53,28,59,28,59,18,53,32,32,28,59,32,32,42,46,42,46,32,32,49,14,42,46,49,14,56,37,56,37,49,14,72,0,56,37,72,0,71,33,71,33,72,0,88,31,114,35,88,31,101,-4,114,35,101,-4,136,1,99,216,92,230,84,229,99,216,84,229,78,227,99,216,78,227,75,212,99,216,102,230,92,230,75,212,78,227,72,225,75,212,72,225,66,223,75,212,66,223,63,222,75,212,63,222,59,220,75,212,59,220,58,203,48,217,46,189,58,203,75,128,165,112,165,128,165,128,165,112,165,16,165,128,165,16,169,206,205,110,201,147,200,73,200,73,201,147,189,179,200,73,189,179,187,41,187,41,189,179,169,206,187,41,169,206,165,16,169,206,140,223,140,200,169,206,140,200,154,182,169,206,154,182,162,157,169,206,162,157,165,128,122,212,140,200,140,223,122,212,140,223,102,230,122,212,102,230,99,216,165,112,160,87,165,16,165,16,160,87,150,64,165,16,150,64,136,1,136,1,150,64,135,47,136,1,135,47,114,35,88,31,72,0,101,-4,18,53,15,78,7,74,32,157,30,228,23,157,165,112,75,128,75,112,
-84,124,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,108,131,108,138,70,153,39,176,16,205,0,239,-4,276,1,308,17,331,43,346,76,352,116,346,154,331,186,308,210,278,225,243,230,207,225,177,211,154,189,138,160,131,124,16383,16383,306,102,304,70,296,44,284,25,268,13,248,9,237,10,227,13,218,18,210,25,203,34,193,51,185,70,180,91,177,113,176,137,179,164,186,186,199,202,215,212,234,216,246,215,257,211,266,206,274,199,281,191,290,177,297,161,302,142,305,122,306,102,224,225,121,225,91,224,65,219,45,210,31,193,26,167,30,148,40,131,55,118,74,109,97,104,37,31,32,25,26,19,19,14,11,9,2,7,2,0,64,0,142,103,151,103,151,25,148,16,143,11,135,8,123,7,123,0,224,0,224,8,211,10,202,13,197,18,194,26,193,40,193,183,194,198,197,207,202,213,211,216,224,218,16383,16383,151,117,131,117,111,119,94,125,82,135,74,148,71,165,75,185,85,198,99,206,117,210,136,211,142,211,147,209,149,206,151,202,151,195,193,286,191,294,188,301,182,306,175,310,167,311,160,310,153,306,148,301,144,294,143,286,144,278,147,272,153,266,159,263,167,262,175,263,182,266,188,272,191,278,193,286,16383,16383,
-39,16,33,11,116,0,116,0,33,11,25,9,116,0,25,9,12,7,116,225,12,225,25,216,116,225,25,216,33,212,116,225,33,212,39,206,116,225,39,206,42,197,116,225,42,197,93,212,116,225,93,212,102,216,116,225,102,216,116,218,138,160,131,124,131,108,131,108,131,124,84,124,131,108,84,124,84,108,85,26,84,36,42,183,85,26,42,183,42,40,42,183,84,36,84,189,42,183,84,189,85,199,42,183,85,199,88,207,42,183,88,207,93,212,42,183,93,212,42,197,116,0,116,7,102,9,116,0,102,9,93,13,116,0,93,13,42,40,116,0,42,40,42,25,116,0,42,25,39,16,42,40,93,13,88,18,42,40,88,18,85,26,180,91,176,16,185,70,185,70,176,16,205,0,185,70,205,0,193,51,193,51,205,0,203,34,210,25,203,34,205,0,210,25,205,0,239,-4,278,225,243,230,246,215,246,215,243,230,234,216,215,212,234,216,243,230,215,212,243,230,207,225,304,70,296,44,308,17,308,17,296,44,284,25,308,17,284,25,276,1,276,1,284,25,268,13,276,1,268,13,248,9,248,9,237,10,239,-4,239,-4,237,10,227,13,239,-4,227,13,218,18,257,211,266,206,278,225,278,225,266,206,274,199,278,225,274,199,281,191,281,191,290,177,308,210,308,210,290,177,297,161,308,210,297,161,302,142,346,154,331,186,331,43,346,154,331,43,346,76,346,154,346,76,352,116,304,70,308,17,306,102,306,102,308,17,308,210,308,210,308,17,331,43,308,210,331,43,331,186,308,210,302,142,305,122,308,210,305,122,306,102,308,210,278,225,281,191,248,9,239,-4,276,1,176,137,179,164,177,211,177,211,179,164,186,186,177,211,186,186,207,225,207,225,186,186,199,202,207,225,199,202,215,212,131,108,138,70,138,160,138,160,138,70,153,39,138,160,153,39,154,189,154,189,153,39,176,16,154,189,176,16,176,137,176,137,177,211,154,189,177,113,176,137,176,16,177,113,176,16,180,91,278,225,246,215,257,211,210,25,239,-4,218,18,116,0,12,7,12,0,25,216,12,225,12,218,
-224,225,121,225,91,224,65,219,45,210,31,193,26,167,30,148,40,131,55,118,74,109,97,104,37,31,32,25,26,19,19,14,11,9,2,7,2,0,64,0,142,103,151,103,151,25,148,16,143,11,135,8,123,7,123,0,224,0,224,8,211,10,202,13,197,18,194,26,193,40,193,183,194,198,197,207,202,213,211,216,224,218,16383,16383,151,117,131,117,111,119,94,125,82,135,74,148,71,165,75,185,85,198,99,206,117,210,136,211,142,211,147,209,149,206,151,202,151,195,193,286,191,294,188,301,182,306,175,310,167,311,160,310,153,306,148,301,144,294,143,286,144,278,147,272,153,266,159,263,167,262,175,263,182,266,188,272,191,278,193,286,16383,16383,93,286,92,294,88,301,83,306,76,310,68,311,60,310,54,306,48,301,45,294,44,286,45,278,48,272,53,266,60,263,68,262,76,263,83,266,88,272,92,278,93,286,16383,16383,210,82,196,63,182,48,167,39,150,33,132,31,102,37,80,53,66,77,58,106,55,137,209,137,208,152,205,165,202,176,
-26,19,19,14,64,0,64,0,19,14,11,9,64,0,11,9,2,7,97,104,64,0,142,103,97,104,142,103,111,119,97,104,111,119,94,125,97,104,94,125,82,135,97,104,82,135,74,148,97,104,74,148,74,109,85,198,91,224,75,185,75,185,91,224,65,219,75,185,65,219,71,165,71,165,74,109,74,148,26,167,30,148,31,193,31,193,30,148,40,131,31,193,40,131,45,210,45,210,40,131,55,118,45,210,55,118,65,219,65,219,55,118,74,109,65,219,74,109,71,165,148,16,143,11,224,0,224,0,143,11,135,8,224,0,135,8,123,7,147,209,224,225,142,211,142,211,224,225,136,211,117,210,136,211,121,225,117,210,121,225,99,206,99,206,121,225,91,224,99,206,91,224,85,198,224,8,211,10,224,0,224,0,211,10,202,13,224,0,202,13,151,38,151,38,202,13,197,18,151,38,197,18,151,103,151,103,197,18,151,117,151,103,151,117,142,103,142,103,151,117,131,117,142,103,131,117,111,119,64,0,97,104,37,31,64,0,37,31,32,25,64,0,32,25,26,19,224,225,147,209,149,206,224,225,149,206,151,202,224,225,151,202,151,195,224,225,151,195,202,213,224,225,202,213,211,216,224,225,211,216,224,218,193,40,193,183,151,195,151,195,193,183,194,198,151,195,194,198,197,207,151,195,194,26,193,40,224,225,121,225,136,211,151,117,197,18,194,26,151,117,194,26,151,195,151,25,148,16,224,0,151,25,224,0,151,38,224,0,123,7,123,0,202,213,151,195,197,207,64,0,2,7,2,0,
-266,59,253,44,242,34,234,29,228,26,222,25,216,28,216,31,215,33,216,38,217,44,218,49,220,55,221,61,247,151,249,159,252,180,252,186,250,202,245,214,236,223,224,228,208,230,189,227,169,216,147,196,123,165,99,123,98,123,133,252,205,278,211,300,139,273,146,296,148,306,151,315,153,324,156,332,158,340,155,342,143,337,131,333,116,329,98,325,76,320,76,312,85,312,92,311,99,309,103,306,104,301,104,293,103,290,103,286,93,257,45,239,40,218,87,234,23,0,65,0,78,41,88,72,98,97,109,117,121,137,137,159,152,177,167,191,180,200,190,203,198,202,203,199,207,194,209,188,209,175,207,161,206,155,204,150,185,78,182,66,178,54,175,41,173,31,172,23,174,13,177,5,183,0,190,-3,199,-4,211,-2,225,3,240,14,256,30,273,54,344,337,341,331,335,324,327,316,316,310,302,308,271,312,246,322,222,334,193,344,154,348,118,342,88,327,65,305,51,278,46,248,49,224,60,204,77,189,100,179,128,176,136,176,144,177,151,179,159,182,167,186,163,197,157,195,150,193,144,191,137,190,131,190,116,192,102,198,90,208,82,222,79,241,83,262,93,278,106,289,122,295,138,297,168,293,193,283,216,272,242,262,273,258,303,263,325,276,340,294,349,314,355,334,16383,16383,352,209,344,217,335,225,325,231,312,235,295,237,275,234,257,225,241,212,231,195,227,174,232,145,243,121,257,99,269,76,273,49,271,34,264,22,253,11,238,5,219,2,204,4,191,8,181,16,172,28,165,44,158,63,149,82,136,98,118,110,94,114,72,109,53,97,38,82,28,65,22,51,34,49,39,57,45,64,53,69,61,73,
-99,123,98,123,99,123,99,123,98,123,109,117,99,123,109,117,123,165,123,165,109,117,121,137,104,296,104,293,133,252,133,252,104,293,103,290,133,252,103,290,103,286,103,286,93,257,98,123,98,123,93,257,98,97,98,123,98,97,109,117,203,199,208,230,198,202,198,202,208,230,190,203,180,200,190,203,189,227,180,200,189,227,169,216,123,165,137,159,147,196,147,196,137,159,152,177,147,196,152,177,169,216,169,216,152,177,167,191,169,216,167,191,180,200,204,150,185,78,190,-3,204,150,190,-3,199,-4,204,150,199,-4,211,-2,204,150,211,-2,206,155,211,-2,216,31,215,33,215,33,224,228,211,-2,211,-2,224,228,209,181,211,-2,209,181,209,175,211,-2,209,175,208,168,224,228,215,33,216,38,224,228,216,38,217,44,224,228,217,44,218,49,224,228,218,49,220,55,224,228,220,55,221,61,224,228,221,61,247,151,224,228,247,151,236,223,209,188,209,181,224,228,209,188,224,228,208,230,209,188,208,230,207,194,208,230,189,227,190,203,249,159,250,166,250,202,250,202,250,166,251,173,250,202,251,173,252,186,252,186,251,173,252,180,247,151,249,159,250,202,247,151,250,202,245,214,247,151,245,214,236,223,218,27,225,3,220,26,220,26,225,3,222,25,228,26,222,25,225,3,228,26,225,3,240,14,256,30,273,54,266,59,256,30,266,59,253,44,256,30,253,44,242,34,256,30,242,34,240,14,234,29,228,26,240,14,234,29,240,14,242,34,225,3,218,27,216,28,225,3,216,28,216,31,225,3,216,31,211,-2,207,161,206,155,211,-2,207,161,211,-2,208,168,183,0,190,-3,185,78,183,0,185,78,182,66,183,0,182,66,178,54,183,0,178,54,177,5,175,41,173,31,174,13,175,41,174,13,177,5,175,41,177,5,178,54,65,0,78,41,87,234,87,234,78,41,88,72,87,234,88,72,93,257,93,257,88,72,98,97,45,239,40,218,87,234,45,239,87,234,93,257,85,312,92,311,98,325,98,325,92,311,99,309,98,325,99,309,116,329,116,329,99,309,103,306,116,329,103,306,104,301,104,301,104,299,133,252,133,252,104,299,104,296,76,320,76,312,85,312,76,320,85,312,98,325,151,315,153,324,155,342,155,342,153,324,156,332,155,342,156,332,158,340,133,252,139,273,143,337,143,337,139,273,146,296,143,337,146,296,155,342,155,342,146,296,148,306,155,342,148,306,151,315,133,252,143,337,131,333,133,252,131,333,116,329,133,252,116,329,104,301,103,286,98,123,133,252,139,273,133,252,205,278,139,273,205,278,211,300,65,0,87,234,23,0,174,13,173,31,172,23,208,230,203,199,207,194,121,137,137,159,123,165,
-344,337,341,331,335,324,327,316,316,310,302,308,271,312,246,322,222,334,193,344,154,348,118,342,88,327,65,305,51,278,46,248,49,224,60,204,77,189,100,179,128,176,136,176,144,177,151,179,159,182,167,186,163,197,157,195,150,193,144,191,137,190,131,190,116,192,102,198,90,208,82,222,79,241,83,262,93,278,106,289,122,295,138,297,168,293,193,283,216,272,242,262,273,258,303,263,325,276,340,294,349,314,355,334,16383,16383,352,209,344,217,335,225,325,231,312,235,295,237,275,234,257,225,241,212,231,195,227,174,232,145,243,121,257,99,269,76,273,49,271,34,264,22,253,11,238,5,219,2,204,4,191,8,181,16,172,28,165,44,158,63,149,82,136,98,118,110,94,114,72,109,53,97,38,82,28,65,22,51,34,49,39,57,45,64,53,69,61,73,69,74,75,73,81,70,87,65,92,58,97,49,102,39,108,29,114,20,122,11,132,3,144,-3,157,-9,172,-13,192,-15,215,-16,253,-11,285,1,311,22,329,47,335,76,329,103,316,127,300,149,287,169,281,186,283,197,287,205,294,211,302,214,310,215,316,215,322,214,328,211,335,207,343,200,314,0,314,331,292,331,292,78,291,78,118,309,103,331,35,331,35,0,57,0,57,252,58,252,247,0,16383,16383,292,22,257,22,57,289,57,309,91,309,292,41,483,153,480,178,471,200,456,217,437,229,414,233,389,229,370,217,356,199,347,177,344,152,347,128,355,107,370,89,389,78,414,74,437,78,457,89,471,106,480,128,483,153,16383,16383,444,152,443,127,439,108,433,95,424,87,413,84,402,87,393,95,387,108,384,127,383,152,384,178,388,197,394,211,402,219,412,222,424,219,433,211,439,197,443,178,444,152,16383,16383,481,0,481,44,346,44,346,0,16383,16383,278,107,135,331,45,331,45,321,53,321,71,318,75,316,80,313,86,308,92,301,99,291,107,280,107,112,104,78,98,47,88,26,71,17,64,21,53,43,45,53,31,57,24,56,17,53,10,48,5,40,3,30,6,14,13,4,24,-2,38,-5,55,-6,91,2,113,27,124,60,128,97,129,131,129,246,291,-5,300,-5,300,186,301,219,303,253,309,284,319,305,335,314,343,309,348,300,354,288,362,278,376,274,383,275,390,278,397,283,402,291,403,301,401,317,394,327,383,334,369,337,353,338,316,329,
-102,198,90,208,100,179,100,179,90,208,82,222,100,179,82,222,77,189,77,189,82,222,79,241,88,327,79,241,83,262,88,327,83,262,93,278,154,348,138,297,168,293,154,348,168,293,193,344,193,344,168,293,193,283,193,344,193,283,222,334,222,334,193,283,216,272,222,334,216,272,242,262,222,334,242,262,246,322,246,322,242,262,273,258,246,322,273,258,271,312,271,312,273,258,302,308,316,310,302,308,303,263,316,310,303,263,325,276,355,334,344,337,349,314,349,314,344,337,341,331,349,314,341,331,340,294,340,294,341,331,335,324,340,294,335,324,327,316,327,316,316,310,325,276,327,316,325,276,340,294,302,308,273,258,303,263,295,237,275,234,283,197,283,197,275,234,281,186,285,1,281,186,275,234,285,1,275,234,273,49,273,49,271,34,285,1,285,1,271,34,264,22,285,1,264,22,253,-11,253,-11,264,22,253,11,253,-11,253,11,238,5,325,231,312,235,316,215,316,215,312,235,310,215,302,214,310,215,312,235,302,214,312,235,295,237,295,237,283,197,287,205,295,237,287,205,294,211,295,237,294,211,302,214,343,200,352,209,344,217,343,200,344,217,335,225,343,200,335,225,335,207,316,215,322,214,325,231,325,231,322,214,328,211,325,231,328,211,335,225,335,225,328,211,335,207,335,76,329,103,329,47,329,47,329,103,316,127,329,47,316,127,311,22,311,22,316,127,300,149,311,22,300,149,287,169,287,169,281,186,285,1,287,169,285,1,311,22,238,5,219,2,253,-11,253,-11,219,2,215,-16,215,-16,219,2,204,4,215,-16,204,4,192,-15,192,-15,204,4,191,8,192,-15,191,8,181,16,93,278,106,289,118,342,118,342,106,289,122,295,118,342,122,295,154,348,154,348,122,295,138,297,65,305,51,278,60,204,65,305,60,204,77,189,65,305,77,189,79,241,65,305,79,241,88,327,51,278,46,248,49,224,51,278,49,224,60,204,157,195,150,193,151,179,151,179,150,193,144,191,151,179,144,191,144,177,144,177,144,191,137,190,144,177,137,190,136,176,136,176,137,190,131,190,128,176,136,176,131,190,128,176,131,190,116,192,128,176,116,192,102,198,128,176,102,198,100,179,159,182,167,186,163,197,159,182,163,197,157,195,159,182,157,195,151,179,94,114,72,109,75,73,75,73,72,109,69,74,61,73,69,74,72,109,61,73,72,109,53,97,53,97,38,82,39,57,53,97,39,57,45,64,53,97,45,64,53,69,53,97,53,69,61,73,34,49,39,57,38,82,34,49,38,82,28,65,34,49,28,65,22,51,81,70,87,65,94,114,94,114,87,65,92,58,94,114,92,58,97,49,97,49,102,39,118,110,118,110,102,39,108,29,118,110,108,29,114,20,122,11,132,3,136,98,136,98,132,3,144,-3,136,98,144,-3,149,82,149,82,144,-3,157,-9,149,82,157,-9,158,63,158,63,157,-9,172,-13,158,63,172,-13,165,44,165,44,172,-13,172,28,181,16,172,28,172,-13,181,16,172,-13,192,-15,118,110,114,20,122,11,118,110,122,11,136,98,118,110,94,114,97,49,231,195,232,145,241,212,241,212,232,145,243,121,241,212,243,121,257,225,257,225,243,121,257,99,257,225,257,99,275,234,275,234,257,99,269,76,275,234,269,76,273,49,232,145,231,195,227,174,94,114,75,73,81,70,88,327,93,278,118,342,
-
-
-406,57,402,52,396,46,384,36,379,35,361,47,353,78,347,119,335,159,309,190,309,191,331,203,348,218,361,236,368,256,371,277,367,300,355,321,335,337,308,348,272,352,206,304,193,317,178,329,160,339,140,345,118,348,89,344,63,335,43,319,30,297,25,270,31,247,45,229,62,214,76,197,82,175,79,163,73,153,64,144,54,138,45,134,49,123,74,132,97,145,115,161,128,180,132,200,126,227,112,245,95,259,81,275,75,299,76,308,80,318,87,325,97,330,108,332,133,322,149,297,157,265,161,231,162,203,162,165,160,123,156,84,149,56,137,45,129,47,116,54,100,62,86,70,76,75,30,2,41,-3,51,9,56,14,60,17,63,20,70,17,83,11,97,3,111,-4,122,-10,149,19,173,53,193,88,209,125,220,161,257,170,269,162,276,149,280,132,282,113,283,94,284,70,289,44,298,21,313,1,333,-10,339,-10,355,0,372,11,388,24,403,36,415,47,16383,16383,222,179,223,189,223,200,224,212,224,233,223,242,222,253,220,265,217,276,214,286,225,297,235,304,245,310,255,313,266,314,283,310,296,302,305,291,310,278,312,266,310,246,303,226,289,208,268,192,238,182,356,0,248,142,271,153,290,167,303,186,311,208,314,233,308,271,291,298,265,317,232,328,195,331,35,331,35,0,118,0,118,136,155,136,252,0,16383,16383,246,302,262,293,275,281,284,268,290,251,292,232,290,214,284,197,274,182,261,170,246,161,16383,16383,224,160,218,159,212,159,207,158,201,158,196,157,118,157,118,309,203,309,208,308,214,307,224,305,16383,16383,313,22,264,22,181,136,184,136,186,135,206,135,213,136,219,136,225,137,16383,16383,96,22,57,22,57,309,96,309,382,0,382,11,365,13,350,18,337,26,326,36,314,47,382,113,368,127,300,61,284,80,254,120,224,158,250,166,274,178,295,196,309,217,315,244,306,281,282,306,250,323,213,331,177,334,35,334,35,321,57,320,73,315,85,307,92,292,94,269,94,65,92,42,85,27,73,18,57,14,35,12,35,0,197,0,197,12,175,14,158,18,147,27,140,42,138,65,138,152,145,152,149,151,162,151,165,152,172,152,270,31,200,-35,213,-49,282,17,295,0,16383,16383,138,283,140,298,146,308,156,314,168,317,182,318,212,315,235,307,251,293,261,271,264,240,259,207,244,186,222,174,194,168,163,166,158,166,153,167,
-82,175,79,163,82,175,82,175,79,163,97,145,82,175,97,145,95,259,82,175,95,259,81,275,82,175,81,275,76,197,76,197,81,275,75,299,63,335,75,299,76,308,63,335,76,308,89,344,89,344,76,308,80,318,89,344,80,318,87,325,118,348,108,332,133,322,118,348,133,322,140,345,140,345,133,322,149,297,140,345,149,297,160,339,160,339,149,297,157,265,160,339,157,265,161,231,162,165,160,123,173,53,173,53,160,123,156,84,173,53,156,84,149,19,149,19,156,84,149,56,149,19,149,56,137,45,137,45,129,47,149,19,149,19,129,47,122,-10,220,161,257,170,222,179,220,161,222,179,222,253,220,161,222,253,220,265,220,161,220,265,217,276,220,161,217,276,214,286,220,161,214,286,209,125,222,179,223,189,223,242,223,242,223,189,223,200,223,242,223,200,224,233,224,233,223,200,224,212,224,233,224,212,224,223,206,304,193,317,193,88,193,88,193,317,178,329,193,88,178,329,173,53,173,53,178,329,162,203,63,20,70,17,76,75,76,75,70,17,83,11,76,75,83,11,86,70,86,70,83,11,97,3,86,70,97,3,100,62,100,62,97,3,111,-4,100,62,111,-4,116,54,116,54,111,-4,122,-10,116,54,122,-10,129,47,76,75,30,2,41,-3,76,75,41,-3,46,3,76,75,46,3,51,9,76,75,51,9,56,14,76,75,56,14,60,17,76,75,60,17,63,20,97,330,108,332,118,348,97,330,118,348,89,344,97,330,89,344,87,325,63,335,43,319,45,229,63,335,45,229,62,214,63,335,62,214,76,197,63,335,76,197,75,299,31,247,45,229,43,319,31,247,43,319,30,297,31,247,30,297,25,270,95,259,97,145,112,245,112,245,97,145,115,161,112,245,115,161,126,227,126,227,115,161,128,180,126,227,128,180,132,200,74,132,97,145,79,163,74,132,79,163,73,153,74,132,73,153,64,144,74,132,64,144,54,138,74,132,54,138,49,123,54,138,45,134,49,123,276,149,289,208,269,162,269,162,289,208,268,192,269,162,268,192,257,170,257,170,268,192,238,182,235,304,245,310,272,352,272,352,245,310,255,313,272,352,255,313,266,314,266,314,283,310,272,352,272,352,283,310,308,348,312,266,331,203,335,337,335,337,331,203,348,218,335,337,348,218,355,321,355,321,348,218,361,236,355,321,361,236,367,300,367,300,361,236,368,256,367,300,368,256,371,277,310,278,312,266,335,337,310,278,335,337,308,348,310,278,308,348,305,291,308,348,283,310,296,302,308,348,296,302,305,291,310,246,303,226,309,191,310,246,309,191,331,203,310,246,331,203,312,266,309,190,309,191,303,226,309,190,303,226,313,1,309,190,313,1,335,159,402,52,396,46,403,36,403,36,396,46,390,41,403,36,390,41,388,24,388,24,390,41,384,36,388,24,384,36,379,35,379,35,361,47,372,11,372,11,361,47,355,0,313,1,333,-10,335,159,335,159,333,-10,339,-10,335,159,339,-10,347,119,347,119,339,-10,355,0,347,119,355,0,353,78,353,78,355,0,361,47,283,94,284,70,289,208,289,208,284,70,289,44,289,208,289,44,303,226,303,226,289,44,298,21,303,226,298,21,313,1,276,149,280,132,289,208,289,208,280,132,282,113,289,208,282,113,283,94,406,57,402,52,403,36,406,57,403,36,415,47,379,35,372,11,388,24,272,352,206,304,214,286,272,352,214,286,225,297,272,352,225,297,235,304,206,304,193,88,209,125,206,304,209,125,214,286,161,231,162,203,178,329,161,231,178,329,160,339,222,179,257,170,238,182,162,165,173,53,162,203,222,179,223,242,222,253,
-429,110,429,143,125,143,121,145,119,147,117,150,117,155,119,161,123,167,132,176,141,186,149,195,165,215,155,224,134,202,112,180,89,160,63,143,36,129,36,124,63,110,89,93,112,73,134,51,154,29,164,39,157,49,149,59,140,68,132,78,123,86,120,89,118,92,116,96,116,99,117,102,119,105,122,107,126,109,129,110,225,212,203,232,181,254,162,278,144,303,130,331,125,331,111,303,94,278,74,254,52,233,30,213,40,203,49,210,69,226,79,235,88,243,90,246,93,248,97,250,100,251,103,250,109,244,111,238,111,-77,144,-77,144,237,145,242,146,246,148,248,151,250,157,250,159,249,168,243,177,234,187,226,197,217,206,209,216,202,428,129,
-121,145,119,147,119,105,119,105,119,147,117,150,119,105,117,150,117,102,117,102,117,150,117,153,116,99,112,180,112,73,112,73,112,180,89,160,112,73,89,160,89,93,89,93,89,160,63,143,89,93,63,143,63,110,63,110,63,143,36,129,63,110,36,129,36,124,155,224,134,202,141,186,155,224,141,186,149,195,155,224,149,195,157,205,155,224,157,205,165,215,134,202,112,180,118,158,134,202,118,158,119,161,134,202,119,161,121,164,134,202,121,164,123,167,134,202,123,167,132,176,134,202,132,176,141,186,117,155,118,158,112,180,117,155,112,180,117,153,140,68,132,78,134,51,134,51,132,78,123,86,134,51,123,86,120,89,129,143,125,143,126,109,129,143,126,109,129,110,129,143,129,110,429,110,129,143,429,110,429,143,122,107,126,109,125,143,122,107,125,143,121,145,122,107,121,145,119,105,154,29,164,39,157,49,154,29,157,49,149,59,154,29,149,59,140,68,154,29,140,68,134,51,116,96,116,99,112,73,116,96,112,73,117,94,117,94,112,73,134,51,117,94,134,51,118,92,118,92,134,51,120,89,117,102,117,153,116,99,117,153,112,180,116,99,
-225,212,203,232,181,254,162,278,144,303,130,331,125,331,111,303,94,278,74,254,52,233,30,213,40,203,49,210,69,226,79,235,88,243,90,246,93,248,97,250,100,251,103,250,109,244,111,238,111,-77,144,-77,144,237,145,242,146,246,148,248,151,250,157,250,159,249,168,243,177,234,187,226,197,217,206,209,216,202,428,129,400,143,375,160,352,180,330,201,310,224,300,214,314,194,323,185,332,175,340,166,343,164,345,161,347,159,347,157,348,154,347,151,341,145,338,144,334,143,35,143,35,110,334,110,339,109,343,108,345,106,347,103,347,97,346,95,340,86,331,77,322,67,314,58,306,48,299,38,309,28,330,51,351,72,375,92,
-90,246,93,248,94,278,94,278,93,248,95,249,94,278,95,249,111,303,111,303,95,249,97,250,111,303,97,250,100,251,100,251,103,250,111,303,111,303,103,250,106,247,111,303,106,247,109,244,110,241,111,238,111,303,111,303,111,238,125,331,125,331,111,238,144,-77,125,331,144,-77,130,331,130,331,144,-77,144,237,130,331,144,237,144,303,144,303,144,237,145,242,144,303,145,242,146,246,88,243,90,246,94,278,88,243,94,278,79,235,79,235,94,278,74,254,79,235,74,254,69,226,69,226,74,254,59,218,52,233,30,213,40,203,52,233,40,203,49,210,52,233,49,210,59,218,52,233,59,218,74,254,146,246,148,248,162,278,162,278,148,248,151,250,162,278,151,250,154,250,154,250,157,250,162,278,162,278,157,250,159,249,162,278,159,249,162,247,187,226,197,217,203,232,203,232,197,217,206,209,203,232,206,209,225,212,225,212,206,209,216,202,181,254,162,278,162,247,181,254,162,247,165,245,181,254,165,245,168,243,181,254,168,243,177,234,181,254,177,234,187,226,181,254,187,226,203,232,111,238,111,-77,144,-77,144,303,146,246,162,278,111,303,109,244,110,241,
-428,129,400,143,375,160,352,180,330,201,310,224,300,214,314,194,323,185,332,175,340,166,343,164,345,161,347,159,347,157,348,154,347,151,341,145,338,144,334,143,35,143,35,110,334,110,339,109,343,108,345,106,347,103,347,97,346,95,340,86,331,77,322,67,314,58,306,48,299,38,309,28,330,51,351,72,375,92,400,110,428,124,216,50,206,43,186,27,168,9,165,7,163,5,160,3,158,3,156,2,153,3,147,9,145,12,145,331,112,331,112,16,111,11,110,8,105,3,99,3,96,4,90,8,88,10,78,19,69,28,49,44,40,51,30,41,53,20,74,-1,94,-24,111,-49,126,-77,131,-77,145,-49,162,-24,182,-1,203,20,225,41,444,129,417,143,391,160,
-347,97,351,72,347,100,347,100,351,72,348,154,348,154,351,72,352,180,352,180,351,72,375,92,352,180,375,92,375,160,375,160,375,92,400,110,375,160,400,110,400,143,400,143,400,110,428,124,400,143,428,124,428,129,352,180,330,201,332,175,352,180,332,175,340,166,352,180,340,166,343,164,352,180,343,164,345,161,352,180,345,161,347,159,352,180,347,159,347,157,352,180,347,157,348,154,300,214,307,204,310,224,310,224,307,204,314,194,310,224,314,194,330,201,330,201,314,194,323,185,330,201,323,185,332,175,35,143,334,110,334,143,338,144,334,143,339,109,338,144,339,109,341,145,341,145,339,109,343,108,341,145,343,108,344,148,344,148,343,108,345,106,344,148,345,106,347,151,347,151,345,106,347,103,347,151,347,103,347,100,322,67,330,51,331,77,331,77,330,51,351,72,331,77,351,72,340,86,340,86,351,72,342,89,351,72,347,97,346,95,351,72,346,95,344,92,351,72,344,92,342,89,314,58,306,48,309,28,314,58,309,28,330,51,314,58,330,51,322,67,348,154,347,151,347,100,334,110,35,143,35,110,334,143,334,110,339,109,309,28,306,48,299,38,
-216,50,206,43,186,27,168,9,165,7,163,5,160,3,158,3,156,2,153,3,147,9,145,12,145,331,112,331,112,16,111,11,110,8,105,3,99,3,96,4,90,8,88,10,78,19,69,28,49,44,40,51,30,41,53,20,74,-1,94,-24,111,-49,126,-77,131,-77,145,-49,162,-24,182,-1,203,20,225,41,444,129,417,143,391,160,368,180,346,201,325,224,315,214,322,204,330,194,339,185,348,175,359,164,361,161,363,157,363,154,362,151,360,148,357,145,354,144,350,143,108,143,104,145,102,147,100,150,100,155,101,158,107,167,116,176,125,186,133,195,141,205,148,215,138,224,96,180,72,160,47,143,19,129,19,124,
-110,8,107,5,111,-49,111,-49,107,5,105,3,111,-49,105,3,102,3,102,3,99,3,111,-49,111,-49,99,3,96,4,111,-49,96,4,94,-24,94,-24,96,4,93,6,94,-24,93,6,90,8,150,6,147,9,162,-24,162,-24,147,9,145,12,162,-24,145,12,145,-49,145,-49,145,12,145,16,145,16,145,331,131,-77,131,-77,145,331,126,-77,145,331,112,331,126,-77,126,-77,112,331,112,16,126,-77,112,16,111,-49,111,-49,112,16,111,11,111,-49,111,11,110,8,163,5,160,3,162,-24,162,-24,160,3,158,3,162,-24,158,3,156,2,156,2,153,3,162,-24,162,-24,153,3,150,6,186,27,177,18,182,-1,182,-1,177,18,168,9,182,-1,168,9,165,7,206,43,196,35,203,20,206,43,203,20,225,41,206,43,225,41,216,50,186,27,182,-1,203,20,186,27,203,20,196,35,163,5,162,-24,182,-1,163,5,182,-1,165,7,90,8,88,10,94,-24,94,-24,88,10,78,19,94,-24,78,19,74,-1,74,-1,78,19,69,28,74,-1,69,28,59,36,53,20,74,-1,59,36,53,20,59,36,49,44,53,20,49,44,40,51,53,20,40,51,30,41,145,-49,145,16,131,-77,
-444,129,417,143,391,160,368,180,346,201,325,224,315,214,322,204,330,194,339,185,348,175,359,164,361,161,363,157,363,154,362,151,360,148,357,145,354,144,350,143,108,143,104,145,102,147,100,150,100,155,101,158,107,167,116,176,125,186,133,195,141,205,148,215,138,224,96,180,72,160,47,143,19,129,19,124,47,110,72,93,95,73,117,51,137,29,147,39,133,59,124,68,115,78,104,89,102,92,100,94,100,96,99,99,100,102,103,105,109,109,113,110,350,110,355,109,358,108,361,106,363,100,362,97,362,95,356,86,347,77,338,67,330,58,322,48,315,38,325,28,345,51,367,72,391,92,417,110,444,124,225,246,203,266,182,288,162,312,145,337,131,365,126,365,112,337,94,312,74,288,53,267,31,247,40,237,50,244,70,260,79,269,88,277,93,282,96,283,100,285,104,284,107,281,111,275,112,272,112,-16,111,-21,110,-25,107,-28,105,-29,102,-30,93,-27,90,-25,88,-22,78,-13,69,-5,59,2,49,10,40,17,30,7,53,-12,74,-34,94,-58,111,-83,126,-111,131,-111,145,-83,162,-58,181,-34,203,-12,225,7,215,17,206,10,196,2,186,-5,163,-28,160,-29,158,-30,156,-30,153,-29,150,-27,147,-24,145,-20,145,276,147,280,149,282,152,284,157,284,160,283,169,277,178,268,187,260,197,251,206,243,216,236,428,-54,
-104,145,102,147,103,105,103,105,102,147,100,150,103,105,100,150,100,102,100,102,100,150,100,153,99,99,96,180,95,73,95,73,96,180,72,160,95,73,72,160,72,93,72,93,72,160,47,143,72,93,47,143,47,110,47,110,47,143,19,129,47,110,19,129,19,124,138,224,117,202,125,186,138,224,125,186,133,195,138,224,133,195,141,205,138,224,141,205,148,215,117,202,96,180,101,158,117,202,101,158,103,161,117,202,103,161,105,164,117,202,105,164,107,167,117,202,107,167,116,176,117,202,116,176,125,186,100,155,101,158,96,180,100,155,96,180,100,153,124,68,115,78,117,51,117,51,115,78,107,86,117,51,107,86,104,89,137,29,147,39,140,49,137,29,140,49,133,59,137,29,133,59,124,68,137,29,124,68,117,51,363,100,367,72,363,154,363,154,367,72,368,180,368,180,367,72,391,92,368,180,391,92,391,160,391,160,391,92,417,110,391,160,417,110,417,143,417,143,417,110,444,124,417,143,444,124,444,129,368,180,346,201,348,175,368,180,348,175,357,166,368,180,357,166,359,164,368,180,359,164,361,161,368,180,361,161,362,159,368,180,362,159,363,157,368,180,363,157,363,154,315,214,322,204,325,224,325,224,322,204,330,194,325,224,330,194,346,201,346,201,330,194,339,185,346,201,339,185,348,175,350,110,355,109,350,143,354,144,350,143,355,109,354,144,355,109,357,145,357,145,355,109,358,108,357,145,358,108,360,148,360,148,358,108,361,106,360,148,361,106,362,151,362,151,361,106,362,103,362,151,362,103,363,100,338,67,345,51,347,77,347,77,345,51,367,72,347,77,367,72,356,86,356,86,367,72,358,89,362,97,362,95,367,72,362,97,367,72,363,100,360,92,358,89,367,72,360,92,367,72,362,95,330,58,322,48,325,28,330,58,325,28,345,51,330,58,345,51,338,67,363,154,362,151,363,100,350,110,350,143,113,110,113,110,350,143,113,143,113,110,113,143,109,109,108,143,104,145,106,107,108,143,106,107,109,109,108,143,109,109,113,143,100,96,99,99,95,73,100,96,95,73,100,94,100,94,95,73,117,51,100,94,117,51,102,92,102,92,117,51,104,89,100,102,100,153,99,99,104,145,103,105,106,107,325,28,322,48,315,38,100,153,96,180,99,99,
-225,246,203,266,182,288,162,312,145,337,131,365,126,365,112,337,94,312,74,288,53,267,31,247,40,237,50,244,70,260,79,269,88,277,93,282,96,283,100,285,104,284,107,281,111,275,112,272,112,-16,111,-21,110,-25,107,-28,105,-29,102,-30,93,-27,90,-25,88,-22,78,-13,69,-5,59,2,49,10,40,17,30,7,53,-12,74,-34,94,-58,111,-83,126,-111,131,-111,145,-83,162,-58,181,-34,203,-12,225,7,215,17,206,10,196,2,186,-5,163,-28,160,-29,158,-30,156,-30,153,-29,150,-27,147,-24,145,-20,145,276,147,280,149,282,152,284,157,284,160,283,169,277,178,268,187,260,197,251,206,243,216,236,428,-54,118,271,115,274,111,280,110,282,110,285,111,287,111,288,112,290,113,291,115,292,117,294,121,295,124,296,153,296,166,297,178,298,190,300,190,315,182,314,173,313,125,313,103,315,81,318,60,324,39,331,35,328,43,306,48,285,51,263,53,241,54,219,53,210,53,193,52,184,51,176,65,176,68,188,70,214,70,243,72,249,73,251,76,254,77,254,78,255,83,255,85,254,88,254,92,252,404,-77,425,331,403,324,382,318,360,315,338,313,289,313,281,314,272,315,272,300,284,298,297,297,309,296,339,296,342,295,346,294,348,292,350,291,351,290,352,288,353,287,353,282,352,280,348,274,345,271,
-69,-5,74,-34,78,-13,78,-13,74,-34,94,-58,78,-13,94,-58,88,-22,88,-22,94,-58,90,-25,91,280,93,282,94,312,94,312,93,282,96,283,94,312,96,283,112,337,112,337,96,283,98,284,112,337,98,284,100,285,100,285,104,284,112,337,112,337,104,284,107,281,112,337,107,281,109,278,110,-25,107,-28,111,-83,111,-83,107,-28,105,-29,111,-83,105,-29,102,-30,102,-30,99,-29,111,-83,111,-83,99,-29,96,-28,111,-83,96,-28,94,-58,94,-58,96,-28,93,-27,94,-58,93,-27,90,-25,109,278,111,275,112,337,112,337,111,275,112,272,112,272,126,-111,126,365,126,365,126,-111,131,-111,126,365,131,-111,131,365,131,365,131,-111,145,-83,131,365,145,-83,145,271,145,271,145,-83,145,-17,88,277,91,280,94,312,88,277,94,312,79,269,79,269,94,312,74,288,79,269,74,288,70,260,70,260,74,288,60,252,53,267,31,247,40,237,53,267,40,237,50,244,53,267,50,244,60,252,53,267,60,252,74,288,147,280,149,282,162,312,162,312,149,282,152,284,162,312,152,284,155,284,155,284,157,284,162,312,162,312,157,284,160,283,162,312,160,283,163,281,187,260,197,251,203,266,203,266,197,251,206,243,203,266,206,243,225,246,225,246,206,243,216,236,182,288,162,312,163,281,182,288,163,281,166,279,182,288,166,279,169,277,182,288,169,277,178,268,182,288,178,268,187,260,182,288,187,260,203,266,145,337,131,365,145,271,145,337,145,271,145,276,145,337,145,276,147,280,145,337,147,280,162,312,163,-28,160,-29,162,-58,162,-58,160,-29,158,-30,162,-58,158,-30,156,-30,156,-30,153,-29,162,-58,162,-58,153,-29,150,-27,162,-58,150,-27,147,-24,186,-5,177,-14,181,-34,181,-34,177,-14,168,-23,181,-34,168,-23,165,-26,206,10,196,2,203,-12,206,10,203,-12,225,7,206,10,225,7,215,17,186,-5,181,-34,203,-12,186,-5,203,-12,196,2,163,-28,162,-58,181,-34,163,-28,181,-34,165,-26,145,-20,145,-17,145,-83,145,-20,145,-83,162,-58,145,-20,162,-58,147,-24,112,-16,111,-21,111,-83,112,-16,111,-83,126,-111,112,-16,126,-111,112,272,59,2,49,10,53,-12,59,2,53,-12,74,-34,59,2,74,-34,69,-5,40,17,30,7,53,-12,40,17,53,-12,49,10,110,-25,111,-83,111,-21,112,337,112,272,126,365,
-428,-54,118,271,115,274,111,280,110,282,110,285,111,287,111,288,112,290,113,291,115,292,117,294,121,295,124,296,153,296,166,297,178,298,190,300,190,315,182,314,173,313,125,313,103,315,81,318,60,324,39,331,35,328,43,306,48,285,51,263,53,241,54,219,53,210,53,193,52,184,51,176,65,176,68,188,70,214,70,243,72,249,73,251,76,254,77,254,78,255,83,255,85,254,88,254,92,252,404,-77,425,331,403,324,382,318,360,315,338,313,289,313,281,314,272,315,272,300,284,298,297,297,309,296,339,296,342,295,346,294,348,292,350,291,351,290,352,288,353,287,353,282,352,280,348,274,345,271,35,-54,59,-77,372,252,373,253,375,254,377,254,380,255,385,255,387,254,388,254,388,253,390,251,391,249,392,246,392,226,393,214,395,188,397,176,411,176,411,185,410,193,410,241,412,263,415,285,421,307,428,328,
-48,285,51,263,60,324,60,324,51,263,53,241,60,324,53,241,54,219,54,219,53,210,65,176,65,176,53,210,53,201,65,176,53,201,53,193,60,324,39,331,43,306,60,324,43,306,48,285,77,254,78,255,81,318,81,318,78,255,79,255,81,318,79,255,80,255,80,255,83,255,81,318,81,318,83,255,103,315,81,318,60,324,71,246,81,318,71,246,72,249,81,318,72,249,73,251,81,318,73,251,75,253,81,318,75,253,76,254,81,318,76,254,77,254,65,176,68,188,70,243,70,243,68,188,69,201,70,243,69,201,70,239,70,239,69,201,70,214,70,239,70,214,70,226,60,324,54,219,65,176,60,324,65,176,70,243,60,324,70,243,71,246,52,184,51,176,65,176,52,184,65,176,53,193,103,315,92,252,110,282,103,315,110,282,110,284,110,284,110,285,103,315,103,315,110,285,111,287,103,315,111,287,111,288,103,315,83,255,85,254,103,315,85,254,88,254,103,315,88,254,90,253,103,315,90,253,92,252,103,315,111,288,125,313,125,313,111,288,112,290,125,313,112,290,113,291,113,291,115,292,125,313,125,313,115,292,117,294,125,313,117,294,121,295,147,313,127,296,140,296,147,313,140,296,153,296,147,313,147,312,125,313,147,313,125,313,127,296,165,313,166,297,173,313,173,313,166,297,178,298,173,313,178,298,182,314,182,314,178,298,190,300,182,314,190,300,190,315,156,313,147,312,147,313,156,313,147,313,153,296,156,313,153,296,166,297,156,313,166,297,165,313,124,296,127,296,125,313,124,296,125,313,121,295,428,-54,118,271,404,-77,404,-77,118,271,115,274,404,-77,115,274,92,252,92,252,115,274,113,277,92,252,113,277,111,280,43,306,39,331,35,328,92,252,111,280,110,282,
-425,331,403,324,382,318,360,315,338,313,289,313,281,314,272,315,272,300,284,298,297,297,309,296,339,296,342,295,346,294,348,292,350,291,351,290,352,288,353,287,353,282,352,280,348,274,345,271,35,-54,59,-77,372,252,373,253,375,254,377,254,380,255,385,255,387,254,388,254,388,253,390,251,391,249,392,246,392,226,393,214,395,188,397,176,411,176,411,185,410,193,410,241,412,263,415,285,421,307,428,328,428,-74,421,-53,415,-31,412,-9,410,12,410,60,411,68,411,76,397,77,395,65,392,26,392,7,391,4,390,2,387,-1,380,-1,377,0,373,0,372,2,59,331,35,307,345,-17,348,-20,352,-26,353,-28,353,-33,352,-34,351,-36,350,-36,346,-40,342,-41,335,-41,322,-42,309,-42,297,-43,284,-45,272,-46,272,-60,281,-60,289,-59,338,-59,360,-61,382,-65,403,-70,425,-77,428,307,404,331,92,2,90,0,88,0,
-272,315,272,315,281,314,281,314,272,315,284,298,281,314,284,298,289,313,289,313,284,298,297,297,289,313,297,297,298,313,298,313,297,297,309,296,298,313,309,296,307,313,307,313,309,296,315,313,338,313,315,313,322,296,338,313,322,296,335,296,375,254,377,254,382,318,382,318,377,254,380,255,382,318,380,255,382,255,382,255,384,255,403,324,403,324,384,255,385,255,403,324,385,255,387,254,353,285,353,284,360,315,360,315,353,284,372,252,360,315,372,252,382,318,382,318,372,252,373,253,382,318,373,253,375,254,372,252,353,284,353,282,372,252,353,282,352,280,372,252,352,280,350,277,372,252,350,277,348,274,372,252,348,274,345,271,372,252,345,271,59,-77,410,193,410,201,403,324,403,324,410,201,410,210,403,324,410,210,410,219,410,219,410,241,403,324,403,324,410,241,412,263,403,324,412,263,415,285,403,324,415,285,425,331,425,331,415,285,421,307,425,331,421,307,428,328,395,188,397,176,403,324,403,324,397,176,411,176,403,324,411,176,410,193,410,193,411,176,411,185,403,324,387,254,388,254,403,324,388,254,388,253,403,324,388,253,390,251,403,324,390,251,391,249,403,324,391,249,392,246,403,324,392,246,392,243,403,324,392,243,392,239,403,324,392,239,392,226,403,324,392,226,393,214,403,324,393,214,394,201,403,324,394,201,395,188,403,324,382,318,382,255,360,315,338,313,339,296,360,315,339,296,342,295,360,315,342,295,346,294,360,315,346,294,348,292,360,315,348,292,350,291,360,315,350,291,351,290,360,315,351,290,352,288,360,315,352,288,353,287,360,315,353,287,353,285,335,296,339,296,338,313,315,313,309,296,322,296,59,-77,345,271,35,-54,284,298,272,315,272,300,
-428,-74,421,-53,415,-31,412,-9,410,12,410,60,411,68,411,76,397,77,395,65,392,26,392,7,391,4,390,2,387,-1,380,-1,377,0,373,0,372,2,59,331,35,307,345,-17,348,-20,352,-26,353,-28,353,-33,352,-34,351,-36,350,-36,346,-40,342,-41,335,-41,322,-42,309,-42,297,-43,284,-45,272,-46,272,-60,281,-60,289,-59,338,-59,360,-61,382,-65,403,-70,425,-77,428,307,404,331,92,2,90,0,88,0,85,-1,77,-1,76,0,75,0,73,2,72,4,70,10,70,39,68,65,65,77,51,76,53,60,53,43,54,35,53,12,51,-9,48,-31,43,-53,35,-74,39,-77,60,-70,81,-65,103,-61,125,-59,173,-59,182,-60,190,-60,190,-46,178,-45,166,-43,153,-42,140,-42,127,-41,121,-41,117,-40,113,-36,112,-36,111,-34,111,-33,110,-32,
-335,-41,322,-42,338,-59,338,-59,322,-42,315,-59,307,-59,315,-59,309,-42,307,-59,309,-42,298,-59,298,-59,309,-42,297,-43,298,-59,297,-43,289,-59,289,-59,297,-43,284,-45,289,-59,284,-45,281,-60,281,-60,284,-45,272,-46,281,-60,272,-46,272,-60,322,-42,309,-42,315,-59,353,-33,352,-34,360,-61,360,-61,352,-34,351,-36,360,-61,351,-36,350,-36,372,2,59,331,345,-17,372,2,345,-17,348,-20,372,2,348,-20,350,-23,372,2,350,-23,352,-26,372,2,352,-26,353,-28,372,2,353,-28,353,-30,372,2,353,-30,360,-61,372,2,360,-61,382,-65,372,2,382,-65,373,0,387,-1,385,-1,403,-70,403,-70,385,-1,384,-1,403,-70,384,-1,382,-1,382,-1,380,-1,382,-65,382,-65,380,-1,377,0,382,-65,377,0,375,0,360,-61,353,-30,353,-32,360,-61,353,-32,353,-33,393,39,392,26,403,-70,403,-70,392,26,392,14,403,-70,392,14,392,10,415,-31,412,-9,403,-70,403,-70,412,-9,410,12,403,-70,410,12,410,35,410,35,410,43,403,-70,403,-70,410,43,410,52,403,-70,410,52,410,60,411,76,397,77,403,-70,411,76,403,-70,410,60,411,76,410,60,411,68,403,-70,397,77,395,65,403,-70,395,65,394,52,403,-70,394,52,393,39,403,-70,392,10,392,7,403,-70,392,7,391,4,403,-70,391,4,390,2,403,-70,390,2,388,0,403,-70,388,0,387,-1,382,-1,382,-65,403,-70,425,-77,428,-74,421,-53,425,-77,421,-53,415,-31,425,-77,415,-31,403,-70,360,-61,350,-36,348,-38,360,-61,348,-38,346,-40,360,-61,346,-40,342,-41,360,-61,342,-41,339,-41,360,-61,339,-41,338,-59,339,-41,335,-41,338,-59,345,-17,59,331,35,307,373,0,382,-65,375,0,
-428,307,404,331,92,2,90,0,88,0,85,-1,77,-1,76,0,75,0,73,2,72,4,70,10,70,39,68,65,65,77,51,76,53,60,53,43,54,35,53,12,51,-9,48,-31,43,-53,35,-74,39,-77,60,-70,81,-65,103,-61,125,-59,173,-59,182,-60,190,-60,190,-46,178,-45,166,-43,153,-42,140,-42,127,-41,121,-41,117,-40,113,-36,112,-36,111,-34,111,-33,110,-32,110,-28,111,-26,115,-20,118,-17,433,110,433,143,300,143,349,225,320,225,272,143,119,143,113,147,111,153,111,155,113,161,115,164,127,176,135,186,144,196,152,206,159,215,149,225,129,202,107,181,83,161,58,143,30,129,30,124,58,110,83,93,107,73,128,51,148,29,158,39,151,49,143,59,135,68,126,78,115,89,113,92,111,96,110,99,111,102,114,105,120,109,123,110,252,110,204,29,233,29,281,110,433,129,405,143,380,161,
-78,-1,81,-65,79,-1,79,-1,81,-65,80,-1,83,-1,80,-1,81,-65,83,-1,81,-65,103,-61,111,-34,111,-33,103,-61,103,-61,111,-33,110,-32,103,-61,110,-32,110,-30,110,-30,110,-28,103,-61,103,-61,110,-28,92,2,103,-61,92,2,90,0,115,-20,118,-17,404,331,115,-20,404,331,92,2,404,331,118,-17,428,307,92,2,110,-28,111,-26,92,2,111,-26,113,-23,92,2,113,-23,115,-20,103,-61,90,0,88,0,103,-61,88,0,85,-1,103,-61,85,-1,83,-1,147,-59,140,-42,127,-41,147,-59,127,-41,125,-59,147,-59,153,-42,140,-42,156,-59,165,-59,166,-43,166,-43,165,-59,173,-59,166,-43,173,-59,178,-45,178,-45,173,-59,182,-60,178,-45,182,-60,190,-46,190,-46,182,-60,190,-60,156,-59,166,-43,153,-42,156,-59,153,-42,147,-59,121,-41,117,-40,125,-59,125,-59,117,-40,115,-38,125,-59,115,-38,113,-36,124,-41,121,-41,125,-59,124,-41,125,-59,127,-41,125,-59,113,-36,112,-36,125,-59,112,-36,111,-34,125,-59,111,-34,103,-61,81,-65,78,-1,77,-1,81,-65,77,-1,76,0,81,-65,76,0,75,0,81,-65,75,0,73,2,81,-65,73,2,72,4,81,-65,72,4,71,7,81,-65,71,7,60,-70,70,10,70,14,69,52,70,10,69,52,68,65,70,10,68,65,65,77,70,10,65,77,60,-70,70,10,60,-70,71,7,70,39,69,52,70,14,70,39,70,14,70,26,60,-70,65,77,54,35,60,-70,54,35,53,12,60,-70,53,12,51,-9,60,-70,51,-9,48,-31,60,-70,48,-31,43,-53,60,-70,43,-53,39,-77,53,60,53,51,65,77,65,77,53,51,53,43,65,77,53,43,54,35,65,77,51,76,52,68,65,77,52,68,53,60,43,-53,35,-74,39,-77,
-279,331,243,331,206,232,74,232,36,331,1,331,123,0,156,0,16383,16383,195,201,140,51,84,201,202,110,169,110,169,65,165,48,155,37,141,30,128,27,117,26,107,26,92,29,78,36,67,47,
-156,0,279,331,195,201,195,201,279,331,206,232,195,201,206,232,84,201,84,201,206,232,74,232,84,201,74,232,123,0,123,0,74,232,36,331,123,0,36,331,1,331,140,51,84,201,123,0,140,51,123,0,156,0,140,51,156,0,195,201,206,232,279,331,243,331,
-202,110,169,110,169,65,165,48,155,37,141,30,128,27,117,26,107,26,92,29,78,36,67,47,63,65,63,308,67,326,78,337,92,344,105,346,116,347,126,347,140,344,154,338,165,326,169,307,169,262,202,262,202,305,196,339,180,360,158,373,136,379,117,380,97,379,74,373,52,361,36,339,30,306,30,65,36,32,51,11,72,0,94,-5,114,-6,134,-5,157,0,179,10,196,30,202,61,98,313,112,317,119,318,127,319,134,319,161,314,179,300,191,279,198,255,200,228,200,221,199,214,199,207,198,200,196,194,189,203,180,210,169,214,159,217,148,218,107,210,72,188,44,156,26,117,20,75,22,51,30,29,43,11,62,0,88,-5,148,9,190,47,217,98,231,154,235,204,232,250,220,287,202,313,175,329,142,334,131,334,121,333,101,327,93,323,16383,16383,184,160,182,140,180,131,
-105,346,116,347,116,347,117,380,116,347,126,347,117,380,126,347,136,379,136,379,126,347,140,344,136,379,140,344,158,373,158,373,140,344,154,338,158,373,154,338,165,326,202,305,196,339,202,262,202,262,196,339,180,360,202,262,180,360,169,307,169,307,180,360,165,326,78,337,92,344,97,379,97,379,92,344,105,346,97,379,105,346,117,380,117,380,105,346,116,347,74,373,52,361,63,308,74,373,63,308,67,326,74,373,67,326,78,337,74,373,78,337,97,379,30,306,30,65,36,32,30,306,36,32,36,339,36,339,36,32,51,11,36,339,51,11,52,361,52,361,51,11,63,65,52,361,63,65,63,308,165,48,155,37,157,0,157,0,155,37,141,30,157,0,141,30,134,-5,134,-5,141,30,128,27,134,-5,128,27,117,26,117,26,107,26,114,-6,114,-6,107,26,94,-5,107,26,92,29,94,-5,94,-5,92,29,78,36,94,-5,78,36,72,0,72,0,78,36,67,47,72,0,67,47,63,65,63,65,51,11,72,0,202,110,169,110,179,10,202,110,179,10,196,30,202,110,196,30,202,61,179,10,169,110,169,65,179,10,169,65,165,48,179,10,165,48,157,0,117,26,114,-6,134,-5,202,262,169,307,169,262,158,373,165,326,180,360,
-98,313,112,317,119,318,127,319,134,319,161,314,179,300,191,279,198,255,200,228,200,221,199,214,199,207,198,200,196,194,189,203,180,210,169,214,159,217,148,218,107,210,72,188,44,156,26,117,20,75,22,51,30,29,43,11,62,0,88,-5,148,9,190,47,217,98,231,154,235,204,232,250,220,287,202,313,175,329,142,334,131,334,121,333,101,327,93,323,16383,16383,184,160,182,140,180,131,178,121,176,110,166,80,152,53,135,30,116,15,94,9,78,13,68,21,63,33,61,46,60,59,65,100,79,139,99,172,124,194,153,203,161,201,169,197,177,189,182,176,184,160,243,0,243,331,36,331,36,298,210,298,210,182,42,182,42,149,210,149,210,33,36,33,36,0,243,0,243,331,199,331,219,387,190,387,170,331,36,331,36,298,159,298,119,182,42,182,42,149,108,149,68,33,36,33,36,0,56,0,36,-60,65,-60,85,0,16383,16383,210,182,148,182,188,298,210,298,16383,16383,210,33,97,33,137,149,210,149,353,291,318,291,289,258,272,270,253,279,233,285,212,290,190,291,138,283,93,259,57,223,34,178,25,126,27,100,33,75,43,51,56,30,72,11,28,-39,63,-39,92,-6,110,-17,129,-26,148,-33,169,-37,190,-39,242,-30,288,-6,
-127,319,134,319,134,319,142,334,134,319,161,314,142,334,161,314,175,329,175,329,161,314,179,300,175,329,179,300,202,313,202,313,179,300,191,279,202,313,191,279,198,255,112,317,119,318,121,333,121,333,119,318,127,319,121,333,127,319,131,334,131,334,127,319,134,319,131,334,134,319,142,334,93,323,98,313,101,327,101,327,98,313,105,315,101,327,105,315,111,330,111,330,105,315,112,317,111,330,112,317,121,333,152,53,135,30,148,9,148,9,135,30,116,15,148,9,116,15,94,9,94,9,78,13,88,-5,88,-5,78,13,68,21,88,-5,68,21,62,0,62,0,68,21,63,33,62,0,63,33,61,46,61,46,60,59,62,0,62,0,60,59,44,156,44,156,60,59,72,188,72,188,60,59,65,100,20,75,22,51,26,117,26,117,22,51,30,29,26,117,30,29,44,156,44,156,30,29,43,11,44,156,43,11,62,0,159,217,153,203,161,201,159,217,161,201,169,214,169,214,161,201,169,197,169,214,169,197,180,210,180,210,169,197,177,189,180,210,177,189,182,176,79,139,99,172,107,210,107,210,99,172,124,194,107,210,124,194,148,218,148,218,124,194,153,203,148,218,153,203,159,217,72,188,65,100,79,139,72,188,79,139,107,210,182,140,180,131,190,47,190,47,180,131,178,121,190,47,178,121,176,110,176,110,166,80,190,47,190,47,166,80,152,53,190,47,152,53,148,9,198,200,196,194,217,98,217,98,196,194,190,47,190,47,196,194,189,203,190,47,189,203,184,160,184,160,189,203,182,176,190,47,184,160,183,150,190,47,183,150,182,140,94,9,88,-5,148,9,235,204,232,250,231,154,231,154,232,250,220,287,231,154,220,287,217,98,217,98,220,287,202,313,217,98,202,313,200,228,200,228,202,313,198,255,217,98,200,228,200,221,217,98,200,221,199,214,217,98,199,214,199,207,217,98,199,207,198,200,180,210,182,176,189,203,
-243,0,243,331,36,331,36,298,210,298,210,182,42,182,42,149,210,149,210,33,36,33,36,0,243,0,243,331,199,331,219,387,190,387,170,331,36,331,36,298,159,298,119,182,42,182,42,149,
-42,182,210,149,210,182,210,182,210,149,243,0,210,182,243,0,210,298,210,298,243,0,243,331,210,298,243,331,36,331,243,0,210,149,210,33,243,0,210,33,36,33,243,0,36,33,36,0,210,298,36,331,36,298,210,149,42,182,42,149,
-243,0,243,331,199,331,219,387,190,387,170,331,36,331,36,298,159,298,119,182,42,182,42,149,108,149,68,33,36,33,36,0,56,0,36,-60,65,-60,85,0,16383,16383,210,182,148,182,188,298,210,298,16383,16383,210,33,97,33,137,149,210,149,353,291,318,291,289,258,272,270,253,279,233,285,212,290,190,291,138,283,93,259,57,223,34,178,25,126,27,100,33,75,43,51,56,30,72,11,28,-39,63,-39,92,-6,110,-17,129,-26,148,-33,169,-37,190,-39,242,-30,288,-6,324,28,348,74,
-36,331,159,298,170,331,170,331,159,298,188,298,170,331,188,298,190,387,190,387,188,298,199,331,190,387,199,331,219,387,159,298,137,149,148,182,148,182,137,149,210,149,148,182,210,149,210,182,210,182,210,149,243,0,210,182,243,0,210,298,210,298,243,0,243,331,210,298,243,331,199,331,159,298,119,182,137,149,137,149,119,182,108,149,137,149,108,149,97,33,97,33,108,149,85,0,97,33,85,0,243,0,68,33,36,33,56,0,68,33,56,0,65,-60,68,33,65,-60,85,0,68,33,85,0,108,149,210,33,97,33,243,0,210,33,243,0,210,149,42,182,42,149,108,149,42,182,108,149,119,182,65,-60,56,0,36,-60,159,298,36,331,36,298,56,0,36,33,36,0,159,298,148,182,188,298,199,331,188,298,210,298,
-353,291,318,291,289,258,272,270,253,279,233,285,212,290,190,291,138,283,93,259,57,223,34,178,25,126,27,100,33,75,43,51,56,30,72,11,28,-39,63,-39,92,-6,110,-17,129,-26,148,-33,169,-37,190,-39,242,-30,288,-6,324,28,348,74,356,126,354,152,348,176,338,200,325,221,309,241,16383,16383,287,217,300,201,310,184,317,166,322,147,323,127,316,85,297,48,269,19,232,0,190,-6,174,-5,158,-2,142,2,127,9,113,18,16383,16383,94,36,81,51,71,68,64,86,60,106,58,127,65,168,84,205,112,233,148,252,190,258,208,257,225,254,241,248,256,241,267,233,333,0,185,337,175,337,31,0,16383,16383,272,21,63,21,167,267,334,331,31,331,180,-5,190,-5,16383,16383,302,310,197,64,93,310,313,-12,313,20,167,20,137,24,111,37,89,57,73,82,64,109,313,109,313,142,65,142,74,170,90,195,112,215,138,228,167,233,313,233,313,266,166,266,121,258,84,238,55,207,37,169,30,126,37,83,55,45,84,14,122,-5,167,-12,313,-12,313,20,154,20,148,22,142,23,136,25,179,109,313,109,313,142,195,142,239,233,313,233,313,266,256,266,289,331,257,331,225,266,166,266,121,258,84,238,55,207,37,169,30,126,33,97,42,70,
-323,127,316,85,324,28,324,28,316,85,297,48,324,28,297,48,288,-6,288,-6,297,48,269,19,288,-6,269,19,242,-30,242,-30,269,19,232,0,242,-30,232,0,190,-39,190,-39,232,0,190,-6,127,9,129,-26,142,2,142,2,129,-26,148,-33,142,2,148,-33,158,-2,158,-2,148,-33,169,-37,158,-2,169,-37,174,-5,174,-5,169,-37,190,-39,174,-5,190,-39,190,-6,127,9,113,18,129,-26,267,233,113,18,287,217,267,233,287,217,272,270,129,-26,113,18,110,-17,110,-17,113,18,94,36,110,-17,94,36,92,-6,92,-6,94,36,81,51,92,-6,81,51,72,11,72,11,81,51,71,68,72,11,71,68,64,86,58,127,65,168,57,223,58,127,57,223,56,30,58,127,56,30,60,106,60,106,56,30,72,11,60,106,72,11,64,86,27,100,33,75,34,178,34,178,33,75,43,51,34,178,43,51,57,223,57,223,43,51,56,30,267,233,272,270,256,241,256,241,272,270,253,279,256,241,253,279,241,248,241,248,253,279,233,285,241,248,233,285,225,254,225,254,233,285,212,290,225,254,212,290,208,257,208,257,212,290,190,258,148,252,190,258,190,291,148,252,190,291,138,283,65,168,84,205,93,259,93,259,84,205,112,233,93,259,112,233,138,283,138,283,112,233,148,252,212,290,190,291,190,258,318,291,289,258,300,201,318,291,300,201,309,241,318,291,309,241,353,291,289,258,272,270,287,217,289,258,287,217,300,201,63,-39,92,-6,72,11,63,-39,72,11,28,-39,348,176,338,200,348,74,348,176,348,74,356,126,348,176,356,126,354,152,325,221,309,241,310,184,325,221,310,184,317,166,325,221,317,166,322,147,325,221,322,147,323,127,325,221,323,127,324,28,325,221,324,28,348,74,325,221,348,74,338,200,310,184,309,241,300,201,94,36,113,18,267,233,57,223,65,168,93,259,27,100,34,178,25,126,
-333,0,185,337,175,337,31,0,16383,16383,272,21,63,21,167,267,334,331,31,331,180,-5,190,-5,16383,16383,302,310,197,64,93,310,
-175,337,31,0,63,21,63,21,31,0,333,0,63,21,333,0,272,21,272,21,333,0,185,337,272,21,185,337,175,337,175,337,63,21,167,267,175,337,167,267,272,21,
-334,331,31,331,180,-5,190,-5,16383,16383,302,310,197,64,93,310,313,-12,313,20,167,20,137,24,111,37,89,57,73,82,64,109,
-334,331,31,331,93,310,334,331,93,310,302,310,334,331,302,310,197,64,334,331,197,64,190,-5,180,-5,190,-5,197,64,180,-5,197,64,93,310,180,-5,93,310,31,331,
-313,-12,313,20,167,20,137,24,111,37,89,57,73,82,64,109,313,109,313,142,65,142,74,170,90,195,112,215,138,228,167,233,313,233,313,266,166,266,121,258,84,238,55,207,37,169,30,126,37,83,55,45,84,14,122,-5,167,-12,313,-12,313,20,154,20,148,22,142,23,136,25,179,109,313,109,313,142,195,142,239,233,313,233,313,266,256,266,289,331,257,331,225,266,166,266,121,258,84,238,55,207,37,169,30,126,33,97,42,70,55,45,73,24,96,7,54,-78,
-55,45,84,14,64,109,64,109,65,142,55,45,55,45,65,142,55,207,55,45,55,207,37,83,37,83,55,207,37,169,37,83,37,169,30,126,65,142,64,109,313,109,65,142,313,109,313,142,90,195,112,215,121,258,121,258,112,215,138,228,121,258,138,228,166,266,166,266,138,228,167,233,166,266,167,233,313,266,313,266,167,233,313,233,84,238,55,207,65,142,84,238,65,142,74,170,84,238,74,170,90,195,84,238,90,195,121,258,167,-12,313,-12,313,20,167,-12,313,20,167,20,167,-12,167,20,137,24,167,-12,137,24,122,-5,137,24,111,37,122,-5,122,-5,111,37,89,57,122,-5,89,57,84,14,84,14,89,57,73,82,84,14,73,82,64,109,
-313,-12,313,20,154,20,148,22,142,23,136,25,179,109,313,109,313,142,195,142,239,233,313,233,313,266,256,266,289,331,257,331,225,266,166,266,121,258,84,238,55,207,37,169,30,126,33,97,42,70,55,45,73,24,96,7,54,-78,84,-78,121,-5,130,-7,139,-10,157,-12,167,-12,16383,16383,209,233,164,142,65,142,74,170,90,195,112,215,138,228,167,233,16383,16383,147,109,112,37,98,49,86,62,76,77,69,93,64,109,211,22,211,55,138,55,116,57,97,64,83,75,72,90,65,109,211,109,211,142,65,142,72,162,82,177,97,188,115,194,137,196,211,196,211,229,137,229,102,224,73,210,51,188,37,159,32,126,37,93,51,65,73,42,102,28,137,22,30,266,30,233,175,233,205,228,231,215,253,195,269,170,278,142,30,142,30,109,278,109,269,82,253,57,232,37,205,24,175,20,30,20,30,-12,175,-12,220,-5,258,14,287,45,306,83,
-96,7,96,7,84,-78,96,7,84,-78,121,-5,96,7,121,-5,98,49,96,7,98,49,86,62,96,7,86,62,76,77,96,7,76,77,73,24,55,45,73,24,64,109,64,109,73,24,69,93,69,93,73,24,76,77,161,20,154,20,157,-12,157,-12,154,20,148,22,157,-12,148,22,148,-11,148,-11,148,22,142,23,148,-11,142,23,139,-10,139,-10,142,23,136,25,139,-10,136,25,130,-7,147,109,112,37,121,-5,147,109,121,-5,130,-7,147,109,130,-7,136,25,147,109,136,25,179,109,147,109,179,109,164,142,147,109,164,142,65,142,147,109,65,142,64,109,167,-12,313,-12,313,20,167,-12,313,20,167,20,167,-12,167,20,161,20,167,-12,161,20,157,-12,90,195,112,215,121,258,121,258,112,215,138,228,121,258,138,228,166,266,166,266,138,228,167,233,166,266,167,233,225,266,225,266,167,233,209,233,225,266,209,233,239,233,239,233,209,233,195,142,256,266,289,331,257,331,256,266,257,331,239,233,256,266,239,233,313,233,256,266,313,233,313,266,179,109,313,109,195,142,179,109,195,142,209,233,179,109,209,233,164,142,84,238,55,207,65,142,84,238,65,142,74,170,84,238,74,170,90,195,84,238,90,195,121,258,30,126,33,97,37,169,37,169,33,97,42,70,37,169,42,70,55,207,55,207,42,70,55,45,55,207,55,45,65,142,65,142,55,45,64,109,195,142,313,109,313,142,84,-78,96,7,54,-78,98,49,121,-5,112,37,225,266,239,233,257,331,
-211,22,211,55,138,55,116,57,97,64,83,75,72,90,65,109,211,109,211,142,65,142,72,162,82,177,97,188,115,194,137,196,211,196,211,229,137,229,102,224,73,210,51,188,37,159,32,126,37,93,51,65,73,42,102,28,137,22,30,266,30,233,175,233,205,228,231,215,253,195,269,170,278,142,30,142,30,109,278,109,269,82,253,57,232,37,205,24,175,20,30,20,30,-12,175,-12,220,-5,258,14,287,45,306,83,312,126,313,126,306,169,288,207,259,238,222,258,
-83,75,72,90,73,42,73,42,72,90,65,109,73,42,65,109,51,188,73,42,51,188,51,65,51,65,51,188,37,159,51,65,37,159,37,93,37,93,37,159,32,126,82,177,97,188,102,224,102,224,97,188,115,194,102,224,115,194,137,229,137,229,115,194,137,196,51,188,65,109,65,142,65,142,65,109,211,142,211,142,65,109,211,109,211,229,137,229,137,196,211,229,137,196,211,196,73,210,51,188,65,142,73,210,65,142,72,162,73,210,72,162,82,177,73,210,82,177,102,224,97,64,102,28,116,57,116,57,102,28,137,22,116,57,137,22,138,55,138,55,137,22,211,22,138,55,211,22,211,55,83,75,73,42,102,28,83,75,102,28,97,64,
-30,266,30,233,175,233,205,228,231,215,253,195,269,170,278,142,30,142,30,109,278,109,269,82,253,57,232,37,205,24,175,20,30,20,30,-12,175,-12,220,-5,258,14,287,45,306,83,312,126,313,126,306,169,288,207,259,238,222,258,177,266,289,331,257,331,222,258,213,261,204,263,196,264,186,265,177,266,30,266,30,233,175,233,182,232,188,232,194,231,200,229,206,228,164,142,30,142,30,109,147,109,103,20,30,20,30,-12,86,-12,54,-78,84,-78,117,-12,175,-12,220,-5,258,14,
-269,82,253,57,258,14,258,14,253,57,232,37,258,14,232,37,220,-5,220,-5,232,37,205,24,220,-5,205,24,175,20,177,266,30,266,175,233,177,266,175,233,205,228,177,266,205,228,222,258,312,126,306,169,306,83,306,83,306,169,288,207,306,83,288,207,287,45,287,45,288,207,278,109,287,45,278,109,269,82,231,215,253,195,259,238,259,238,253,195,269,170,259,238,269,170,288,207,288,207,269,170,278,142,288,207,278,142,278,109,222,258,205,228,231,215,222,258,231,215,259,238,175,-12,220,-5,175,20,175,-12,175,20,30,20,175,-12,30,20,30,-12,278,109,278,142,30,142,278,109,30,142,30,109,269,82,258,14,287,45,175,233,30,266,30,233,
-289,331,257,331,222,258,213,261,204,263,196,264,186,265,177,266,30,266,30,233,175,233,182,232,188,232,194,231,200,229,206,228,164,142,30,142,30,109,147,109,103,20,30,20,30,-12,86,-12,54,-78,84,-78,117,-12,175,-12,220,-5,258,14,287,45,306,83,312,126,313,126,310,155,301,183,287,208,269,229,247,247,16383,16383,195,142,230,214,244,203,256,190,266,175,273,159,278,142,16383,16383,278,109,269,82,253,57,232,37,205,24,175,20,133,20,179,109,32,229,32,196,105,196,128,194,146,188,161,177,171,162,177,142,32,142,32,109,177,109,171,90,161,75,146,64,127,57,105,55,32,55,32,22,107,22,141,28,170,42,192,65,206,93,211,126,206,159,192,188,170,210,140,224,105,229,243,0,243,320,30,320,30,0,474,-128,474,-115,465,-115,447,-112,433,-104,424,-92,418,-74,416,-51,416,307,418,330,423,347,434,359,451,366,474,368,474,382,26,382,26,368,35,368,52,366,66,360,76,349,83,331,85,305,
-86,-12,54,-78,84,-78,86,-12,84,-78,117,-12,86,-12,117,-12,103,20,86,-12,103,20,30,20,86,-12,30,20,30,-12,147,109,103,20,117,-12,147,109,117,-12,133,20,147,109,133,20,179,109,147,109,179,109,164,142,147,109,164,142,30,142,147,109,30,142,30,109,269,82,253,57,258,14,258,14,253,57,232,37,258,14,232,37,220,-5,220,-5,232,37,205,24,220,-5,205,24,175,20,195,142,230,214,206,228,206,228,213,261,204,263,206,228,204,263,200,229,200,229,204,263,196,264,200,229,196,264,194,231,194,231,196,264,188,232,30,266,175,233,177,266,177,266,175,233,182,232,177,266,182,232,186,265,186,265,182,232,188,232,186,265,188,232,196,264,257,331,222,258,230,214,257,331,230,214,247,247,257,331,247,247,289,331,230,214,244,203,247,247,247,247,244,203,256,190,247,247,256,190,269,229,269,229,256,190,266,175,269,229,266,175,273,159,213,261,206,228,230,214,213,261,230,214,222,258,273,159,278,142,287,208,278,109,278,142,195,142,278,109,195,142,179,109,179,109,195,142,206,228,179,109,206,228,164,142,312,126,310,155,306,83,306,83,310,155,301,183,306,83,301,183,287,45,287,45,301,183,287,208,287,45,287,208,278,109,278,109,287,208,278,142,269,82,258,14,287,45,269,82,287,45,278,109,175,-12,220,-5,175,20,175,-12,175,20,133,20,175,-12,133,20,117,-12,269,229,273,159,287,208,175,233,30,266,30,233,
-32,229,32,196,105,196,128,194,146,188,161,177,171,162,177,142,32,142,32,109,177,109,171,90,161,75,146,64,127,57,105,55,32,55,32,22,107,22,141,28,170,42,192,65,206,93,211,126,206,159,192,188,170,210,140,224,105,229,243,0,243,320,30,320,30,0,474,-128,474,-115,465,-115,447,-112,433,-104,424,-92,418,-74,416,-51,416,307,418,330,423,347,434,359,451,366,474,368,474,382,26,382,26,368,35,368,52,366,66,360,76,349,83,331,85,305,85,-60,83,-80,
-105,229,32,229,105,229,105,229,32,229,105,196,105,229,105,196,140,224,140,224,105,196,128,194,140,224,128,194,146,188,192,188,177,142,192,65,192,65,177,142,177,109,192,65,177,109,171,90,32,142,32,109,177,109,32,142,177,109,177,142,146,188,161,177,170,210,170,210,161,177,171,162,170,210,171,162,192,188,192,188,171,162,177,142,206,159,192,188,192,65,206,159,192,65,206,93,206,159,206,93,211,126,170,42,192,65,171,90,170,42,171,90,161,75,170,42,161,75,146,64,170,42,146,64,141,28,127,57,105,55,107,22,127,57,107,22,141,28,127,57,141,28,146,64,32,55,32,22,107,22,32,55,107,22,105,55,105,196,32,229,32,196,140,224,146,188,170,210,
-243,0,243,320,30,320,30,0,474,-128,474,-115,465,-115,447,-112,
-243,0,243,320,30,320,243,0,30,320,30,0,
-474,-128,474,-115,465,-115,447,-112,433,-104,424,-92,418,-74,416,-51,416,307,418,330,423,347,434,359,451,366,474,368,474,382,26,382,26,368,35,368,52,366,66,360,76,349,83,331,85,305,85,-60,83,-80,77,-95,67,-106,54,-112,36,-115,26,-115,26,-128,210,-128,210,-115,195,-115,177,-112,165,-104,157,-91,152,-72,151,-48,151,349,350,349,350,-48,349,-69,344,-88,337,-102,324,-111,306,-115,290,-115,290,-128,474,-128,474,-115,451,-112,434,-106,423,-94,418,-77,416,-54,416,304,418,327,424,345,433,358,447,365,465,368,474,368,474,382,290,382,290,368,306,368,324,364,337,355,344,341,349,322,350,300,350,-96,151,-96,151,300,152,325,157,344,165,357,177,365,195,368,210,368,210,382,26,382,26,368,36,368,54,366,67,359,77,348,83,333,85,313,85,-53,83,-78,76,-96,66,-107,52,-113,35,-115,26,-115,26,-128,
-77,-95,67,-106,210,-128,210,-128,67,-106,54,-112,210,-128,54,-112,36,-115,344,-88,337,-102,474,-128,474,-128,337,-102,324,-111,474,-128,324,-111,306,-115,474,382,26,382,35,368,474,382,35,368,52,366,474,382,52,366,66,360,474,382,66,360,76,349,474,382,76,349,151,349,474,382,151,349,350,349,474,382,350,349,434,359,474,382,434,359,451,366,474,382,451,366,474,368,433,-104,424,-92,350,-48,350,-48,424,-92,418,-74,350,-48,418,-74,350,349,350,349,418,-74,416,-51,350,349,416,-51,416,307,350,349,416,307,418,330,350,349,418,330,423,347,350,349,423,347,434,359,165,-104,157,-91,85,-60,85,-60,157,-91,152,-72,85,-60,152,-72,85,305,85,305,152,-72,151,-48,85,305,151,-48,151,349,83,331,85,305,151,349,83,331,151,349,76,349,474,-128,474,-115,465,-115,474,-128,465,-115,447,-112,474,-128,447,-112,433,-104,474,-128,433,-104,349,-69,474,-128,349,-69,344,-88,290,-115,290,-128,474,-128,290,-115,474,-128,306,-115,210,-128,210,-115,195,-115,210,-128,195,-115,177,-112,210,-128,177,-112,83,-80,210,-128,83,-80,77,-95,85,-60,83,-80,177,-112,85,-60,177,-112,165,-104,26,-115,26,-128,210,-128,26,-115,210,-128,36,-115,349,-69,433,-104,350,-48,35,368,26,382,26,368,
-474,-128,474,-115,451,-112,434,-106,423,-94,418,-77,416,-54,416,304,418,327,424,345,433,358,447,365,465,368,474,368,474,382,290,382,290,368,306,368,324,364,337,355,344,341,349,322,350,300,350,-96,151,-96,151,300,152,325,157,344,165,357,177,365,195,368,210,368,210,382,26,382,26,368,36,368,54,366,67,359,77,348,83,333,85,313,85,-53,83,-78,76,-96,66,-107,52,-113,35,-115,26,-115,26,-128,428,20,413,20,405,-7,394,-30,379,-48,357,-59,328,-63,121,-63,289,153,144,349,304,349,339,346,364,336,381,318,392,292,400,256,415,256,415,382,41,382,225,126,29,-128,401,-128,310,110,310,143,32,143,32,110,319,218,319,251,24,251,24,218,16383,16383,319,54,319,86,188,86,188,191,155,191,155,86,24,86,24,54,155,54,155,-43,188,-43,188,54,203,339,201,349,196,358,189,365,180,369,171,371,
-76,-96,66,-107,474,-128,474,-128,66,-107,52,-113,474,-128,52,-113,35,-115,77,348,83,333,210,382,210,382,83,333,177,365,210,382,177,365,195,368,210,382,195,368,210,368,85,313,85,-53,151,-96,85,313,151,-96,151,300,85,313,151,300,152,325,85,313,152,325,157,344,85,313,157,344,165,357,85,313,165,357,177,365,85,313,177,365,83,333,210,382,26,382,36,368,210,382,36,368,54,366,210,382,54,366,67,359,210,382,67,359,77,348,434,-106,423,-94,350,-96,350,-96,423,-94,418,-77,350,-96,418,-77,350,300,349,322,350,300,433,358,349,322,433,358,474,382,474,382,433,358,447,365,474,382,447,365,465,368,474,382,465,368,474,368,416,-54,416,304,350,300,350,300,416,304,418,327,350,300,418,327,424,345,474,382,290,382,306,368,474,382,306,368,324,364,474,382,324,364,337,355,474,382,337,355,344,341,474,382,344,341,349,322,474,-128,474,-115,451,-112,474,-128,451,-112,434,-106,474,-128,434,-106,350,-96,474,-128,350,-96,151,-96,474,-128,151,-96,76,-96,83,-78,76,-96,151,-96,83,-78,151,-96,85,-53,26,-115,26,-128,474,-128,26,-115,474,-128,35,-115,350,300,418,-77,416,-54,306,368,290,382,290,368,433,358,350,300,424,345,36,368,26,382,26,368,
-428,20,413,20,405,-7,394,-30,379,-48,357,-59,328,-63,121,-63,289,153,144,349,304,349,339,346,364,336,381,318,392,292,400,256,415,256,415,382,41,382,225,126,29,-128,401,-128,310,110,310,143,32,143,32,110,319,218,319,251,24,251,24,218,16383,16383,319,54,319,86,188,86,188,191,155,191,155,86,24,86,24,54,155,54,155,-43,188,-43,188,54,203,339,
-415,382,41,382,144,349,415,382,144,349,304,349,415,382,304,349,339,346,415,382,339,346,364,336,415,382,364,336,381,318,415,382,381,318,392,292,415,382,392,292,400,256,415,382,400,256,415,256,225,126,29,-128,121,-63,225,126,121,-63,289,153,225,126,289,153,144,349,225,126,144,349,41,382,394,-30,379,-48,401,-128,401,-128,379,-48,357,-59,401,-128,357,-59,328,-63,405,-7,394,-30,401,-128,405,-7,401,-128,428,20,405,-7,428,20,413,20,121,-63,29,-128,401,-128,121,-63,401,-128,328,-63,
-310,110,310,143,32,143,32,110,319,218,319,251,24,251,24,218,
-310,110,310,143,32,143,310,110,32,143,32,110,
-319,218,319,251,24,251,24,218,16383,16383,319,54,319,86,188,86,188,191,155,191,155,86,24,86,24,54,155,54,155,-43,188,-43,188,54,203,339,201,349,196,358,189,365,180,369,171,371,161,369,153,365,146,358,141,350,139,339,140,328,145,319,151,313,160,308,171,307,181,309,
-24,251,24,218,319,218,24,251,319,218,319,251,188,191,155,191,188,-43,188,-43,155,191,155,86,188,-43,155,86,155,54,155,54,155,86,24,86,155,54,24,86,24,54,188,54,319,54,188,86,188,86,319,54,319,86,188,-43,155,54,155,-43,
-203,339,201,349,196,358,189,365,180,369,171,371,161,369,153,365,146,358,141,350,139,339,140,328,145,319,151,313,160,308,171,307,181,309,190,313,197,320,201,329,203,339,16383,16383,318,110,318,143,188,143,188,273,155,273,155,143,24,143,24,110,155,110,155,-20,188,-20,188,110,239,355,203,355,23,-110,59,-110,201,46,44,205,12,205,171,46,228,169,227,175,225,181,221,185,216,189,210,190,208,190,206,189,204,189,202,188,200,186,191,180,182,170,170,158,156,145,137,133,138,153,142,172,146,190,150,204,151,215,150,222,147,227,143,231,138,234,132,235,
-171,371,171,307,180,369,180,369,171,307,181,309,180,369,181,309,189,365,189,365,181,309,190,313,189,365,190,313,196,358,196,358,190,313,197,320,196,358,197,320,201,349,201,349,197,320,201,329,201,349,201,329,203,339,139,339,140,328,141,350,141,350,140,328,145,319,141,350,145,319,146,358,146,358,145,319,151,313,146,358,151,313,153,365,153,365,151,313,160,308,153,365,160,308,161,369,161,369,160,308,171,307,161,369,171,307,171,371,188,273,155,273,188,-20,188,-20,155,273,155,143,188,-20,155,143,155,110,155,110,155,143,24,143,155,110,24,143,24,110,188,110,318,110,188,143,188,143,318,110,318,143,188,-20,155,110,155,-20,
-239,355,203,355,23,-110,59,-110,201,46,44,205,12,205,171,46,
-239,355,203,355,23,-110,239,355,23,-110,59,-110,
-201,46,44,205,12,205,171,46,228,169,227,175,225,181,221,185,
-201,46,44,205,12,205,201,46,12,205,171,46,
-228,169,227,175,225,181,221,185,216,189,210,190,208,190,206,189,204,189,202,188,200,186,191,180,182,170,170,158,156,145,137,133,138,153,142,172,146,190,150,204,151,215,150,222,147,227,143,231,138,234,132,235,127,234,121,231,117,227,114,222,113,215,114,204,118,189,122,172,126,153,127,132,111,143,96,155,72,179,62,186,63,186,60,188,58,189,56,189,54,190,51,190,45,189,40,185,37,181,34,175,33,169,34,165,35,162,37,159,40,156,44,153,55,149,70,144,87,139,105,133,122,125,105,117,88,111,71,106,56,102,46,98,42,95,39,91,37,87,36,82,35,78,36,73,38,69,42,65,47,63,54,62,56,62,59,63,61,64,67,66,75,72,85,83,98,95,112,108,127,118,126,98,122,80,118,63,114,49,113,37,114,31,117,26,121,21,127,18,132,17,138,18,143,21,147,26,150,31,151,37,150,49,146,63,142,80,138,98,137,118,157,104,173,89,185,75,196,65,208,61,215,62,220,65,224,70,227,75,228,81,227,85,226,88,224,91,221,95,217,97,207,101,193,105,177,109,159,116,140,125,161,135,179,142,195,146,208,149,218,153,221,155,224,158,226,162,228,165,228,169,155,126,152,147,142,166,128,180,110,190,89,194,67,190,48,181,33,167,24,148,20,127,23,105,33,86,47,72,66,62,88,59,109,62,128,72,142,86,152,105,155,126,16383,16383,122,126,120,115,116,105,108,98,99,93,88,92,77,93,67,98,60,106,55,115,53,127,55,138,59,147,67,154,77,159,89,161,99,159,108,154,116,147,120,137,122,126,155,126,152,147,142,166,128,180,110,190,89,194,67,190,48,181,33,167,24,148,20,127,23,105,33,86,47,72,66,62,88,59,109,62,128,72,142,86,152,105,155,126,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,149,381,156,391,162,399,169,404,177,407,185,408,195,407,202,404,208,399,212,392,213,382,211,369,204,359,195,351,183,345,171,340,171,335,184,335,189,334,193,333,196,333,206,328,213,323,219,315,222,306,223,296,222,284,217,274,210,266,201,261,190,259,186,260,182,260,178,262,173,264,168,267,164,270,161,272,152,275,146,273,144,271,142,268,142,265,143,260,146,255,152,251,160,249,171,248,193,250,214,257,231,269,242,286,
-146,63,142,80,143,21,143,21,142,80,138,98,143,21,138,98,138,18,138,18,138,98,137,118,137,133,138,234,132,17,132,17,138,234,132,235,132,17,132,235,127,118,127,118,132,235,127,132,127,118,127,132,122,125,122,125,127,132,111,143,138,153,142,172,143,231,143,231,142,172,146,190,143,231,146,190,147,227,147,227,146,190,150,204,147,227,150,204,150,222,150,222,150,204,151,215,138,234,137,133,138,153,138,234,138,153,143,231,127,118,126,98,127,18,127,118,127,18,132,17,113,37,114,31,114,49,114,49,114,31,117,26,114,49,117,26,118,63,118,63,117,26,121,21,118,63,121,21,122,80,122,80,121,21,127,18,122,80,127,18,126,98,137,118,157,104,140,125,140,125,157,104,159,116,159,116,157,104,173,89,159,116,173,89,177,109,177,109,173,89,185,75,177,109,185,75,193,105,193,105,185,75,196,65,193,105,196,65,207,101,207,101,196,65,208,61,207,101,208,61,217,97,217,97,208,61,215,62,217,97,215,62,220,65,221,155,224,158,225,181,225,181,224,158,226,162,225,181,226,162,227,175,227,175,226,162,228,165,227,175,228,165,228,169,221,185,216,189,218,153,221,185,218,153,221,155,221,185,221,155,225,181,216,189,210,190,218,153,218,153,210,190,208,190,218,153,208,190,208,149,208,149,208,190,206,189,208,149,206,189,204,189,204,189,202,188,208,149,208,149,202,188,200,186,208,149,200,186,195,146,195,146,200,186,191,180,195,146,191,180,182,170,156,145,140,125,161,135,156,145,161,135,170,158,170,158,161,135,179,142,170,158,179,142,182,170,182,170,179,142,195,146,137,133,137,118,140,125,137,133,140,125,156,145,137,118,137,133,132,17,137,118,132,17,138,18,228,81,227,85,227,75,227,75,227,85,226,88,227,75,226,88,224,70,224,70,226,88,224,91,224,70,224,91,221,95,221,95,217,97,220,65,221,95,220,65,224,70,150,49,146,63,147,26,150,49,147,26,150,31,150,49,150,31,151,37,127,132,132,235,127,234,127,132,127,234,126,153,126,153,127,234,122,172,122,172,127,234,121,231,122,172,121,231,118,189,118,189,121,231,117,227,118,189,117,227,114,204,114,204,117,227,114,222,114,204,114,222,113,215,75,72,85,83,88,111,88,111,85,83,98,95,88,111,98,95,105,117,105,117,98,95,112,108,105,117,112,108,122,125,122,125,112,108,127,118,71,106,56,102,59,63,71,106,59,63,61,64,71,106,61,64,64,65,71,106,64,65,67,66,71,106,67,66,75,72,71,106,75,72,88,111,56,102,46,98,47,63,56,102,47,63,54,62,56,102,54,62,56,62,56,102,56,62,59,63,42,65,47,63,46,98,42,65,46,98,42,95,42,65,42,95,39,91,42,65,39,91,38,69,37,87,36,82,36,73,37,87,36,73,38,69,37,87,38,69,39,91,122,125,111,143,105,133,105,133,111,143,96,155,105,133,96,155,87,139,87,139,96,155,83,168,87,139,83,168,72,179,70,144,87,139,72,179,70,144,72,179,62,186,70,144,62,186,60,188,70,144,60,188,58,189,70,144,58,189,56,189,70,144,56,189,55,149,55,149,56,189,54,190,55,149,54,190,51,190,55,149,51,190,45,189,55,149,45,189,44,153,40,185,37,181,37,159,40,185,37,159,40,156,40,185,40,156,44,153,40,185,44,153,45,189,33,169,34,165,34,175,34,175,34,165,35,162,34,175,35,162,37,181,37,181,35,162,37,159,36,73,36,82,35,78,146,63,143,21,147,26,
-155,126,152,147,142,166,128,180,110,190,89,194,67,190,48,181,33,167,24,148,20,127,23,105,33,86,47,72,66,62,88,59,109,62,128,72,142,86,152,105,155,126,16383,16383,122,126,120,115,116,105,108,98,99,93,88,92,77,93,67,98,60,106,55,115,53,127,55,138,59,147,67,154,77,159,89,161,99,159,108,154,116,147,120,137,122,126,155,126,152,147,142,166,128,180,110,190,89,194,67,190,48,181,33,167,24,148,20,127,23,105,33,86,47,72,66,62,88,59,109,62,128,72,142,86,152,105,155,126,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,149,381,156,391,162,399,
-60,106,66,62,67,98,67,98,66,62,88,59,67,98,88,59,77,93,77,93,88,59,88,92,99,93,88,92,88,59,99,93,88,59,109,62,55,138,59,147,67,190,67,190,59,147,67,154,67,190,67,154,89,194,89,194,67,154,77,159,89,194,77,159,89,161,89,161,99,159,110,190,110,190,99,159,108,154,110,190,108,154,116,147,20,127,23,105,24,148,24,148,23,105,33,86,24,148,33,86,33,167,33,167,33,86,47,72,33,167,47,72,48,181,48,181,47,72,53,127,55,138,67,190,48,181,55,138,48,181,53,127,155,126,152,147,152,105,152,105,152,147,142,166,152,105,142,166,142,86,142,86,142,166,128,180,142,86,128,180,128,72,128,72,128,180,122,126,128,72,122,126,120,115,128,72,120,115,116,105,128,180,110,190,116,147,128,180,116,147,120,137,128,180,120,137,122,126,110,190,89,194,89,161,109,62,128,72,116,105,109,62,116,105,108,98,109,62,108,98,99,93,55,115,53,127,47,72,55,115,47,72,66,62,55,115,66,62,60,106,
-155,126,152,147,142,166,128,180,110,190,89,194,67,190,48,181,33,167,24,148,20,127,23,105,33,86,47,72,66,62,88,59,109,62,128,72,142,86,152,105,155,126,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,149,381,156,391,
-20,127,23,105,24,148,24,148,23,105,33,86,24,148,33,86,33,167,33,167,33,86,47,72,33,167,47,72,48,181,48,181,47,72,66,62,48,181,66,62,67,190,67,190,66,62,88,59,67,190,88,59,89,194,89,194,88,59,109,62,89,194,109,62,110,190,110,190,109,62,128,72,110,190,128,72,128,180,128,180,128,72,142,86,128,180,142,86,142,166,142,166,142,86,152,105,142,166,152,105,152,147,152,147,152,105,155,126,
-482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,149,381,156,391,162,399,169,404,177,407,185,408,195,407,202,404,208,399,212,392,213,382,211,369,204,359,195,351,183,345,171,340,171,335,184,335,189,334,
-76,159,83,163,134,222,134,222,83,163,89,165,134,222,89,165,94,165,94,165,102,164,134,222,134,222,102,164,108,161,134,222,108,161,114,155,143,222,134,222,227,-128,227,-128,134,222,126,136,120,147,126,136,134,222,120,147,134,222,114,155,134,222,56,160,62,150,134,222,62,150,69,155,134,222,69,155,76,159,143,222,227,-128,246,-45,246,-45,227,-128,243,-128,246,-45,243,-128,248,-45,248,-45,243,-128,482,487,248,-45,482,487,454,487,
-149,381,156,391,162,399,169,404,177,407,185,408,195,407,202,404,208,399,212,392,213,382,211,369,204,359,195,351,183,345,171,340,171,335,184,335,189,334,193,333,196,333,206,328,213,323,219,315,222,306,223,296,222,284,217,274,210,266,201,261,190,259,186,260,182,260,178,262,173,264,168,267,164,270,161,272,152,275,146,273,144,271,142,268,142,265,143,260,146,255,152,251,160,249,171,248,193,250,214,257,231,269,242,286,247,307,245,320,240,331,233,340,223,347,210,352,218,358,224,365,229,373,232,381,233,388,231,400,226,410,218,417,206,421,193,423,178,421,166,416,156,407,149,396,143,382,16383,16383,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,252,291,252,312,225,312,225,421,210,421,131,312,131,291,201,291,201,249,225,249,225,291,16383,16383,201,312,142,312,201,395,16383,16383,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,321,42,304,45,287,54,270,70,253,92,235,121,235,123,245,137,258,150,275,162,296,170,321,173,321,215,294,211,272,201,254,185,239,165,225,142,199,174,177,195,156,207,137,213,116,215,95,212,70,201,46,180,28,147,21,100,26,63,39,35,59,15,83,4,108,0,135,3,159,12,180,27,198,47,213,73,232,47,250,27,271,12,294,3,321,0,16383,16383,202,90,193,78,180,66,164,54,144,45,120,42,96,47,76,59,62,78,53,101,50,126,53,144,60,161,71,174,
-158,273,160,249,161,272,161,272,160,249,171,248,161,272,171,248,164,270,164,270,171,248,168,267,173,264,168,267,171,248,173,264,171,248,193,250,149,381,156,391,156,407,156,407,156,391,162,399,156,407,162,399,166,416,166,416,162,399,169,404,166,416,169,404,178,421,178,421,169,404,177,407,178,421,177,407,185,408,185,408,195,407,193,423,193,423,195,407,206,421,149,396,143,382,149,381,149,396,149,381,156,407,184,335,189,334,195,351,195,351,189,334,193,333,195,351,193,333,196,333,196,333,206,328,204,359,204,359,206,328,211,369,183,345,171,340,178,335,183,345,178,335,184,335,183,345,184,335,195,351,204,359,195,351,196,333,210,352,218,358,211,369,211,369,218,358,213,382,218,417,213,382,218,358,218,417,218,358,226,410,226,410,218,358,224,365,226,410,224,365,229,373,195,407,202,404,206,421,206,421,202,404,208,399,206,421,208,399,218,417,218,417,208,399,212,392,218,417,212,392,213,382,231,400,226,410,229,373,231,400,229,373,232,381,231,400,232,381,233,388,210,352,211,369,206,328,210,352,206,328,213,323,210,352,213,323,223,347,242,286,247,307,245,320,242,286,245,320,240,331,242,286,240,331,233,340,242,286,233,340,231,269,223,296,231,269,233,340,223,296,233,340,223,347,223,347,213,323,219,315,223,347,219,315,222,306,223,347,222,306,223,296,210,266,214,257,217,274,217,274,214,257,231,269,217,274,231,269,222,284,222,284,231,269,223,296,190,259,193,250,201,261,201,261,193,250,214,257,201,261,214,257,210,266,193,423,178,421,185,408,186,260,182,260,193,250,186,260,193,250,190,259,178,262,173,264,193,250,178,262,193,250,182,260,155,274,152,275,152,251,155,274,152,251,160,249,155,274,160,249,158,273,149,274,146,273,146,255,149,274,146,255,152,251,149,274,152,251,152,275,144,271,142,268,143,260,144,271,143,260,146,255,144,271,146,255,146,273,76,159,83,163,134,222,134,222,83,163,89,165,134,222,89,165,94,165,94,165,102,164,134,222,134,222,102,164,108,161,134,222,108,161,114,155,143,222,134,222,227,-128,227,-128,134,222,126,136,120,147,126,136,134,222,120,147,134,222,114,155,134,222,56,160,62,150,134,222,62,150,69,155,134,222,69,155,76,159,143,222,227,-128,246,-45,246,-45,227,-128,243,-128,246,-45,243,-128,248,-45,248,-45,243,-128,482,487,248,-45,482,487,454,487,143,260,142,268,142,265,178,335,171,340,171,335,
-252,291,252,312,225,312,225,421,210,421,131,312,131,291,201,291,201,249,225,249,225,291,16383,16383,201,312,142,312,201,395,16383,16383,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,321,42,304,45,287,54,270,70,253,92,235,121,235,123,245,137,258,150,275,162,296,170,321,173,321,215,294,211,272,201,254,185,239,165,225,142,199,174,177,195,156,207,137,213,116,215,95,212,70,201,46,180,28,147,21,100,26,63,39,35,59,15,83,4,108,0,135,3,159,12,
-131,291,201,291,131,312,131,312,201,291,142,312,131,312,142,312,210,421,210,421,142,312,201,395,210,421,201,395,225,249,225,249,201,395,201,312,225,249,201,312,201,291,201,291,201,312,142,312,210,421,225,249,225,421,225,312,225,291,252,291,225,312,252,291,252,312,76,159,83,163,134,222,134,222,83,163,89,165,134,222,89,165,94,165,94,165,102,164,134,222,134,222,102,164,108,161,134,222,108,161,114,155,143,222,134,222,227,-128,227,-128,134,222,126,136,120,147,126,136,134,222,120,147,134,222,114,155,134,222,56,160,62,150,134,222,62,150,69,155,134,222,69,155,76,159,143,222,227,-128,246,-45,246,-45,227,-128,243,-128,246,-45,243,-128,248,-45,248,-45,243,-128,482,487,248,-45,482,487,454,487,225,249,201,291,201,249,
-321,42,304,45,287,54,270,70,253,92,235,121,235,123,245,137,258,150,275,162,296,170,321,173,321,215,294,211,272,201,254,185,239,165,225,142,199,174,177,195,156,207,137,213,116,215,95,212,70,201,46,180,28,147,21,100,26,63,39,35,59,15,83,4,108,0,135,3,159,12,180,27,198,47,213,73,232,47,250,27,271,12,294,3,321,0,16383,16383,202,90,193,78,180,66,164,54,144,45,120,42,96,47,76,59,62,78,53,101,50,126,53,144,60,161,71,174,85,182,100,185,121,181,140,169,160,150,181,124,202,92,427,111,422,148,408,177,387,198,363,210,336,215,309,211,287,201,269,185,253,165,239,142,213,174,191,195,171,207,151,213,131,215,110,212,84,201,60,180,42,147,35,100,40,63,54,35,73,15,97,4,123,0,150,3,174,12,195,27,213,47,228,73,246,47,264,27,284,12,305,3,328,0,363,7,390,25,410,51,423,81,427,111,16383,16383,249,123,259,136,270,149,285,161,304,170,328,173,352,169,371,157,385,138,394,115,397,89,394,70,387,54,377,41,363,33,347,30,327,33,308,45,290,63,270,89,249,121,16383,16383,217,90,
-213,73,232,47,213,73,213,73,232,47,225,142,213,73,225,142,202,92,202,92,199,174,181,124,181,124,199,174,177,195,181,124,177,195,160,150,160,150,177,195,156,207,160,150,156,207,140,169,140,169,156,207,137,213,140,169,137,213,121,181,121,181,137,213,116,215,121,181,116,215,100,185,53,144,60,161,70,201,70,201,60,161,71,174,70,201,71,174,95,212,95,212,71,174,85,182,95,212,85,182,100,185,21,100,26,63,28,147,28,147,26,63,39,35,28,147,39,35,46,180,46,180,39,35,59,15,46,180,59,15,50,126,50,126,53,144,46,180,46,180,53,144,70,201,202,90,193,78,198,47,198,47,193,78,180,66,198,47,180,66,180,27,180,27,180,66,164,54,180,27,164,54,159,12,159,12,164,54,144,45,159,12,144,45,135,3,135,3,144,45,120,42,135,3,120,42,108,0,108,0,120,42,96,47,108,0,96,47,83,4,83,4,96,47,76,59,83,4,76,59,62,78,59,15,83,4,62,78,59,15,62,78,53,101,59,15,53,101,50,126,287,54,270,70,271,12,271,12,270,70,253,92,271,12,253,92,250,27,250,27,253,92,235,121,250,27,235,121,232,47,321,173,321,215,296,170,296,170,321,215,294,211,296,170,294,211,275,162,275,162,294,211,272,201,275,162,272,201,258,150,258,150,272,201,254,185,258,150,254,185,245,137,245,137,254,185,239,165,245,137,239,165,235,123,235,123,239,165,225,142,235,123,225,142,232,47,235,123,232,47,235,121,304,45,287,54,294,3,304,45,294,3,321,0,304,45,321,0,321,42,199,174,202,92,225,142,213,73,202,92,202,90,213,73,202,90,198,47,100,185,116,215,95,212,287,54,271,12,294,3,
-427,111,422,148,408,177,387,198,363,210,336,215,309,211,287,201,269,185,253,165,239,142,213,174,191,195,171,207,151,213,131,215,110,212,84,201,60,180,42,147,35,100,40,63,54,35,73,15,97,4,123,0,150,3,174,12,195,27,213,47,228,73,246,47,264,27,284,12,305,3,328,0,363,7,390,25,410,51,423,81,427,111,16383,16383,249,123,259,136,270,149,285,161,304,170,328,173,352,169,371,157,385,138,394,115,397,89,394,70,387,54,377,41,363,33,347,30,327,33,308,45,290,63,270,89,249,121,16383,16383,217,90,207,78,195,66,179,54,159,45,134,42,110,47,91,59,77,78,68,101,65,126,67,144,74,161,85,174,99,182,115,185,135,181,155,169,175,150,195,124,217,92,317,0,317,33,58,33,58,292,25,292,25,0,321,0,321,33,91,33,310,252,285,273,12,0,321,0,321,33,271,33,265,61,257,88,247,113,233,138,218,160,310,252,284,273,196,185,186,195,174,205,169,209,148,182,168,166,172,161,11,0,239,0,239,-18,238,-24,238,-30,270,-35,272,-21,272,0,16383,16383,90,33,194,137,207,118,217,98,226,77,233,56,237,33,326,40,281,59,284,72,286,86,288,99,290,127,289,140,288,154,286,168,280,196,326,216,314,246,269,228,266,234,263,241,257,253,253,259,225,243,228,237,231,232,233,226,236,220,238,215,28,127,239,40,237,34,234,29,232,23,229,17,225,12,254,-5,258,1,261,8,265,14,268,21,270,27,314,9,16383,16383,114,127,249,184,
-228,73,246,47,228,73,228,73,246,47,239,142,228,73,239,142,217,92,217,92,213,174,195,124,195,124,213,174,191,195,195,124,191,195,175,150,175,150,191,195,171,207,175,150,171,207,155,169,155,169,171,207,151,213,155,169,151,213,135,181,135,181,151,213,131,215,135,181,131,215,115,185,67,144,74,161,84,201,84,201,74,161,85,174,84,201,85,174,110,212,110,212,85,174,99,182,110,212,99,182,115,185,35,100,40,63,42,147,42,147,40,63,54,35,42,147,54,35,60,180,60,180,54,35,73,15,60,180,73,15,65,126,65,126,67,144,60,180,60,180,67,144,84,201,217,90,207,78,213,47,213,47,207,78,195,66,213,47,195,66,195,27,195,27,195,66,179,54,195,27,179,54,174,12,174,12,179,54,159,45,174,12,159,45,150,3,150,3,159,45,134,42,150,3,134,42,123,0,123,0,134,42,110,47,123,0,110,47,97,4,97,4,110,47,91,59,97,4,91,59,77,78,73,15,97,4,77,78,73,15,77,78,68,101,73,15,68,101,65,126,336,215,328,173,352,169,336,215,352,169,363,210,363,210,352,169,371,157,363,210,371,157,387,198,387,198,371,157,385,138,387,198,385,138,394,115,270,149,285,161,287,201,287,201,285,161,304,170,287,201,304,170,309,211,309,211,304,170,328,173,309,211,328,173,336,215,239,142,249,123,253,165,253,165,249,123,259,136,253,165,259,136,269,185,269,185,259,136,270,149,269,185,270,149,287,201,264,27,249,121,246,47,246,47,249,121,249,123,246,47,249,123,239,142,249,121,264,27,270,89,270,89,264,27,284,12,270,89,284,12,290,63,290,63,284,12,305,3,290,63,305,3,308,45,308,45,305,3,328,0,308,45,328,0,327,33,327,33,328,0,347,30,363,33,347,30,363,7,363,33,363,7,390,25,387,198,394,115,408,177,408,177,394,115,397,89,410,51,397,89,394,70,410,51,394,70,390,25,390,25,394,70,387,54,390,25,387,54,377,41,422,148,408,177,410,51,422,148,410,51,423,81,422,148,423,81,427,111,347,30,328,0,363,7,213,174,217,92,239,142,228,73,217,92,217,90,228,73,217,90,213,47,115,185,131,215,110,212,363,33,390,25,377,41,397,89,410,51,408,177,
-317,0,317,33,58,33,58,292,25,292,25,0,321,0,321,33,91,33,310,252,285,273,12,0,
-58,33,58,292,25,292,58,33,25,292,25,0,58,33,25,0,317,0,58,33,317,0,317,33,
-321,0,321,33,91,33,310,252,285,273,12,0,321,0,321,33,271,33,265,61,257,88,247,113,
-91,33,310,252,285,273,91,33,285,273,12,0,91,33,12,0,321,0,91,33,321,0,321,33,
-321,0,321,33,271,33,265,61,257,88,247,113,233,138,218,160,310,252,284,273,196,185,186,195,174,205,169,209,148,182,168,166,172,161,11,0,239,0,239,-18,238,-24,238,-30,270,-35,272,-21,272,0,16383,16383,90,33,194,137,207,118,217,98,226,77,233,56,237,33,326,40,281,59,284,72,286,86,288,99,290,127,289,140,288,154,286,168,280,196,326,216,314,246,269,228,266,234,263,241,257,253,253,259,225,243,228,237,231,232,233,226,236,220,238,215,28,127,239,40,237,34,234,29,232,23,229,17,225,12,254,-5,258,1,261,8,
-90,33,194,137,172,161,172,161,174,205,169,209,172,161,169,209,168,166,168,166,169,209,163,170,169,209,148,182,153,178,169,209,153,178,158,174,169,209,158,174,163,170,194,137,207,118,196,185,196,185,207,118,218,160,196,185,218,160,284,273,284,273,218,160,310,252,207,118,217,98,218,160,218,160,217,98,226,77,218,160,226,77,233,138,233,138,226,77,233,56,233,138,233,56,237,33,194,137,196,185,191,190,194,137,191,190,186,195,194,137,186,195,180,200,194,137,180,200,174,205,194,137,174,205,172,161,233,138,237,33,247,113,239,0,237,33,90,33,239,0,90,33,11,0,11,0,90,33,172,161,265,61,257,88,270,-35,270,-35,257,88,247,113,270,-35,247,113,239,0,239,0,247,113,237,33,272,0,321,0,321,33,272,0,321,33,271,33,272,0,271,33,271,-28,272,0,271,-28,272,-21,272,0,272,-21,272,-14,272,0,272,-14,272,-6,271,33,265,61,270,-35,271,33,270,-35,271,-28,270,-35,239,0,239,-5,270,-35,239,-5,239,-12,270,-35,239,-12,239,-18,270,-35,239,-18,238,-24,270,-35,238,-24,238,-30,
-326,40,281,59,284,72,286,86,288,99,290,127,289,140,288,154,286,168,280,196,326,216,314,246,269,228,266,234,263,241,257,253,253,259,225,243,228,237,231,232,233,226,236,220,238,215,28,127,239,40,237,34,234,29,232,23,229,17,225,12,254,-5,258,1,261,8,265,14,268,21,270,27,314,9,16383,16383,114,127,249,184,252,172,254,161,255,149,257,127,256,115,254,93,252,82,249,71,83,-93,83,345,50,345,50,-93,190,152,179,178,118,147,118,345,84,345,84,130,12,93,23,66,84,98,84,-93,118,-93,118,114,197,-93,197,345,164,345,164,-93,16383,16383,98,-93,98,345,65,345,65,-93,293,181,281,207,219,175,219,345,185,345,185,158,119,125,119,345,86,345,86,108,12,70,23,44,86,75,86,-93,119,-93,119,93,185,126,185,-93,219,-93,219,143,295,-14,157,268,152,268,
-256,115,258,1,257,127,257,127,258,1,260,247,260,247,258,1,261,8,260,247,261,8,263,241,263,241,261,8,265,14,263,241,265,14,266,234,266,234,265,14,268,21,266,234,268,21,269,228,269,228,268,21,270,27,269,228,270,27,280,196,280,196,270,27,281,59,280,196,281,59,283,182,283,182,281,59,284,72,283,182,284,72,286,168,286,168,284,72,286,86,286,168,286,86,288,154,288,154,286,86,288,99,288,154,288,99,289,140,289,140,288,99,289,113,289,140,289,113,290,127,314,9,326,40,281,59,314,9,281,59,270,27,314,246,269,228,280,196,314,246,280,196,326,216,255,149,256,138,257,253,257,253,256,138,257,127,257,253,257,127,260,247,249,184,252,172,253,259,253,259,252,172,254,161,253,259,254,161,257,253,257,253,254,161,255,149,253,259,225,243,228,237,253,259,228,237,231,232,253,259,231,232,233,226,253,259,233,226,236,220,253,259,236,220,238,215,253,259,238,215,249,184,255,104,254,93,254,-5,255,104,254,-5,258,1,255,104,258,1,256,115,254,-5,254,93,252,82,254,-5,252,82,249,71,254,-5,249,71,239,40,254,-5,239,40,237,34,254,-5,237,34,234,29,254,-5,234,29,232,23,254,-5,232,23,229,17,254,-5,229,17,225,12,238,215,28,127,114,127,114,127,28,127,239,40,114,127,239,40,249,71,238,215,114,127,249,184,
-83,-93,83,345,50,345,50,-93,190,152,179,178,118,147,118,345,
-83,-93,83,345,50,345,83,-93,50,345,50,-93,
-190,152,179,178,118,147,118,345,84,345,84,130,12,93,23,66,84,98,84,-93,118,-93,118,114,197,-93,197,345,164,345,164,-93,16383,16383,98,-93,98,345,65,345,65,-93,293,181,281,207,219,175,
-84,130,12,93,23,66,84,130,23,66,84,98,84,130,84,98,118,-93,84,130,118,-93,84,345,84,345,118,-93,118,345,118,147,118,114,190,152,118,147,190,152,179,178,118,-93,84,98,84,-93,
-197,-93,197,345,164,345,164,-93,16383,16383,98,-93,98,345,65,345,65,-93,293,181,281,207,219,175,219,345,185,345,185,158,119,125,119,345,86,345,
-164,345,164,-93,197,-93,164,345,197,-93,197,345,65,345,65,-93,98,-93,65,345,98,-93,98,345,
-293,181,281,207,219,175,219,345,185,345,185,158,119,125,119,345,86,345,86,108,12,70,23,44,86,75,86,-93,119,-93,119,93,185,126,185,-93,219,-93,219,143,295,-14,157,268,152,268,16,-14,47,-14,155,201,262,-14,295,268,263,268,156,52,48,268,16,268,153,-14,158,-14,286,-15,286,132,280,177,261,215,233,243,197,261,
-86,108,12,70,23,44,86,108,23,44,86,75,86,108,86,75,119,-93,86,108,119,-93,86,345,219,345,185,345,219,-93,219,-93,185,345,185,158,219,-93,185,158,185,126,185,126,185,158,119,125,185,126,119,125,119,93,119,-93,119,345,86,345,219,143,293,181,219,175,219,175,293,181,281,207,219,-93,185,126,185,-93,119,-93,86,75,86,-93,
-295,-14,157,268,152,268,16,-14,47,-14,155,201,262,-14,295,268,263,268,156,52,48,268,16,268,153,-14,158,-14,
-16,-14,47,-14,152,268,152,268,47,-14,155,201,152,268,155,201,157,268,157,268,155,201,262,-14,157,268,262,-14,295,-14,
-295,268,263,268,156,52,48,268,16,268,153,-14,158,-14,286,-15,286,132,280,177,261,215,233,243,197,261,155,268,
-295,268,263,268,158,-14,158,-14,263,268,156,52,158,-14,156,52,153,-14,153,-14,156,52,48,268,153,-14,48,268,16,268,
-286,-15,286,132,280,177,261,215,233,243,197,261,155,268,113,262,77,244,49,216,30,178,24,134,24,-15,57,-15,57,132,62,165,76,193,97,215,124,230,155,235,186,230,212,215,234,193,248,165,253,132,253,-15,286,268,253,268,253,120,248,87,234,59,212,37,186,23,155,17,124,23,97,37,76,60,62,88,57,121,57,268,24,268,24,118,30,74,49,37,77,9,113,-8,155,-15,197,-8,233,9,261,38,280,75,286,120,
-253,132,253,132,248,165,248,165,253,132,261,215,248,165,261,215,234,193,234,193,261,215,233,243,234,193,233,243,212,215,212,215,233,243,197,261,212,215,197,261,186,230,186,230,197,261,155,235,124,230,155,235,155,268,124,230,155,268,113,262,62,165,76,193,77,244,77,244,76,193,97,215,77,244,97,215,113,262,113,262,97,215,124,230,49,216,30,178,57,-15,49,216,57,-15,57,132,49,216,57,132,62,165,49,216,62,165,77,244,24,134,24,-15,57,-15,24,134,57,-15,30,178,197,261,155,268,155,235,286,-15,286,132,280,177,286,-15,280,177,261,215,286,-15,261,215,253,132,286,-15,253,132,253,-15,
-286,268,253,268,253,120,248,87,234,59,212,37,186,23,155,17,124,23,97,37,76,60,62,88,57,121,57,268,24,268,24,118,30,74,49,37,77,9,113,-8,155,-15,197,-8,233,9,261,38,280,75,286,120,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,18,-143,22,-150,28,-155,
-253,120,248,87,261,38,261,38,248,87,234,59,261,38,234,59,233,9,233,9,234,59,212,37,233,9,212,37,197,-8,197,-8,212,37,186,23,197,-8,186,23,155,-15,155,-15,186,23,155,17,286,268,253,268,261,38,286,268,261,38,280,75,286,268,280,75,286,120,76,60,77,9,97,37,97,37,77,9,113,-8,97,37,113,-8,124,23,124,23,113,-8,155,-15,124,23,155,-15,155,17,62,88,57,121,49,37,62,88,49,37,77,9,62,88,77,9,76,60,57,268,24,268,30,74,57,268,30,74,49,37,57,268,49,37,57,121,30,74,24,268,24,118,253,120,261,38,253,268,
-102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,18,-143,22,-150,28,-155,37,-158,49,-159,78,-153,102,-135,119,-111,131,-84,140,-58,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,318,396,314,402,307,407,298,411,287,412,255,404,231,385,213,359,201,330,193,303,223,-61,215,-89,207,-112,198,-129,188,-140,175,-144,173,-143,172,-143,170,-142,170,-140,171,-137,173,-135,175,-132,178,-127,179,-120,178,-116,175,-112,172,-109,168,-108,163,-107,155,-109,148,-113,142,-119,139,-127,137,-136,138,-143,141,-150,146,-155,154,-158,165,-159,195,-153,219,-135,238,-111,252,-84,261,-58,352,308,360,337,368,362,378,380,389,393,402,397,404,397,406,396,408,394,408,392,407,390,405,387,402,384,400,379,399,372,400,368,402,364,410,360,415,360,423,361,430,366,435,372,439,380,440,390,439,396,436,402,431,407,424,411,413,412,381,404,355,385,336,359,
-49,-140,49,-137,51,-109,51,-109,49,-137,52,-135,51,-109,52,-135,54,-112,54,-112,52,-135,54,-132,54,-112,54,-132,57,-116,57,-116,54,-132,57,-127,57,-116,57,-127,57,-120,18,-127,18,-143,21,-119,21,-119,18,-143,22,-150,21,-119,22,-150,27,-113,27,-113,22,-150,28,-155,27,-113,28,-155,34,-109,34,-109,28,-155,37,-158,34,-109,37,-158,42,-107,42,-107,37,-158,49,-159,42,-107,49,-159,46,-108,46,-108,49,-159,49,-140,86,-112,77,-129,78,-153,78,-153,77,-129,67,-140,78,-153,67,-140,54,-144,54,-144,52,-143,78,-153,78,-153,52,-143,50,-143,78,-153,50,-143,49,-159,49,-159,50,-143,49,-142,49,-159,49,-142,49,-141,285,396,287,412,283,397,283,397,287,412,281,397,268,393,281,397,287,412,268,393,287,412,255,404,289,360,294,360,298,411,298,411,294,360,302,361,298,411,302,361,307,407,307,407,302,361,309,366,307,407,309,366,314,402,314,402,309,366,315,372,314,402,315,372,318,396,318,396,315,372,318,380,318,396,318,380,320,390,279,379,279,368,281,384,281,384,279,368,281,364,281,384,281,364,284,387,284,387,281,364,285,362,284,387,285,362,286,390,286,390,285,362,289,360,286,390,289,360,287,392,287,392,289,360,298,411,287,412,285,396,286,395,287,412,286,395,287,394,287,412,287,394,287,392,287,412,287,392,298,411,255,404,231,385,231,308,255,404,231,308,239,337,255,404,239,337,247,362,255,404,247,362,257,380,255,404,257,380,268,393,231,308,231,385,213,359,231,308,213,359,201,330,231,308,201,330,193,303,231,308,193,303,140,-58,94,-89,102,-135,102,-61,102,-61,102,-135,119,-111,102,-61,119,-111,193,303,193,303,119,-111,131,-84,193,303,131,-84,140,-58,86,-112,78,-153,102,-135,86,-112,102,-135,94,-89,49,-140,49,-159,49,-141,279,368,279,379,278,372,18,-143,18,-127,16,-136,46,-108,49,-140,51,-109,
-223,-61,215,-89,207,-112,198,-129,188,-140,175,-144,173,-143,172,-143,170,-142,170,-140,171,-137,173,-135,175,-132,178,-127,179,-120,178,-116,175,-112,172,-109,168,-108,163,-107,155,-109,148,-113,142,-119,139,-127,137,-136,138,-143,141,-150,146,-155,154,-158,165,-159,195,-153,219,-135,238,-111,252,-84,261,-58,352,308,360,337,368,362,378,380,389,393,402,397,404,397,406,396,408,394,408,392,407,390,405,387,402,384,400,379,399,372,400,368,402,364,410,360,415,360,423,361,430,366,435,372,439,380,440,390,439,396,436,402,431,407,424,411,413,412,381,404,355,385,336,359,323,330,314,303,16383,16383,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,98,-135,117,-111,131,-84,140,-58,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,359,201,330,193,303,344,-61,336,-89,328,-112,319,-129,309,-140,296,-144,294,-143,293,-143,291,-141,291,-140,292,-137,297,-132,299,-127,300,-120,299,-116,296,-112,293,-109,288,-108,284,-107,276,-109,269,-113,263,-119,259,-127,258,-136,259,-143,262,-150,267,-155,275,-158,286,-159,316,-153,341,-135,359,-111,373,-84,382,-58,473,308,481,337,489,362,499,380,510,393,523,397,525,397,527,396,529,394,529,392,528,390,526,387,523,384,521,379,520,372,521,368,523,364,531,360,536,360,544,361,551,366,556,372,560,380,561,390,560,396,558,402,552,407,545,411,534,412,502,404,476,385,457,359,443,330,435,303,16383,16383,223,-61,215,-89,207,-112,198,-129,187,-140,175,-144,173,-143,171,-143,169,-141,169,-140,170,-137,175,-132,177,-127,178,-120,177,-116,175,-112,171,-109,167,-108,162,-107,154,-109,147,-113,142,-119,138,-127,137,-136,138,-143,141,-150,146,-155,154,-158,164,-159,194,-153,219,-135,238,-111,251,-84,260,-58,352,308,359,337,368,362,377,380,388,393,402,397,404,397,405,396,407,395,407,392,406,390,402,384,399,379,398,372,399,368,402,364,405,362,409,360,414,360,422,361,429,366,435,372,438,380,440,390,439,396,436,402,431,407,423,411,412,412,380,404,355,385,336,359,322,330,314,303,
-49,-137,51,-109,49,-140,49,-140,46,-108,44,-159,44,-159,46,-108,42,-107,44,-159,42,-107,34,-109,51,-109,52,-135,54,-112,54,-112,52,-135,54,-132,54,-112,54,-132,57,-116,57,-116,54,-132,57,-127,57,-116,57,-127,57,-120,94,-89,86,-112,98,-135,98,-135,86,-112,77,-129,98,-135,77,-129,74,-153,74,-153,77,-129,67,-140,74,-153,67,-140,54,-144,54,-144,52,-143,74,-153,74,-153,52,-143,50,-143,74,-153,50,-143,44,-159,44,-159,50,-143,49,-142,44,-159,49,-142,49,-141,171,-137,172,-109,170,-140,170,-140,168,-108,165,-159,165,-159,168,-108,163,-107,165,-159,163,-107,155,-109,172,-109,173,-135,175,-112,175,-112,173,-135,175,-132,175,-112,175,-132,178,-116,178,-116,175,-132,178,-127,178,-116,178,-127,179,-120,215,-89,207,-112,219,-135,219,-135,207,-112,198,-129,219,-135,198,-129,195,-153,195,-153,198,-129,188,-140,195,-153,188,-140,175,-144,175,-144,173,-143,195,-153,195,-153,173,-143,172,-143,195,-153,172,-143,165,-159,165,-159,172,-143,170,-142,165,-159,170,-142,170,-141,285,396,292,412,283,397,283,397,292,412,281,397,268,393,281,397,292,412,268,393,292,412,260,404,302,361,302,411,294,360,294,360,302,411,292,412,294,360,292,412,289,360,289,360,292,412,287,392,289,360,287,392,286,390,289,360,286,390,285,362,285,362,286,390,284,387,285,362,284,387,281,364,281,364,284,387,281,384,281,364,281,384,279,368,279,368,281,384,279,379,279,368,279,379,278,372,320,390,319,396,318,380,318,380,319,396,316,402,318,380,316,402,315,372,315,372,316,402,310,407,315,372,310,407,309,366,309,366,310,407,302,411,309,366,302,411,302,361,292,412,285,396,286,395,292,412,286,395,287,394,292,412,287,394,287,392,260,404,234,385,239,337,260,404,239,337,247,362,260,404,247,362,257,380,260,404,257,380,268,393,231,308,239,337,234,385,231,308,234,385,215,359,231,308,215,359,201,330,231,308,201,330,193,303,231,308,193,303,140,-58,94,-89,98,-135,102,-61,102,-61,98,-135,117,-111,102,-61,117,-111,193,303,193,303,117,-111,131,-84,193,303,131,-84,140,-58,49,-140,44,-159,49,-141,16,-136,17,-143,18,-127,18,-127,17,-143,20,-150,18,-127,20,-150,21,-119,21,-119,20,-150,25,-155,21,-119,25,-155,27,-113,27,-113,25,-155,33,-158,27,-113,33,-158,34,-109,34,-109,33,-158,44,-159,406,396,413,412,404,397,404,397,413,412,402,397,389,393,402,397,413,412,389,393,413,412,381,404,423,361,424,411,415,360,415,360,424,411,413,412,415,360,413,412,410,360,410,360,413,412,408,392,410,360,408,392,407,390,410,360,407,390,406,362,406,362,407,390,405,387,406,362,405,387,402,364,402,364,405,387,402,384,402,364,402,384,400,379,400,379,399,372,400,368,400,379,400,368,402,364,440,390,439,396,439,380,439,380,439,396,436,402,439,380,436,402,435,372,435,372,436,402,431,407,435,372,431,407,430,366,430,366,431,407,424,411,430,366,424,411,423,361,413,412,406,396,407,395,413,412,407,395,408,394,413,412,408,394,408,392,381,404,355,385,360,337,381,404,360,337,368,362,381,404,368,362,378,380,381,404,378,380,389,393,352,308,360,337,355,385,352,308,355,385,336,359,352,308,336,359,323,330,352,308,323,330,314,303,352,308,314,303,261,-58,215,-89,219,-135,223,-61,223,-61,219,-135,238,-111,223,-61,238,-111,314,303,314,303,238,-111,252,-84,314,303,252,-84,261,-58,170,-140,165,-159,170,-141,137,-136,138,-143,139,-127,139,-127,138,-143,141,-150,139,-127,141,-150,142,-119,142,-119,141,-150,146,-155,142,-119,146,-155,148,-113,148,-113,146,-155,154,-158,148,-113,154,-158,155,-109,155,-109,154,-158,165,-159,168,-108,170,-140,172,-109,172,-109,171,-137,173,-135,46,-108,49,-140,51,-109,51,-109,49,-137,52,-135,
-344,-61,336,-89,328,-112,319,-129,309,-140,296,-144,294,-143,293,-143,291,-141,291,-140,292,-137,297,-132,299,-127,300,-120,299,-116,296,-112,293,-109,288,-108,284,-107,276,-109,269,-113,263,-119,259,-127,258,-136,259,-143,262,-150,267,-155,275,-158,286,-159,316,-153,341,-135,359,-111,373,-84,382,-58,473,308,481,337,489,362,499,380,510,393,523,397,525,397,527,396,529,394,529,392,528,390,526,387,523,384,521,379,520,372,521,368,523,364,531,360,536,360,544,361,551,366,556,372,560,380,561,390,560,396,558,402,552,407,545,411,534,412,502,404,476,385,457,359,443,330,435,303,16383,16383,223,-61,215,-89,207,-112,198,-129,187,-140,175,-144,173,-143,171,-143,169,-141,169,-140,170,-137,175,-132,177,-127,178,-120,177,-116,175,-112,171,-109,167,-108,162,-107,154,-109,147,-113,142,-119,138,-127,137,-136,138,-143,141,-150,146,-155,154,-158,164,-159,194,-153,219,-135,238,-111,251,-84,260,-58,352,308,359,337,368,362,377,380,388,393,402,397,404,397,405,396,407,395,407,392,406,390,402,384,399,379,398,372,399,368,402,364,405,362,409,360,414,360,422,361,429,366,435,372,438,380,440,390,439,396,436,402,431,407,423,411,412,412,380,404,355,385,336,359,322,330,314,303,16383,16383,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,98,-135,117,-111,131,-84,140,-58,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,359,201,330,193,303,176,238,167,238,131,232,101,216,76,192,60,161,55,126,58,99,67,74,81,53,100,35,123,22,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,18,-143,22,-150,28,-155,37,-158,49,-159,78,-153,102,-135,119,-111,131,-84,140,-58,157,13,167,13,202,19,233,35,258,59,274,90,280,126,276,152,267,177,253,199,234,216,211,229,231,308,239,337,247,362,257,381,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,318,396,314,402,307,407,298,411,287,412,255,404,231,385,213,358,201,330,193,303,16383,16383,162,32,206,210,224,199,239,185,251,167,258,147,261,126,256,96,243,70,222,50,197,37,167,32,16383,16383,172,219,127,41,109,52,95,66,83,84,76,104,74,126,78,155,92,181,112,201,137,214,167,219,296,231,284,234,271,236,258,237,244,238,214,238,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,358,201,330,193,303,175,233,135,222,101,204,76,182,61,155,55,126,58,104,67,84,82,65,102,48,126,35,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,99,-135,117,-111,131,-84,140,-58,160,22,172,19,200,15,230,13,
-49,-137,51,-109,49,-140,49,-140,46,-108,44,-159,44,-159,46,-108,42,-107,44,-159,42,-107,34,-109,51,-109,52,-135,54,-112,54,-112,52,-135,54,-132,54,-112,54,-132,57,-116,57,-116,54,-132,57,-127,57,-116,57,-127,57,-120,94,-89,86,-112,98,-135,98,-135,86,-112,77,-129,98,-135,77,-129,74,-153,74,-153,77,-129,67,-140,74,-153,67,-140,54,-144,54,-144,52,-143,74,-153,74,-153,52,-143,50,-143,74,-153,50,-143,44,-159,44,-159,50,-143,49,-142,44,-159,49,-142,49,-141,170,-137,171,-109,169,-140,169,-140,167,-108,164,-159,164,-159,167,-108,162,-107,164,-159,162,-107,154,-109,171,-109,172,-135,175,-112,175,-112,172,-135,175,-132,175,-112,175,-132,177,-116,177,-116,175,-132,177,-127,177,-116,177,-127,178,-120,215,-89,207,-112,219,-135,219,-135,207,-112,198,-129,219,-135,198,-129,194,-153,194,-153,198,-129,187,-140,194,-153,187,-140,175,-144,175,-144,173,-143,194,-153,194,-153,173,-143,171,-143,194,-153,171,-143,164,-159,164,-159,171,-143,170,-142,164,-159,170,-142,169,-141,285,396,292,412,283,397,283,397,292,412,281,397,268,393,281,397,292,412,268,393,292,412,260,404,302,361,302,411,294,360,294,360,302,411,292,412,294,360,292,412,289,360,289,360,292,412,287,392,289,360,287,392,286,390,289,360,286,390,285,362,285,362,286,390,284,387,285,362,284,387,281,364,281,364,284,387,281,384,281,364,281,384,279,368,279,368,281,384,279,379,279,368,279,379,278,372,292,-137,293,-109,291,-140,291,-140,288,-108,286,-159,286,-159,288,-108,284,-107,286,-159,284,-107,276,-109,293,-109,294,-135,296,-112,296,-112,294,-135,297,-132,296,-112,297,-132,299,-116,299,-116,297,-132,299,-127,299,-116,299,-127,300,-120,320,390,319,396,318,380,318,380,319,396,316,402,318,380,316,402,315,372,315,372,316,402,310,407,315,372,310,407,309,366,309,366,310,407,302,411,309,366,302,411,302,361,292,412,285,396,286,395,292,412,286,395,287,394,292,412,287,394,287,392,260,404,234,385,239,337,260,404,239,337,247,362,260,404,247,362,257,380,260,404,257,380,268,393,231,308,239,337,234,385,231,308,234,385,215,359,231,308,215,359,201,330,231,308,201,330,193,303,231,308,193,303,140,-58,94,-89,98,-135,102,-61,102,-61,98,-135,117,-111,102,-61,117,-111,193,303,193,303,117,-111,131,-84,193,303,131,-84,140,-58,49,-140,44,-159,49,-141,16,-136,17,-143,18,-127,18,-127,17,-143,20,-150,18,-127,20,-150,21,-119,21,-119,20,-150,25,-155,21,-119,25,-155,27,-113,27,-113,25,-155,33,-158,27,-113,33,-158,34,-109,34,-109,33,-158,44,-159,336,-89,328,-112,341,-135,341,-135,328,-112,319,-129,341,-135,319,-129,316,-153,316,-153,319,-129,309,-140,316,-153,309,-140,296,-144,296,-144,294,-143,316,-153,316,-153,294,-143,293,-143,316,-153,293,-143,286,-159,286,-159,293,-143,292,-142,286,-159,292,-142,291,-141,405,396,412,412,404,397,404,397,412,412,402,397,388,393,402,397,412,412,388,393,412,412,380,404,422,361,423,411,414,360,414,360,423,411,412,412,414,360,412,412,409,360,409,360,412,412,407,392,409,360,407,392,406,390,409,360,406,390,405,362,405,362,406,390,404,387,405,362,404,387,402,364,402,364,404,387,402,384,402,364,402,384,399,379,399,379,398,372,399,368,399,379,399,368,402,364,440,390,439,396,438,380,438,380,439,396,436,402,438,380,436,402,435,372,435,372,436,402,431,407,435,372,431,407,429,366,429,366,431,407,423,411,429,366,423,411,422,361,412,412,405,396,407,395,412,412,407,395,407,394,412,412,407,394,407,392,380,404,355,385,359,337,380,404,359,337,368,362,380,404,368,362,377,380,380,404,377,380,388,393,352,308,359,337,355,385,352,308,355,385,336,359,352,308,336,359,322,330,352,308,322,330,314,303,352,308,314,303,260,-58,215,-89,219,-135,223,-61,223,-61,219,-135,238,-111,223,-61,238,-111,314,303,314,303,238,-111,251,-84,314,303,251,-84,260,-58,169,-140,164,-159,169,-141,137,-136,138,-143,138,-127,138,-127,138,-143,141,-150,138,-127,141,-150,142,-119,142,-119,141,-150,146,-155,142,-119,146,-155,147,-113,147,-113,146,-155,154,-158,147,-113,154,-158,154,-109,154,-109,154,-158,164,-159,435,303,344,-61,359,-111,435,303,359,-111,373,-84,435,303,373,-84,382,-58,435,303,382,-58,473,308,435,303,473,308,443,330,344,-61,336,-89,341,-135,344,-61,341,-135,359,-111,291,-140,286,-159,291,-141,258,-136,259,-143,259,-127,259,-127,259,-143,262,-150,259,-127,262,-150,263,-119,263,-119,262,-150,267,-155,263,-119,267,-155,269,-113,269,-113,267,-155,275,-158,269,-113,275,-158,276,-109,276,-109,275,-158,286,-159,527,396,534,412,525,397,525,397,534,412,523,397,510,393,523,397,534,412,510,393,534,412,502,404,544,361,545,411,536,360,536,360,545,411,534,412,536,360,534,412,531,360,531,360,534,412,529,392,531,360,529,392,528,390,531,360,528,390,527,362,527,362,528,390,526,387,527,362,526,387,523,364,523,364,526,387,523,384,523,364,523,384,521,379,521,379,520,372,521,368,521,379,521,368,523,364,561,390,560,396,560,380,560,380,560,396,558,402,560,380,558,402,556,372,556,372,558,402,552,407,556,372,552,407,551,366,551,366,552,407,545,411,551,366,545,411,544,361,534,412,527,396,528,395,534,412,528,395,529,394,534,412,529,394,529,392,502,404,476,385,481,337,502,404,481,337,489,362,502,404,489,362,499,380,502,404,499,380,510,393,473,308,481,337,476,385,473,308,476,385,457,359,473,308,457,359,443,330,288,-108,291,-140,293,-109,293,-109,292,-137,294,-135,167,-108,169,-140,171,-109,171,-109,170,-137,172,-135,46,-108,49,-140,51,-109,51,-109,49,-137,52,-135,
-176,238,167,238,131,232,101,216,76,192,60,161,55,126,58,99,67,74,81,53,100,35,123,22,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,18,-143,22,-150,28,-155,37,-158,49,-159,78,-153,102,-135,119,-111,131,-84,140,-58,157,13,167,13,202,19,233,35,258,59,274,90,280,126,276,152,267,177,253,199,234,216,211,229,231,308,239,337,247,362,257,381,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,318,396,314,402,307,407,298,411,287,412,255,404,231,385,213,358,201,330,193,303,16383,16383,162,32,206,210,224,199,239,185,251,167,258,147,261,126,256,96,243,70,222,50,197,37,167,32,16383,16383,172,219,127,41,109,52,95,66,83,84,76,104,74,126,78,155,92,181,112,201,137,214,167,219,296,231,284,234,271,236,258,237,244,238,214,238,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,358,201,330,193,303,175,233,135,222,101,204,76,182,61,155,55,126,58,104,67,84,82,65,102,48,126,35,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,99,-135,117,-111,131,-84,140,-58,160,22,172,19,200,15,230,13,235,13,237,14,242,14,223,-61,216,-89,208,-112,199,-129,188,-140,175,-144,173,-143,172,-143,170,-142,170,-140,171,-137,173,-135,175,-132,178,-127,179,-120,178,-116,175,-112,172,-109,168,-108,163,-107,155,-109,148,-113,142,-119,139,-127,137,-136,138,-143,
-49,-140,49,-137,51,-109,51,-109,49,-137,52,-135,51,-109,52,-135,54,-112,54,-112,52,-135,54,-132,54,-112,54,-132,57,-116,57,-116,54,-132,57,-127,57,-116,57,-127,57,-120,18,-127,18,-143,21,-119,21,-119,18,-143,22,-150,21,-119,22,-150,27,-113,27,-113,22,-150,28,-155,27,-113,28,-155,34,-109,34,-109,28,-155,37,-158,34,-109,37,-158,42,-107,42,-107,37,-158,49,-159,42,-107,49,-159,46,-108,46,-108,49,-159,49,-140,86,-112,77,-129,78,-153,78,-153,77,-129,67,-140,78,-153,67,-140,54,-144,54,-144,52,-143,78,-153,78,-153,52,-143,50,-143,78,-153,50,-143,49,-159,49,-159,50,-143,49,-142,49,-159,49,-142,49,-141,95,66,100,35,109,52,109,52,100,35,123,22,109,52,123,22,127,41,127,41,123,22,131,-84,127,41,131,-84,172,219,172,219,131,-84,140,-58,172,219,140,-58,157,13,83,84,76,104,81,53,83,84,81,53,100,35,83,84,100,35,95,66,76,104,74,126,81,53,81,53,74,126,67,74,67,74,74,126,76,192,76,192,74,126,78,155,201,330,193,303,206,210,206,210,193,303,176,238,206,210,176,238,172,219,172,219,176,238,167,238,172,219,167,238,167,219,167,219,167,238,137,214,78,155,92,181,101,216,101,216,92,181,112,201,101,216,112,201,131,232,131,232,112,201,137,214,131,232,137,214,167,238,60,161,55,126,58,99,60,161,58,99,67,74,60,161,67,74,76,192,289,360,294,360,298,411,298,411,294,360,302,361,298,411,302,361,307,407,307,407,302,361,309,366,307,407,309,366,314,402,314,402,309,366,315,372,314,402,315,372,318,396,318,396,315,372,318,380,318,396,318,380,320,390,279,379,279,368,281,384,281,384,279,368,281,364,281,384,281,364,284,387,284,387,281,364,285,362,284,387,285,362,286,390,286,390,285,362,289,360,286,390,289,360,287,392,287,392,289,360,298,411,287,412,255,404,268,393,287,412,268,393,281,397,287,412,281,397,283,397,287,412,283,397,285,396,287,412,285,396,286,395,287,412,286,395,287,394,287,412,287,394,287,392,287,412,287,392,298,411,255,404,231,385,231,308,255,404,231,308,239,337,255,404,239,337,247,362,255,404,247,362,257,381,255,404,257,381,268,393,213,358,201,330,206,210,213,358,206,210,211,229,213,358,211,229,231,308,213,358,231,308,231,385,162,32,206,210,172,219,162,32,172,219,159,13,162,32,159,13,161,13,162,32,161,13,163,13,162,32,163,13,167,32,94,-89,102,-135,102,-61,102,-61,102,-135,119,-111,102,-61,119,-111,123,22,123,22,119,-111,131,-84,86,-112,78,-153,102,-135,86,-112,102,-135,94,-89,49,-140,49,-159,49,-141,258,59,274,90,261,126,261,126,267,177,258,147,258,147,267,177,253,199,258,147,253,199,251,167,251,167,253,199,239,185,234,216,211,229,224,199,234,216,224,199,239,185,234,216,239,185,253,199,274,90,280,126,276,152,274,90,276,152,267,177,274,90,267,177,261,126,258,59,261,126,256,96,258,59,256,96,243,70,258,59,243,70,233,35,163,13,165,13,167,32,167,32,165,13,167,13,167,32,167,13,197,37,197,37,167,13,202,19,197,37,202,19,222,50,222,50,202,19,233,35,222,50,233,35,243,70,224,199,211,229,206,210,279,368,279,379,278,372,18,-143,18,-127,16,-136,172,219,157,13,159,13,76,192,78,155,101,216,46,-108,49,-140,51,-109,
-296,231,284,234,271,236,258,237,244,238,214,238,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,358,201,330,193,303,175,233,135,222,101,204,76,182,61,155,55,126,58,104,67,84,82,65,102,48,126,35,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,99,-135,117,-111,131,-84,140,-58,160,22,172,19,200,15,230,13,235,13,237,14,242,14,223,-61,216,-89,208,-112,199,-129,188,-140,175,-144,173,-143,172,-143,170,-142,170,-140,171,-137,173,-135,175,-132,178,-127,179,-120,178,-116,175,-112,172,-109,168,-108,163,-107,155,-109,148,-113,142,-119,139,-127,137,-136,138,-143,141,-150,146,-155,154,-158,165,-159,195,-153,220,-135,239,-111,252,-84,261,-58,280,18,321,29,356,47,382,70,398,96,404,126,401,149,391,170,376,189,355,206,330,219,352,308,360,337,368,362,378,380,389,393,402,397,404,397,406,396,408,394,408,392,407,390,405,387,402,384,400,379,399,372,400,368,402,364,410,360,415,360,423,361,430,366,435,372,439,380,440,390,439,396,436,402,431,407,424,411,413,412,381,404,355,385,336,359,323,330,314,303,16383,16383,325,200,345,188,362,175,374,160,382,143,385,126,380,103,367,82,345,64,318,50,285,39,16383,16383,247,33,235,33,232,32,228,32,214,33,201,34,188,36,176,38,165,41,209,219,241,219,267,217,291,211,16383,16383,131,54,111,65,96,78,84,93,77,109,74,126,79,149,91,170,112,188,138,203,171,213,415,225,385,231,368,234,351,236,334,237,352,308,360,337,368,362,377,381,388,393,402,397,404,397,405,396,407,395,407,392,406,390,402,384,399,379,398,372,399,368,402,364,405,362,409,360,414,360,422,361,429,366,435,372,438,380,440,390,439,396,436,402,431,407,423,411,412,412,380,404,355,385,336,359,322,330,314,303,297,238,257,238,227,236,213,234,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,359,201,330,193,303,174,227,132,214,99,197,74,177,59,153,54,126,57,103,66,82,80,64,101,49,127,37,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,99,-135,117,-111,131,-84,140,-58,161,26,175,23,191,20,207,18,224,16,242,15,223,-61,215,-89,207,-112,198,-129,187,-140,175,-144,173,-143,171,-143,169,-141,169,-140,170,-137,175,-132,177,-127,178,-120,177,-116,175,-112,171,-109,167,-108,162,-107,154,-109,147,-113,142,-119,138,-127,137,-136,138,-143,141,-150,146,-155,154,-158,164,-159,194,-153,219,-135,238,-111,251,-84,260,-58,278,13,289,13,305,14,320,14,335,15,349,16,363,18,344,-61,336,-89,328,-112,319,-129,309,-140,296,-144,294,-143,292,-143,290,-141,290,-140,291,-137,296,-132,298,-127,299,-120,298,-116,296,-112,292,-109,288,-108,283,-107,275,-109,268,-113,262,-119,259,-127,257,-136,258,-143,261,-150,267,-155,275,-158,285,-159,316,-153,340,-135,359,-111,372,-84,381,-58,401,24,444,36,478,53,503,73,519,98,524,126,521,148,
-49,-137,51,-109,49,-140,49,-140,46,-108,44,-159,44,-159,46,-108,42,-107,44,-159,42,-107,34,-109,51,-109,52,-135,54,-112,54,-112,52,-135,54,-132,54,-112,54,-132,57,-116,57,-116,54,-132,57,-127,57,-116,57,-127,57,-120,94,-89,86,-112,99,-135,99,-135,86,-112,77,-129,99,-135,77,-129,74,-153,74,-153,77,-129,67,-140,74,-153,67,-140,54,-144,54,-144,52,-143,74,-153,74,-153,52,-143,50,-143,74,-153,50,-143,44,-159,44,-159,50,-143,49,-142,44,-159,49,-142,49,-141,96,78,102,48,111,65,111,65,102,48,126,35,111,65,126,35,131,54,131,54,126,35,131,-84,131,54,131,-84,171,213,171,213,131,-84,140,-58,171,213,140,-58,160,22,84,93,77,109,82,65,84,93,82,65,102,48,84,93,102,48,96,78,77,109,74,126,82,65,82,65,74,126,67,84,67,84,74,126,76,182,76,182,74,126,79,149,171,-137,172,-109,170,-140,170,-140,168,-108,165,-159,165,-159,168,-108,163,-107,165,-159,163,-107,155,-109,172,-109,173,-135,175,-112,175,-112,173,-135,175,-132,175,-112,175,-132,178,-116,178,-116,175,-132,178,-127,178,-116,178,-127,179,-120,216,-89,208,-112,220,-135,220,-135,208,-112,199,-129,220,-135,199,-129,195,-153,195,-153,199,-129,188,-140,195,-153,188,-140,175,-144,175,-144,173,-143,195,-153,195,-153,173,-143,172,-143,195,-153,172,-143,165,-159,165,-159,172,-143,170,-142,165,-159,170,-142,170,-141,201,330,193,303,209,219,209,219,193,303,175,233,209,219,175,233,171,213,171,213,175,233,138,203,138,203,175,233,135,222,138,203,135,222,112,188,112,188,135,222,101,204,112,188,101,204,91,170,91,170,101,204,79,149,61,155,55,126,58,104,61,155,58,104,67,84,61,155,67,84,76,182,285,396,292,412,283,397,283,397,292,412,281,397,268,393,281,397,292,412,268,393,292,412,260,404,302,361,302,411,294,360,294,360,302,411,292,412,294,360,292,412,289,360,289,360,292,412,287,392,289,360,287,392,286,390,289,360,286,390,285,362,285,362,286,390,284,387,285,362,284,387,281,364,281,364,284,387,281,384,281,364,281,384,279,368,279,368,281,384,279,379,279,368,279,379,278,372,320,390,319,396,318,380,318,380,319,396,316,402,318,380,316,402,315,372,315,372,316,402,310,407,315,372,310,407,309,366,309,366,310,407,302,411,309,366,302,411,302,361,292,412,285,396,286,395,292,412,286,395,287,394,292,412,287,394,287,392,260,404,234,385,239,337,260,404,239,337,247,362,260,404,247,362,257,380,260,404,257,380,268,393,239,337,234,385,231,308,231,308,234,385,215,358,231,308,215,358,214,238,214,238,215,358,212,219,214,238,212,219,216,219,215,358,201,330,209,219,215,358,209,219,212,219,176,38,165,41,172,19,171,213,165,41,209,219,160,22,172,19,165,41,160,22,165,41,171,213,94,-89,99,-135,102,-61,102,-61,99,-135,117,-111,102,-61,117,-111,126,35,126,35,117,-111,131,-84,49,-140,44,-159,49,-141,16,-136,17,-143,18,-127,18,-127,17,-143,20,-150,18,-127,20,-150,21,-119,21,-119,20,-150,25,-155,21,-119,25,-155,27,-113,27,-113,25,-155,33,-158,27,-113,33,-158,34,-109,34,-109,33,-158,44,-159,296,231,284,234,291,211,291,211,325,200,296,231,296,231,325,200,314,303,406,396,413,412,404,397,404,397,413,412,402,397,389,393,402,397,413,412,389,393,413,412,381,404,423,361,424,411,415,360,415,360,424,411,413,412,415,360,413,412,410,360,410,360,413,412,408,392,410,360,408,392,407,390,410,360,407,390,406,362,406,362,407,390,405,387,406,362,405,387,402,364,402,364,405,387,402,384,402,364,402,384,400,379,400,379,399,372,400,368,400,379,400,368,402,364,440,390,439,396,439,380,439,380,439,396,436,402,439,380,436,402,435,372,435,372,436,402,431,407,435,372,431,407,430,366,430,366,431,407,424,411,430,366,424,411,423,361,413,412,406,396,407,395,413,412,407,395,408,394,413,412,408,394,408,392,381,404,355,385,360,337,381,404,360,337,368,362,381,404,368,362,378,380,381,404,378,380,389,393,336,359,330,219,352,308,336,359,352,308,355,385,355,385,352,308,360,337,336,359,325,200,330,219,330,219,325,200,345,188,330,219,345,188,355,206,355,206,345,188,362,175,355,206,362,175,376,189,376,189,362,175,374,160,376,189,374,160,382,143,323,330,314,303,325,200,323,330,325,200,336,359,291,211,247,33,252,-84,291,211,252,-84,261,-58,291,211,261,-58,280,18,291,211,280,18,285,39,291,211,285,39,325,200,243,33,239,33,239,14,243,33,239,14,242,14,243,33,242,14,252,-84,243,33,252,-84,247,33,216,-89,220,-135,223,-61,223,-61,220,-135,239,-111,223,-61,239,-111,242,14,242,14,239,-111,252,-84,170,-140,165,-159,170,-141,137,-136,138,-143,139,-127,139,-127,138,-143,141,-150,139,-127,141,-150,142,-119,142,-119,141,-150,146,-155,142,-119,146,-155,148,-113,148,-113,146,-155,154,-158,148,-113,154,-158,155,-109,155,-109,154,-158,165,-159,404,126,401,149,398,96,398,96,401,149,391,170,398,96,391,170,385,126,385,126,382,70,398,96,391,170,376,189,382,143,391,170,382,143,385,126,385,126,380,103,382,70,382,70,380,103,367,82,382,70,367,82,356,47,356,47,367,82,345,64,356,47,345,64,321,29,321,29,345,64,318,50,321,29,318,50,285,39,280,18,321,29,285,39,176,38,186,17,188,36,188,36,186,17,200,15,188,36,200,15,201,34,201,34,200,15,215,14,201,34,215,14,214,33,214,33,215,14,228,32,232,32,228,32,230,13,232,32,230,13,232,13,291,211,284,234,279,214,279,214,284,234,271,236,279,214,271,236,267,217,267,217,271,236,258,237,267,217,258,237,254,218,254,218,258,237,244,238,254,218,244,238,241,219,241,219,244,238,230,238,241,219,230,238,228,219,232,13,235,13,235,33,235,33,235,13,237,14,235,33,237,14,239,33,239,33,237,14,239,14,230,238,214,238,216,219,230,238,216,219,220,219,230,238,220,219,224,219,230,238,224,219,228,219,228,32,215,14,230,13,232,32,232,13,235,33,176,38,172,19,186,17,76,182,79,149,101,204,168,-108,170,-140,172,-109,172,-109,171,-137,173,-135,46,-108,49,-140,51,-109,51,-109,49,-137,52,-135,
-319,60,319,93,170,93,200,160,319,160,319,193,214,193,274,331,247,331,187,193,24,193,24,160,172,160,143,93,24,93,24,60,128,60,69,-77,95,-77,156,60,319,206,319,239,24,239,24,206,16383,16383,319,110,319,143,24,143,24,110,16383,16383,319,14,319,47,24,47,24,14,319,14,319,47,150,47,177,110,319,110,319,143,
-128,60,69,-77,95,-77,128,60,95,-77,156,60,128,60,156,60,143,93,128,60,143,93,24,93,128,60,24,93,24,60,172,160,143,93,156,60,172,160,156,60,170,93,172,160,170,93,200,160,172,160,200,160,187,193,172,160,187,193,24,193,172,160,24,193,24,160,214,193,274,331,247,331,214,193,247,331,200,160,214,193,200,160,319,160,214,193,319,160,319,193,170,93,156,60,319,60,170,93,319,60,319,93,187,193,200,160,247,331,
-319,206,319,239,24,239,24,206,16383,16383,319,110,319,143,24,143,24,110,16383,16383,319,14,319,47,24,47,24,14,319,14,319,47,150,47,177,110,319,110,319,143,192,143,219,206,319,206,319,239,233,239,274,331,247,331,207,239,
-24,239,24,206,319,206,24,239,319,206,319,239,24,143,24,110,319,110,24,143,319,110,319,143,24,47,24,14,319,14,24,47,319,14,319,47,
-319,14,319,47,150,47,177,110,319,110,319,143,192,143,219,206,319,206,319,239,233,239,274,331,247,331,207,239,24,239,24,206,193,206,165,143,24,143,24,110,151,110,123,47,24,47,24,14,108,14,69,-77,95,-77,136,14,319,239,319,272,24,272,24,239,16383,16383,319,153,319,186,24,186,24,153,16383,16383,319,67,319,100,24,100,24,67,16383,16383,319,-18,319,14,24,14,24,-18,315,26,315,57,99,165,315,272,315,305,32,167,32,162,16383,16383,315,-50,
-108,14,69,-77,95,-77,108,14,95,-77,136,14,108,14,136,14,123,47,108,14,123,47,24,47,108,14,24,47,24,14,151,110,123,47,136,14,151,110,136,14,150,47,151,110,150,47,177,110,151,110,177,110,165,143,151,110,165,143,24,143,151,110,24,143,24,110,193,206,165,143,177,110,193,206,177,110,192,143,193,206,192,143,219,206,193,206,219,206,207,239,193,206,207,239,24,239,193,206,24,239,24,206,233,239,274,331,247,331,233,239,247,331,219,206,233,239,219,206,319,206,233,239,319,206,319,239,192,143,177,110,319,110,192,143,319,110,319,143,150,47,136,14,319,14,150,47,319,14,319,47,207,239,219,206,247,331,
-319,239,319,272,24,272,24,239,16383,16383,319,153,319,186,24,186,24,153,16383,16383,319,67,319,100,24,100,24,67,16383,16383,319,-18,319,14,24,14,24,-18,315,26,315,57,99,165,315,272,315,305,32,167,32,162,16383,16383,315,-50,315,-17,32,-17,32,-50,315,162,315,167,32,305,32,272,248,165,32,57,32,26,
-24,272,24,239,319,239,24,272,319,239,319,272,24,186,24,153,319,153,24,186,319,153,319,186,24,100,24,67,319,67,24,100,319,67,319,100,24,14,24,-18,319,-18,24,14,319,-18,319,14,
-315,26,315,57,99,165,315,272,315,305,32,167,32,162,16383,16383,315,-50,315,-17,32,-17,32,-50,315,162,315,167,32,305,32,272,248,165,32,57,32,26,16383,16383,315,-50,315,-17,32,-17,32,-50,
-99,165,315,272,315,305,99,165,315,305,32,167,99,165,32,167,315,26,99,165,315,26,315,57,32,-17,32,-50,315,-50,32,-17,315,-50,315,-17,315,26,32,167,32,162,
-315,162,315,167,32,305,32,272,248,165,32,57,32,26,16383,16383,315,-50,315,-17,32,-17,32,-50,311,80,311,112,95,219,311,326,311,359,28,222,28,217,16383,16383,311,-5,311,27,28,27,28,-5,
-248,165,32,57,315,162,248,165,315,162,315,167,248,165,315,167,32,305,248,165,32,305,32,272,32,-17,32,-50,315,-50,32,-17,315,-50,315,-17,315,162,32,57,32,26,
-311,80,311,112,95,219,311,326,311,359,28,222,28,217,16383,16383,311,-5,311,27,28,27,28,-5,16383,16383,311,-104,311,-72,28,-72,28,-104,311,217,311,222,28,359,28,326,244,219,28,112,28,80,16383,16383,311,-5,311,27,28,27,28,-5,16383,16383,311,-104,311,-72,28,-72,28,-104,
-95,219,311,326,311,359,95,219,311,359,28,222,95,219,28,222,311,80,95,219,311,80,311,112,28,27,28,-5,311,-5,28,27,311,-5,311,27,28,-72,28,-104,311,-104,28,-72,311,-104,311,-72,311,80,28,222,28,217,
-311,217,311,222,28,359,28,326,244,219,28,112,28,80,16383,16383,311,-5,311,27,28,27,28,-5,16383,16383,311,-104,311,-72,28,-72,28,-104,310,94,310,126,94,233,310,340,310,373,28,235,28,230,16383,16383,310,-91,310,-58,158,-58,200,8,310,8,310,41,221,41,245,79,215,79,
-244,219,28,112,311,217,244,219,311,217,311,222,244,219,311,222,28,359,244,219,28,359,28,326,28,27,28,-5,311,-5,28,27,311,-5,311,27,28,-72,28,-104,311,-104,28,-72,311,-104,311,-72,311,217,28,112,28,80,
-310,94,310,126,94,233,310,340,310,373,28,235,28,230,16383,16383,310,-91,310,-58,158,-58,200,8,310,8,310,41,221,41,245,79,215,79,191,41,28,41,28,8,171,8,128,-58,28,-58,28,-91,108,-91,84,-129,114,-129,138,-91,310,230,310,235,28,373,28,340,244,233,28,126,28,94,16383,16383,310,-91,310,-58,165,-58,207,8,310,8,310,41,228,41,252,79,222,79,198,41,28,41,28,8,177,8,135,-58,28,-58,28,-91,114,-91,91,-129,121,-129,145,-91,
-94,233,310,340,310,373,94,233,310,373,28,235,94,233,28,235,310,94,94,233,310,94,310,126,28,41,171,8,191,41,191,41,171,8,200,8,191,41,200,8,215,79,215,79,200,8,221,41,215,79,221,41,245,79,221,41,200,8,310,8,221,41,310,8,310,41,108,-91,114,-129,128,-58,128,-58,114,-129,138,-91,128,-58,138,-91,171,8,171,8,138,-91,158,-58,171,8,158,-58,200,8,28,-58,28,-91,108,-91,28,-58,108,-91,128,-58,158,-58,138,-91,310,-91,158,-58,310,-91,310,-58,114,-129,108,-91,84,-129,171,8,28,41,28,8,310,94,28,235,28,230,
-310,230,310,235,28,373,28,340,244,233,28,126,28,94,16383,16383,310,-91,310,-58,165,-58,207,8,310,8,310,41,228,41,252,79,222,79,198,41,28,41,28,8,177,8,135,-58,28,-58,28,-91,114,-91,91,-129,121,-129,145,-91,454,-12,454,18,238,127,454,233,454,266,171,129,171,124,16383,16383,295,-12,295,18,79,127,295,233,295,266,12,129,12,124,454,124,454,129,171,266,171,233,387,127,171,18,171,-12,16383,16383,295,124,295,129,12,266,12,233,228,127,
-244,233,28,126,310,230,244,233,310,230,310,235,244,233,310,235,28,373,244,233,28,373,28,340,28,41,177,8,198,41,198,41,177,8,207,8,198,41,207,8,222,79,222,79,207,8,228,41,222,79,228,41,252,79,228,41,207,8,310,8,228,41,310,8,310,41,114,-91,121,-129,135,-58,135,-58,121,-129,145,-91,135,-58,145,-91,177,8,177,8,145,-91,165,-58,177,8,165,-58,207,8,28,-58,28,-91,114,-91,28,-58,114,-91,135,-58,165,-58,145,-91,310,-91,165,-58,310,-91,310,-58,121,-129,114,-91,91,-129,177,8,28,41,28,8,310,230,28,126,28,94,
-454,-12,454,18,238,127,454,233,454,266,171,129,171,124,16383,16383,295,-12,295,18,79,127,295,233,295,266,12,129,12,124,454,124,454,129,171,266,171,233,387,127,171,18,171,-12,16383,16383,295,124,295,129,12,266,12,233,228,127,12,18,12,-12,
-238,127,454,233,454,266,238,127,454,266,171,129,238,127,171,129,454,-12,238,127,454,-12,454,18,79,127,295,233,295,266,79,127,295,266,12,129,79,127,12,129,295,-12,79,127,295,-12,295,18,295,-12,12,129,12,124,454,-12,171,129,171,124,
-454,124,454,129,171,266,171,233,387,127,171,18,171,-12,16383,16383,295,124,295,129,12,266,12,233,228,127,12,18,12,-12,190,-102,179,-89,167,-74,154,-59,130,-25,149,4,165,35,176,66,183,97,185,127,183,156,176,187,164,218,149,248,130,278,
-387,127,171,18,454,124,387,127,454,124,454,129,387,127,454,129,171,266,387,127,171,266,171,233,228,127,12,18,295,124,228,127,295,124,295,129,228,127,295,129,12,266,228,127,12,266,12,233,295,124,12,18,12,-12,454,124,171,18,171,-12,
-190,-102,179,-89,167,-74,154,-59,130,-25,149,4,165,35,176,66,183,97,185,127,183,156,176,187,164,218,149,248,130,278,142,296,154,312,167,328,179,342,190,355,190,365,174,353,158,340,143,326,130,312,117,296,103,312,89,326,74,340,59,353,42,365,42,357,66,329,78,313,91,296,103,278,84,249,68,218,57,187,50,156,47,127,50,97,57,66,68,35,84,4,103,-25,91,-42,78,-58,66,-74,42,-102,42,-111,59,-99,89,-73,117,-43,143,-73,158,-86,174,-99,190,-111,16383,16383,152,127,151,98,146,70,138,45,128,20,116,-2,104,20,95,45,87,71,82,98,80,127,82,155,87,182,95,208,105,233,117,256,128,233,138,208,146,182,151,155,152,127,319,22,300,49,273,71,242,87,207,96,174,100,198,155,227,162,255,173,281,188,303,208,319,232,319,249,302,230,283,215,261,204,237,195,213,190,254,286,228,286,184,186,171,186,138,188,105,195,75,206,47,224,24,249,24,232,43,204,69,182,101,166,135,156,170,153,146,98,116,92,88,81,61,65,40,46,24,22,24,4,40,22,60,38,82,49,106,58,131,64,89,-32,116,-32,159,66,161,67,171,67,204,65,237,58,268,46,295,28,319,4,310,-12,310,18,171,88,214,185,310,233,310,266,232,228,277,331,250,331,198,211,28,128,28,123,137,71,71,-77,99,-77,158,60,16383,16383,179,168,148,99,94,126,310,123,310,128,203,181,268,331,241,331,
-130,278,142,296,143,326,143,326,142,296,154,312,143,326,154,312,158,340,158,340,154,312,167,328,158,340,167,328,174,353,174,353,167,328,179,342,174,353,179,342,190,365,190,365,179,342,190,355,117,296,103,312,105,233,117,296,105,233,117,256,117,256,128,233,130,312,130,312,128,233,130,278,130,312,130,278,143,326,116,-2,117,-43,128,20,128,20,117,-43,130,-58,128,20,130,-58,130,-25,130,-25,130,-58,143,-73,130,-25,138,45,128,20,183,97,183,156,176,66,176,66,183,156,176,187,176,66,176,187,165,35,165,35,176,187,164,218,165,35,164,218,152,127,152,127,164,218,151,155,149,248,130,278,138,208,149,248,138,208,146,182,149,248,146,182,151,155,149,248,151,155,164,218,130,312,117,296,117,256,165,35,152,127,151,98,165,35,151,98,149,4,149,4,151,98,146,70,149,4,146,70,138,45,142,-42,143,-73,154,-59,154,-59,143,-73,158,-86,154,-59,158,-86,167,-74,167,-74,158,-86,174,-99,167,-74,174,-99,179,-89,179,-89,174,-99,190,-111,179,-89,190,-111,190,-102,105,233,103,312,103,278,103,278,103,312,91,296,91,296,103,312,89,326,91,296,89,326,78,313,78,313,89,326,74,340,78,313,74,340,66,329,66,329,74,340,59,353,66,329,59,353,54,343,54,343,59,353,42,365,54,343,42,365,42,357,103,-58,103,-25,91,-42,103,-58,91,-42,89,-73,89,-73,91,-42,78,-58,89,-73,78,-58,74,-86,74,-86,78,-58,66,-74,74,-86,66,-74,59,-99,59,-99,66,-74,54,-88,59,-99,54,-88,42,-102,104,20,95,45,103,-25,104,20,103,-25,103,-58,104,20,103,-58,117,-43,104,20,117,-43,116,-2,103,278,84,249,87,182,103,278,87,182,95,208,103,278,95,208,105,233,84,249,68,218,68,35,84,249,68,35,80,127,84,249,80,127,82,155,84,249,82,155,87,182,87,71,82,98,84,4,84,4,82,98,80,127,68,35,68,218,57,66,57,66,68,218,57,187,57,66,57,187,50,97,50,97,57,187,50,156,50,97,50,156,47,127,87,71,84,4,103,-25,87,71,103,-25,95,45,84,4,80,127,68,35,59,-99,42,-102,42,-111,130,-25,143,-73,142,-42,138,45,130,-25,149,4,183,156,183,97,185,127,130,278,128,233,138,208,
-319,22,300,49,273,71,242,87,207,96,174,100,198,155,227,162,255,173,281,188,303,208,319,232,319,249,302,230,283,215,261,204,237,195,213,190,254,286,228,286,184,186,171,186,138,188,105,195,75,206,47,224,24,249,24,232,43,204,69,182,101,166,135,156,170,153,146,98,116,92,88,81,61,65,40,46,24,22,24,4,40,22,60,38,82,49,106,58,131,64,89,-32,116,-32,159,66,161,67,171,67,204,65,237,58,268,46,295,28,319,4,310,-12,310,18,171,88,214,185,310,233,310,266,232,228,277,331,250,331,198,211,28,128,28,123,137,71,71,-77,99,-77,158,60,16383,16383,179,168,148,99,94,126,310,123,310,128,203,181,268,331,241,331,180,192,28,266,28,233,168,164,126,68,28,18,28,-12,108,26,63,-77,89,-77,142,42,16383,16383,244,126,161,84,190,153,310,-50,310,-17,129,-17,171,92,310,25,310,56,181,120,220,226,310,271,310,304,236,267,272,365,246,365,203,251,28,166,
-40,22,60,38,61,65,61,65,60,38,82,49,61,65,82,49,88,81,88,81,82,49,106,58,88,81,106,58,116,92,116,92,106,58,131,64,146,98,131,64,159,66,146,98,159,66,170,153,170,153,159,66,161,67,170,153,161,67,164,67,40,22,61,65,40,46,40,22,40,46,24,22,40,22,24,22,24,4,135,156,170,153,138,188,138,188,170,153,171,186,173,186,171,186,171,67,173,186,171,67,174,100,174,100,171,67,204,65,174,100,204,65,207,96,207,96,204,65,237,58,207,96,237,58,242,87,242,87,237,58,268,46,242,87,268,46,273,71,273,71,268,46,295,28,273,71,295,28,300,49,300,49,295,28,319,4,300,49,319,4,319,22,24,249,43,204,47,224,47,224,43,204,69,182,47,224,69,182,75,206,75,206,69,182,101,166,75,206,101,166,105,195,105,195,101,166,135,156,105,195,135,156,138,188,171,67,171,186,170,153,171,67,170,153,168,67,170,153,164,67,166,67,170,153,166,67,168,67,131,64,89,-32,116,-32,131,64,116,-32,159,66,319,249,302,230,303,208,303,208,302,230,283,215,303,208,283,215,281,188,281,188,283,215,261,204,281,188,261,204,255,173,255,173,261,204,237,195,255,173,237,195,227,162,227,162,237,195,213,190,227,162,213,190,198,155,228,286,184,186,198,155,228,286,198,155,213,190,228,286,213,190,254,286,198,155,184,186,181,186,198,155,181,186,179,186,198,155,179,186,176,186,198,155,176,186,174,100,176,186,173,186,174,100,43,204,24,249,24,232,319,249,303,208,319,232,116,92,131,64,146,98,
-310,-12,310,18,171,88,214,185,310,233,310,266,232,228,277,331,250,331,198,211,28,128,28,123,137,71,71,-77,99,-77,158,60,16383,16383,179,168,148,99,94,126,310,123,310,128,203,181,268,331,241,331,180,192,28,266,28,233,168,164,126,68,28,18,28,-12,108,26,63,-77,89,-77,142,42,16383,16383,244,126,161,84,190,153,
-198,211,28,128,94,126,94,126,28,128,137,71,94,126,137,71,148,99,148,99,137,71,158,60,148,99,158,60,179,168,179,168,158,60,171,88,179,168,171,88,214,185,94,126,179,168,198,211,198,211,179,168,214,185,198,211,214,185,250,331,250,331,214,185,232,228,250,331,232,228,277,331,137,71,71,-77,99,-77,137,71,99,-77,158,60,232,228,214,185,310,233,232,228,310,233,310,266,171,88,158,60,310,-12,171,88,310,-12,310,18,137,71,28,128,28,123,
-310,123,310,128,203,181,268,331,241,331,180,192,28,266,28,233,168,164,126,68,28,18,28,-12,108,26,63,-77,89,-77,142,42,16383,16383,244,126,161,84,190,153,310,-50,310,-17,129,-17,171,92,310,25,310,56,181,120,220,226,310,271,310,304,236,267,272,365,246,365,203,251,28,166,28,161,147,103,103,-17,28,-17,28,-50,
-108,26,63,-77,89,-77,108,26,89,-77,142,42,108,26,142,42,126,68,108,26,126,68,28,18,108,26,28,18,28,-12,168,164,126,68,142,42,168,164,142,42,161,84,168,164,161,84,190,153,168,164,190,153,180,192,168,164,180,192,28,266,168,164,28,266,28,233,203,181,268,331,241,331,203,181,241,331,190,153,203,181,190,153,244,126,203,181,244,126,310,128,310,123,310,128,244,126,310,123,244,126,161,84,310,123,161,84,142,42,180,192,190,153,241,331,
-320,0,320,33,190,33,190,331,157,331,157,33,26,33,26,0,313,126,309,150,298,171,281,188,260,199,235,203,211,199,189,188,
-190,331,157,331,190,33,190,33,157,331,157,33,190,33,157,33,320,0,320,0,157,33,26,33,320,0,26,33,26,0,190,33,320,0,320,33
-};
index 6da9744734f979cda4cda9cf4fb4c00042da945e..7e0db3b93b1dbb24e56418ae68a8e5430c921f20 100644 (file)
@@ -51,6 +51,8 @@ EQ_MOD,               // x modulo y
 EQ_LOG,                // logarithm of x on base a, log_a(x) = ln(x)/ln(a)\r
 EQ_ARG,                // argument of complex number arg(x,y) = atan2(x,y)\r
 EQ_HYPOT,      // sqrt(x^2+y^2)=hypot(x,y)\r
+EQ_MAX,                // maximum of x and y\r
+EQ_MIN,                // minimum of x and y\r
 // special functions of 2 arguments\r
 EQ_BESJ,               // regular cylindrical Bessel function of fractional order\r
 EQ_BESY,               // irregular cylindrical Bessel function of fractional order\r
@@ -369,9 +371,14 @@ mglFormula::mglFormula(const char *string)
                        else if(!strcmp(name+1,"anh"))  Kod=EQ_TANH;\r
                        else if(!strcmp(name+1,"h"))    Kod=EQ_TANH;\r
                }\r
+               else if(name[0]=='m')\r
+               {\r
+                       if(!strcmp(name+1,"od"))                Kod=EQ_MOD;\r
+                       else if(!strcmp(name+1,"ax"))   Kod=EQ_MAX;\r
+                       else if(!strcmp(name+1,"in"))   Kod=EQ_MIN;\r
+               }\r
                else if(!strcmp(name,"hypot"))  Kod=EQ_HYPOT;\r
                else if(!strcmp(name,"pow"))    Kod=EQ_POW;\r
-               else if(!strcmp(name,"mod"))    Kod=EQ_MOD;\r
                else if(!strcmp(name,"i"))              Kod=EQ_BESI;\r
                else if(!strcmp(name,"int"))    Kod=EQ_INT;\r
                else if(!strcmp(name,"j"))              Kod=EQ_BESJ;\r
@@ -498,23 +505,25 @@ double MGL_LOCAL_CONST mgz2(double,double)        {return NAN;}   // NOTE I think NAN val
 double MGL_LOCAL_CONST asinh(double x) {       return log(x+sqrt(x*x+1.));     }\r
 double MGL_LOCAL_CONST acosh(double x) {       return x>1 ? log(x+sqrt(x*x-1.)) : NAN; }\r
 double MGL_LOCAL_CONST atanh(double x) {       return fabs(x)<1 ? log((1.+x)/(1.-x))/2 : NAN;  }\r
+double MGL_LOCAL_CONST fmin(double a,double b) {       return a > b ? b : a;   }\r
+double MGL_LOCAL_CONST fmax(double a,double b) {       return a > b ? a : b;   }\r
 #endif\r
 //-----------------------------------------------------------------------------\r
 typedef double (*func_1)(double);\r
 typedef double (*func_2)(double, double);\r
 //-----------------------------------------------------------------------------\r
-static const mreal z2[EQ_SIN-EQ_LT] = {3,3,3,3,0,3,3,0,0,0,0,0,NAN,0\r
+static const mreal z2[EQ_SIN-EQ_LT] = {3,3,3,3,0,3,3,0,0,0,0,0,NAN,3,3,3,3\r
 #if MGL_HAVE_GSL\r
        ,3,NAN, 3,NAN, 0,0,3,1,3\r
 #else\r
        ,0,0,0,0,0,0,0,0,0\r
 #endif\r
 };\r
-static const func_2 f2[EQ_SIN-EQ_LT] = {clt,cgt,ceq,cor,cand,add,sub,mul,del,ipw,pow,fmod,llg,arg,hypot\r
+static const func_2 f2[EQ_SIN-EQ_LT] = {clt,cgt,ceq,cor,cand,add,sub,mul,del,ipw,pow,fmod,llg,arg,hypot,fmax,fmin\r
 #if MGL_HAVE_GSL\r
        ,gsl_sf_bessel_Jnu,gsl_sf_bessel_Ynu,\r
        gsl_sf_bessel_Inu,gsl_sf_bessel_Knu,\r
-       gslEllE,gslEllF,gslLegP,gsl_sf_beta,gsl_sf_gamma_inc,\r
+       gslEllE,gslEllF,gslLegP,gsl_sf_beta,gsl_sf_gamma_inc\r
 #else\r
        ,mgz2,mgz2,mgz2,mgz2,mgz2,mgz2,mgz2,mgz2,mgz2\r
 #endif\r
@@ -629,14 +638,14 @@ double MGL_LOCAL_CONST gamma_d(double a)  {return gsl_sf_psi(a)*gsl_sf_gamma(a);}
 #endif\r
 double MGL_LOCAL_CONST ginc_d(double a, double x)      {return -exp(-x)*pow(x,a-1);}\r
 //-----------------------------------------------------------------------------\r
-static const func_2 f21[EQ_SIN-EQ_LT] = {mgzz,mgzz,mgzz, mgzz,mgzz,mgp, mgp,mul1,div1, ipw1,pow1,mgp,llg1, mgz2\r
+static const func_2 f21[EQ_SIN-EQ_LT] = {mgzz,mgzz,mgzz, mgzz,mgzz,mgp, mgp,mul1,div1, ipw1,pow1,mgp,llg1, mgz2,mgzz,mgzz\r
 #if MGL_HAVE_GSL\r
        ,mgz2,mgz2,mgz2, mgz2,gslEllE1,gslEllF1, mgz2,mgz2,mgz2\r
 #else\r
        ,mgz2,mgz2,mgz2,mgz2,mgz2,mgz2,mgz2,mgz2,mgz2\r
 #endif\r
 };\r
-static const func_2 f22[EQ_SIN-EQ_LT] = {mgzz,mgzz,mgzz,mgzz,mgzz,mgp,mgm,mul2,div2,pow2,pow2,mgz2,llg2, mgz2\r
+static const func_2 f22[EQ_SIN-EQ_LT] = {mgzz,mgzz,mgzz,mgzz,mgzz,mgp,mgm,mul2,div2,pow2,pow2,mgz2,llg2, mgz2,mgzz,mgzz\r
 #if MGL_HAVE_GSL\r
        ,gslJnuD,gslYnuD,gslInuD,gslKnuD,gslEllE2,gslEllF2,mgz2/*gslLegP*/,mgz2,ginc_d\r
 #else\r
@@ -725,11 +734,11 @@ int MGL_LOCAL_PURE mglFindInText(char *str,const char *lst)
 //-----------------------------------------------------------------------------\r
 HMEX MGL_EXPORT mgl_create_expr(const char *expr)      {       return new mglFormula(expr);    }\r
 void MGL_EXPORT mgl_delete_expr(HMEX ex)       {       if(ex)  delete ex;      }\r
-double MGL_EXPORT_PURE mgl_expr_eval(HMEX ex, double x, double y,double z)\r
+double MGL_EXPORT mgl_expr_eval(HMEX ex, double x, double y,double z)\r
 {      return ex->Calc(x,y,z); }\r
 double MGL_EXPORT mgl_expr_eval_v(HMEX ex, mreal *var)\r
 {      return ex->Calc(var);   }\r
-double MGL_EXPORT_PURE mgl_expr_diff(HMEX ex, char dir, double x, double y,double z)\r
+double MGL_EXPORT mgl_expr_diff(HMEX ex, char dir, double x, double y,double z)\r
 {      return ex->CalcD(dir,x,y,z);    }\r
 double MGL_EXPORT mgl_expr_diff_v(HMEX ex, char dir, mreal *var)\r
 {      return ex->CalcD(var, dir);             }\r
index 13ff94ada9e62ae78238cf500660db6a8a71960e..1eca3d942f68c71957e2d10ee70898862668cb4e 100644 (file)
@@ -57,6 +57,7 @@ EQ_LN,                // logarithm of x, ln(x)
 EQ_LG,         // decimal logarithm of x, lg(x) = ln(x)/ln(10)\r
 EQ_ABS,                // absolute value\r
 EQ_ARG,                // argument (or phase) of complex number\r
+EQ_CONJ,       // complex conjugate\r
 EQ_LAST                // id of last entry\r
 };\r
 //-----------------------------------------------------------------------------\r
@@ -157,6 +158,7 @@ mglFormulaC::mglFormulaC(const char *string)
                else if(!strcmp(name,"ln")) Kod=EQ_LN;\r
                else if(!strcmp(name,"abs")) Kod=EQ_ABS;\r
                else if(!strcmp(name,"arg")) Kod=EQ_ARG;\r
+               else if(!strcmp(name,"conj")) Kod=EQ_CONJ;\r
                else {  delete []str;   return; }       // unknown function\r
                n=mglFindInText(str,",");\r
                if(n>=0)\r
@@ -220,6 +222,7 @@ dual MGL_NO_EXPORT ic = dual(0,1);
 dual MGL_LOCAL_CONST asinhc(dual x)    {       return log(x+sqrt(x*x+mreal(1)));       }\r
 dual MGL_LOCAL_CONST acoshc(dual x)    {       return log(x+sqrt(x*x-mreal(1)));       }\r
 dual MGL_LOCAL_CONST atanhc(dual x)    {       return log((mreal(1)+x)/(mreal(1)-x))/mreal(2); }\r
+dual MGL_LOCAL_CONST conjc(dual x)     {       return dual(real(x),-imag(x));  }\r
 dual MGL_LOCAL_CONST sinc(dual x)      {       return sin(x);  }\r
 dual MGL_LOCAL_CONST cosc(dual x)      {       return cos(x);  }\r
 dual MGL_LOCAL_CONST tanc(dual x)      {       return tan(x);  }\r
@@ -243,7 +246,7 @@ dual mglFormulaC::CalcIn(const dual *a1) const
 {\r
        func_2 f2[EQ_SIN-EQ_ADD] = {addc,subc,mulc,divc,ipwc,powc,llgc};\r
        func_1 f1[EQ_LAST-EQ_SIN] = {sinc,cosc,tanc,asinc,acosc,atanc,sinhc,coshc,tanhc,\r
-                                       asinhc,acoshc,atanhc,sqrtc,expc,expi,logc,lgc,absc};\r
+                                       asinhc,acoshc,atanhc,sqrtc,expc,expi,logc,lgc,absc,argc,conjc};\r
 //     if(Error)       return 0;\r
        if(Kod==EQ_A)   return a1[(int)Res.real()];\r
        if(Kod==EQ_RND) return mgl_rnd();\r
@@ -267,15 +270,18 @@ dual mglFormulaC::CalcIn(const dual *a1) const
 mdual MGL_EXPORT_CONST mgl_ipowc(dual x,int n)\r
 {\r
        dual t;\r
-       if(n==2)        {       t = x*x;        return t.real()+t.imag()*_Complex_I;    }\r
-       if(n==1)        return x.real()+x.imag()*_Complex_I;\r
-       if(n<0)         {       t = mreal(1)/mgl_ipowc(x,-n);   return t.real()+t.imag()*_Complex_I;    }\r
-       if(n==0)        return mreal(1);\r
-       t = mgl_ipowc(x,n/2);   t = t*t;\r
-       if(n%2==1)      t *= x;\r
-       return t.real()+t.imag()*_Complex_I;\r
+       if(n==2)        t = x*x;\r
+       else if(n==1)   t = x;\r
+       else if(n<0)    t = mreal(1)/mgl_ipowc(x,-n);\r
+       else if(n==0)   t = mreal(1);\r
+       else\r
+       {\r
+               t = mgl_ipowc(x,n/2);   t = t*t;\r
+               if(n%2==1)      t *= x;\r
+       }\r
+       return t.real()+t.imag()*mgl_I;\r
 }\r
-mdual MGL_EXPORT_PURE mgl_ipowc_(dual *x,int *n)       {       return mgl_ipowc(*x,*n);        }\r
+mdual MGL_EXPORT mgl_ipowc_(dual *x,int *n)    {       return mgl_ipowc(*x,*n);        }\r
 //-----------------------------------------------------------------------------\r
 HAEX MGL_EXPORT mgl_create_cexpr(const char *expr)     {       return new mglFormulaC(expr);   }\r
 uintptr_t MGL_EXPORT mgl_create_cexpr_(const char *expr, int l)\r
@@ -284,10 +290,10 @@ uintptr_t MGL_EXPORT mgl_create_cexpr_(const char *expr, int l)
        delete []s;     return res;     }\r
 void MGL_EXPORT mgl_delete_cexpr(HAEX ex)      {       if(ex)  delete ex;      }\r
 void MGL_EXPORT mgl_delete_cexpr_(uintptr_t *ex)       {       mgl_delete_cexpr((HAEX)ex);     }\r
-mdual MGL_EXPORT_PURE mgl_cexpr_eval(HAEX ex, dual x, dual y,dual z)\r
-{      dual r = ex->Calc(x,y,z);       return r.real()+r.imag()*_Complex_I;    }\r
+mdual MGL_EXPORT mgl_cexpr_eval(HAEX ex, dual x, dual y,dual z)\r
+{      dual r = ex->Calc(x,y,z);       return r.real()+r.imag()*mgl_I; }\r
 mdual MGL_EXPORT mgl_cexpr_eval_(uintptr_t *ex, dual *x, dual *y, dual *z)\r
 {      return mgl_cexpr_eval((HAEX) ex, *x,*y,*z);             }\r
 mdual MGL_EXPORT mgl_cexpr_eval_v(HAEX ex, dual *var)\r
-{      dual r = ex->Calc(var); return r.real()+r.imag()*_Complex_I;    }\r
+{      dual r = ex->Calc(var); return r.real()+r.imag()*mgl_I; }\r
 //-----------------------------------------------------------------------------\r
index 0455716799f41b95ecda8103d727d048e5452f65..af4d016a95a53489906eb93509004f383f1edd0e 100644 (file)
 #endif
 //-----------------------------------------------------------------------------
 std::wstring mgl_trim_ws(const std::wstring &str);
-int mglFormulaError;
-mglData MGL_NO_EXPORT mglFormulaCalc(std::wstring string, mglParser *arg, const std::vector<mglDataA*> &head);
-mglDataC MGL_NO_EXPORT mglFormulaCalcC(std::wstring string, mglParser *arg, const std::vector<mglDataA*> &head);
+HMDT MGL_NO_EXPORT mglFormulaCalc(std::wstring string, mglParser *arg, const std::vector<mglDataA*> &head);
+HADT MGL_NO_EXPORT mglFormulaCalcC(std::wstring string, mglParser *arg, const std::vector<mglDataA*> &head);
 //-----------------------------------------------------------------------------
-mglData MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector<mglDataA*> &head)
+HMDT MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector<mglDataA*> &head)
 {
        std::wstring s;
        for(long i=0;str[i];i++)        s.push_back(str[i]);
        return mglFormulaCalc(s,0,head);
 }
 //-----------------------------------------------------------------------------
-mglDataC MGL_NO_EXPORT mglFormulaCalcC(const char *str, const std::vector<mglDataA*> &head)
+HADT MGL_NO_EXPORT mglFormulaCalcC(const char *str, const std::vector<mglDataA*> &head)
 {
        std::wstring s;
        for(long i=0;str[i];i++)        s.push_back(str[i]);
        return mglFormulaCalcC(s,0,head);
 }
 //-----------------------------------------------------------------------------
-void mglApplyFunc(mglData &d, double (*func)(double))
+HMDT mglApplyFunc(std::wstring str, mglParser *arg, const std::vector<mglDataA*> &head, double (*func)(double))
 {
-       long n = d.nx*d.ny*d.nz;
+       HMDT d = mglFormulaCalc(str, arg, head);
+       long n = d->GetNN();    mreal *dd=d->a;
 #pragma omp parallel for
-       for(long i=0;i<n;i++)   d.a[i] = func(d.a[i]);
+       for(long i=0;i<n;i++)   dd[i] = func(dd[i]);
+       return d;
 }
 //-----------------------------------------------------------------------------
-mglData mglApplyOper(std::wstring a1, std::wstring a2, mglParser *arg, const std::vector<mglDataA*> &head, double (*func)(double,double))
+#if MGL_HAVE_GSL
+HMDT mglApplyFuncGSL(std::wstring str, mglParser *arg, const std::vector<mglDataA*> &head, double (*func)(double, gsl_mode_t))
+{
+       HMDT d = mglFormulaCalc(str, arg, head);
+       long n = d->GetNN();    mreal *dd=d->a;
+#pragma omp parallel for
+       for(long i=0;i<n;i++)   dd[i] = func(dd[i],GSL_PREC_SINGLE);
+       return d;
+}
+#endif
+//-----------------------------------------------------------------------------
+HMDT mglApplyOper(std::wstring a1, std::wstring a2, mglParser *arg, const std::vector<mglDataA*> &head, double (*func)(double,double))
+{
+       HMDT a = mglFormulaCalc(a1,arg,head), b = mglFormulaCalc(a2,arg,head), r,d;
+       long na = a->GetNN(), nb = b->GetNN(), nn;
+       if(na!=1)       {       r=a;    d=b;    nn=na;  }
+       else            {       r=b;    d=a;    nn=nb;  }
+       mreal va=a->a[0], vb=b->a[0], *aa=a->a, *bb=b->a, *cc=r->a;
+       if(na==nb)
+#pragma omp parallel for
+               for(long i=0;i<nn;i++)  cc[i] = func(aa[i], bb[i]);
+       else if(na==1)
+#pragma omp parallel for
+               for(long i=0;i<nn;i++)  cc[i] = func(va, bb[i]);
+       else
+#pragma omp parallel for
+               for(long i=0;i<nn;i++)  cc[i] = func(aa[i], vb);
+       mgl_delete_data(d);     return r;
+}
+//-----------------------------------------------------------------------------
+HMDT mglApplyOperAdd(std::wstring a1, std::wstring a2, mglParser *arg, const std::vector<mglDataA*> &head)
+{
+       HMDT a = mglFormulaCalc(a1,arg,head), b = mglFormulaCalc(a2,arg,head), r,d;
+       long na = a->GetNN(), nb = b->GetNN(), nn;
+       if(na!=1)       {       r=a;    d=b;    nn=na;  }
+       else            {       r=b;    d=a;    nn=nb;  }
+       mreal *aa=r->a, *bb=d->a, v=bb[0];
+       if(na==nb)
+#pragma omp parallel for
+               for(long i=0;i<nn;i++)  aa[i] += bb[i];
+       else
+#pragma omp parallel for
+               for(long i=0;i<nn;i++)  aa[i] += v;
+       mgl_delete_data(d);     return r;
+}
+//-----------------------------------------------------------------------------
+HMDT mglApplyOperSub(std::wstring a1, std::wstring a2, mglParser *arg, const std::vector<mglDataA*> &head)
+{
+       HMDT a = mglFormulaCalc(a1,arg,head), b = mglFormulaCalc(a2,arg,head), r,d;
+       long na = a->GetNN(), nb = b->GetNN(), nn;
+       if(na!=1)       {       r=a;    d=b;    nn=na;  }
+       else            {       r=b;    d=a;    nn=nb;  }
+       mreal va=a->a[0], vb=b->a[0], *aa=a->a, *bb=b->a, *cc=r->a;
+       if(na==nb)
+#pragma omp parallel for
+               for(long i=0;i<nn;i++)  cc[i] = aa[i]-bb[i];
+       else if(na==1)
+#pragma omp parallel for
+               for(long i=0;i<nn;i++)  cc[i] = va-bb[i];
+       else
+#pragma omp parallel for
+               for(long i=0;i<nn;i++)  cc[i] = aa[i]-vb;
+       mgl_delete_data(d);     return r;
+}
+//-----------------------------------------------------------------------------
+HMDT mglApplyOperMul(std::wstring a1, std::wstring a2, mglParser *arg, const std::vector<mglDataA*> &head)
+{
+       HMDT a = mglFormulaCalc(a1,arg,head), b = mglFormulaCalc(a2,arg,head), r,d;
+       long na = a->GetNN(), nb = b->GetNN(), nn;
+       if(na!=1)       {       r=a;    d=b;    nn=na;  }
+       else            {       r=b;    d=a;    nn=nb;  }
+       mreal *aa=r->a, *bb=d->a, v=bb[0];
+       if(na==nb)
+#pragma omp parallel for
+               for(long i=0;i<nn;i++)  aa[i] *= bb[i];
+       else
+#pragma omp parallel for
+               for(long i=0;i<nn;i++)  aa[i] *= v;
+       mgl_delete_data(d);     return r;
+}
+//-----------------------------------------------------------------------------
+HMDT mglApplyOperDiv(std::wstring a1, std::wstring a2, mglParser *arg, const std::vector<mglDataA*> &head)
+{
+       HMDT a = mglFormulaCalc(a1,arg,head), b = mglFormulaCalc(a2,arg,head), r,d;
+       long na = a->GetNN(), nb = b->GetNN(), nn;
+       if(na!=1)       {       r=a;    d=b;    nn=na;  }
+       else            {       r=b;    d=a;    nn=nb;  }
+       mreal va=a->a[0], vb=b->a[0], *aa=a->a, *bb=b->a, *cc=r->a;
+       if(na==nb)
+#pragma omp parallel for
+               for(long i=0;i<nn;i++)  cc[i] = aa[i]/bb[i];
+       else if(na==1)
+#pragma omp parallel for
+               for(long i=0;i<nn;i++)  cc[i] = va/bb[i];
+       else
+#pragma omp parallel for
+               for(long i=0;i<nn;i++)  cc[i] = aa[i]/vb;
+       mgl_delete_data(d);     return r;
+}
+//-----------------------------------------------------------------------------
+HADT mglApplyFuncC(std::wstring str, mglParser *arg, const std::vector<mglDataA*> &head, dual (*func)(dual))
+{
+       HADT d = mglFormulaCalcC(str, arg, head);
+       long n = d->GetNN();    dual *dd=d->a;
+#pragma omp parallel for
+       for(long i=0;i<n;i++)   dd[i] = func(dd[i]);
+       return d;
+}
+//-----------------------------------------------------------------------------
+HADT mglApplyOperC(std::wstring a1, std::wstring a2, mglParser *arg, const std::vector<mglDataA*> &head, dual (*func)(dual,dual))
+{
+       HADT a = mglFormulaCalcC(a1,arg,head), b = mglFormulaCalcC(a2,arg,head), r,d;
+       long na = a->GetNN(), nb = b->GetNN(), nn;
+       if(na!=1)       {       r=a;    d=b;    nn=na;  }
+       else            {       r=b;    d=a;    nn=nb;  }
+       dual va=a->a[0], vb=b->a[0], *aa=a->a, *bb=b->a, *cc=r->a;
+       if(na==nb)
+#pragma omp parallel for
+               for(long i=0;i<nn;i++)  cc[i] = func(aa[i], bb[i]);
+       else if(na==1)
+#pragma omp parallel for
+               for(long i=0;i<nn;i++)  cc[i] = func(va, bb[i]);
+       else
+#pragma omp parallel for
+               for(long i=0;i<nn;i++)  cc[i] = func(aa[i], vb);
+       mgl_delete_datac(d);    return r;
+}
+//-----------------------------------------------------------------------------
+HADT mglApplyOperAddC(std::wstring a1, std::wstring a2, mglParser *arg, const std::vector<mglDataA*> &head)
+{
+       HADT a = mglFormulaCalcC(a1,arg,head), b = mglFormulaCalcC(a2,arg,head), r,d;
+       long na = a->GetNN(), nb = b->GetNN(), nn;
+       if(na!=1)       {       r=a;    d=b;    nn=na;  }
+       else            {       r=b;    d=a;    nn=nb;  }
+       dual *aa=r->a, *bb=d->a, v=bb[0];
+       if(na==nb)
+#pragma omp parallel for
+               for(long i=0;i<nn;i++)  aa[i] += bb[i];
+       else
+#pragma omp parallel for
+               for(long i=0;i<nn;i++)  aa[i] += v;
+       mgl_delete_datac(d);    return r;
+}
+//-----------------------------------------------------------------------------
+HADT mglApplyOperSubC(std::wstring a1, std::wstring a2, mglParser *arg, const std::vector<mglDataA*> &head)
 {
-       const mglData &a = mglFormulaCalc(a1,arg,head), &b = mglFormulaCalc(a2,arg,head);
-       long n = mgl_max(a.nx,b.nx), m = mgl_max(a.ny,b.ny), l = mgl_max(a.nz,b.nz);
-       mglData r(n, m, l);
-       if(a.nx==b.nx && b.ny==a.ny && b.nz==a.nz)
+       HADT a = mglFormulaCalcC(a1,arg,head), b = mglFormulaCalcC(a2,arg,head), r,d;
+       long na = a->GetNN(), nb = b->GetNN(), nn;
+       if(na!=1)       {       r=a;    d=b;    nn=na;  }
+       else            {       r=b;    d=a;    nn=nb;  }
+       dual va=a->a[0], vb=b->a[0], *aa=a->a, *bb=b->a, *cc=r->a;
+       if(na==nb)
 #pragma omp parallel for
-               for(long i=0;i<n*m*l;i++)       r.a[i] = func(a.a[i], b.a[i]);
-       else if(b.nx*b.ny*b.nz==1)
+               for(long i=0;i<nn;i++)  cc[i] = aa[i]-bb[i];
+       else if(na==1)
 #pragma omp parallel for
-               for(long i=0;i<a.nx*a.ny*a.nz;i++)      r.a[i] = func(a.a[i],b.a[0]);
-       else if(a.nx*a.ny*a.nz==1)
+               for(long i=0;i<nn;i++)  cc[i] = va-bb[i];
+       else
 #pragma omp parallel for
-               for(long i=0;i<b.nx*b.ny*b.nz;i++)      r.a[i] = func(a.a[0],b.a[i]);
-       else if(a.nx==b.nx && b.ny*b.nz==1)
-#pragma omp parallel for collapse(2)
-               for(long j=0;j<a.ny*a.nz;j++)   for(long i=0;i<n;i++)
-                       r.a[i+n*j] = func(a.a[i+n*j], b.a[i]);
-       else if(a.nx==b.nx && a.ny*a.nz==1)
-#pragma omp parallel for collapse(2)
-               for(long i=0;i<n;i++)   for(long j=0;j<b.ny*b.nz;j++)
-                       r.a[i+n*j] = func(a.a[i], b.a[i+n*j]);
-       else if(a.nx==b.nx && b.ny==a.ny && b.nz==1)
-#pragma omp parallel for collapse(3)
-               for(long k=0;k<a.nz;k++)        for(long j=0;j<m;j++)   for(long i=0;i<n;i++)
-                       r.a[i+n*(j+m*k)] = func(a.a[i+n*(j+m*k)], b.a[i+n*j]);
-       else if(a.nx==b.nx && b.ny==a.ny && a.nz==1)
-#pragma omp parallel for collapse(3)
-               for(long k=0;k<b.nz;k++)        for(long j=0;j<m;j++)   for(long i=0;i<n;i++)
-                       r.a[i+n*(j+m*k)] = func(a.a[i+n*j], b.a[i+n*(j+m*k)]);
-       return r;
+               for(long i=0;i<nn;i++)  cc[i] = aa[i]-vb;
+       mgl_delete_datac(d);    return r;
 }
 //-----------------------------------------------------------------------------
-void mglApplyFuncC(mglDataC &d, dual (*func)(dual))
+HADT mglApplyOperMulC(std::wstring a1, std::wstring a2, mglParser *arg, const std::vector<mglDataA*> &head)
 {
-       long n = d.nx*d.ny*d.nz;
+       HADT a = mglFormulaCalcC(a1,arg,head), b = mglFormulaCalcC(a2,arg,head), r,d;
+       long na = a->GetNN(), nb = b->GetNN(), nn;
+       if(na!=1)       {       r=a;    d=b;    nn=na;  }
+       else            {       r=b;    d=a;    nn=nb;  }
+       dual *aa=r->a, *bb=d->a, v=bb[0];
+       if(na==nb)
 #pragma omp parallel for
-       for(long i=0;i<n;i++)   d.a[i] = func(d.a[i]);
+               for(long i=0;i<nn;i++)  aa[i] *= bb[i];
+       else
+#pragma omp parallel for
+               for(long i=0;i<nn;i++)  aa[i] *= v;
+       mgl_delete_datac(d);    return r;
 }
 //-----------------------------------------------------------------------------
-mglDataC mglApplyOperC(std::wstring a1, std::wstring a2, mglParser *arg, const std::vector<mglDataA*> &head, dual (*func)(dual,dual))
+HADT mglApplyOperDivC(std::wstring a1, std::wstring a2, mglParser *arg, const std::vector<mglDataA*> &head)
 {
-       const mglDataC &a = mglFormulaCalcC(a1,arg,head), &b = mglFormulaCalcC(a2,arg,head);
-       long n = mgl_max(a.nx,b.nx), m = mgl_max(a.ny,b.ny), l = mgl_max(a.nz,b.nz);
-       mglDataC r(n, m, l);
-       if(b.nx*b.ny*b.nz==1)
+       HADT a = mglFormulaCalcC(a1,arg,head), b = mglFormulaCalcC(a2,arg,head), r,d;
+       long na = a->GetNN(), nb = b->GetNN(), nn;
+       if(na!=1)       {       r=a;    d=b;    nn=na;  }
+       else            {       r=b;    d=a;    nn=nb;  }
+       dual va=a->a[0], vb=b->a[0], *aa=a->a, *bb=b->a, *cc=r->a;
+       if(na==nb)
 #pragma omp parallel for
-               for(long i=0;i<a.nx*a.ny*a.nz;i++)      r.a[i] = func(a.a[i],b.a[0]);
-       else if(a.nx*a.ny*a.nz==1)
+               for(long i=0;i<nn;i++)  cc[i] = aa[i]/bb[i];
+       else if(na==1)
 #pragma omp parallel for
-               for(long i=0;i<b.nx*b.ny*b.nz;i++)      r.a[i] = func(a.a[0],b.a[i]);
-       else if(a.nx==b.nx && b.ny==a.ny && b.nz==a.nz)
+               for(long i=0;i<nn;i++)  cc[i] = va/bb[i];
+       else
 #pragma omp parallel for
-               for(long i=0;i<n*m*l;i++)       r.a[i] = func(a.a[i], b.a[i]);
-       else if(a.nx==b.nx && b.ny*b.nz==1)
-#pragma omp parallel for collapse(2)
-               for(long j=0;j<a.ny*a.nz;j++)   for(long i=0;i<n;i++)
-                       r.a[i+n*j] = func(a.a[i+n*j], b.a[i]);
-       else if(a.nx==b.nx && a.ny*a.nz==1)
-#pragma omp parallel for collapse(2)
-               for(long i=0;i<n;i++)   for(long j=0;j<b.ny*b.nz;j++)
-                       r.a[i+n*j] = func(a.a[i], b.a[i+n*j]);
-       else if(a.nx==b.nx && b.ny==a.ny && b.nz==1)
-#pragma omp parallel for collapse(3)
-               for(long k=0;k<a.nz;k++)        for(long j=0;j<m;j++)   for(long i=0;i<n;i++)
-                       r.a[i+n*(j+m*k)] = func(a.a[i+n*(j+m*k)], b.a[i+n*j]);
-       else if(a.nx==b.nx && b.ny==a.ny && a.nz==1)
-#pragma omp parallel for collapse(3)
-               for(long k=0;k<b.nz;k++)        for(long j=0;j<m;j++)   for(long i=0;i<n;i++)
-                       r.a[i+n*(j+m*k)] = func(a.a[i+n*j], b.a[i+n*(j+m*k)]);
-       return r;
+               for(long i=0;i<nn;i++)  cc[i] = aa[i]/vb;
+       mgl_delete_datac(d);    return r;
 }
 //-----------------------------------------------------------------------------
 bool mglCheck(std::wstring str)
@@ -154,10 +280,8 @@ double MGL_LOCAL_CONST cor(double a,double b);//   {return a||b?1:0;}
 double MGL_LOCAL_CONST ceq(double a,double b);//       {return a==b?1:0;}
 double MGL_LOCAL_CONST clt(double a,double b);//       {return a<b?1:0;}
 double MGL_LOCAL_CONST cgt(double a,double b);//       {return a>b?1:0;}
-double MGL_LOCAL_CONST add(double a,double b);//       {return a+b;}
-double MGL_LOCAL_CONST sub(double a,double b);//       {return a-b;}
-double MGL_LOCAL_CONST mul(double a,double b);//       {return a&&b?a*b:0;}
-double MGL_LOCAL_CONST del(double a,double b);//       {return b?a/b:NAN;}
+double MGL_LOCAL_CONST stp(double a);//        {return a>0?1:0;}
+double MGL_LOCAL_CONST sgn(double a);//        {return a>0?1:(a<0?-1:0);}
 double MGL_LOCAL_CONST ipw(double a,double b);//       {return mgl_ipow(a,int(b));}
 double MGL_LOCAL_CONST llg(double a,double b);//       {return log(a)/log(b);}
 //double MGL_LOCAL_CONST asinh(double x);//    {       return log(x+sqrt(x*x+1));      }
@@ -166,6 +290,13 @@ double MGL_LOCAL_CONST llg(double a,double b);//   {return log(a)/log(b);}
 double MGL_LOCAL_CONST gslEllE(double a,double b);//   {return gsl_sf_ellint_E(a,b,GSL_PREC_SINGLE);}
 double MGL_LOCAL_CONST gslEllF(double a,double b);//   {return gsl_sf_ellint_F(a,b,GSL_PREC_SINGLE);}
 double MGL_LOCAL_CONST gslLegP(double a,double b);//   {return gsl_sf_legendre_Pl(int(a),b);}
+#ifdef WIN32
+double MGL_LOCAL_CONST asinh(double x);
+double MGL_LOCAL_CONST acosh(double x);
+double MGL_LOCAL_CONST atanh(double x);
+double MGL_LOCAL_CONST fmin(double a,double b);
+double MGL_LOCAL_CONST fmax(double a,double b);
+#endif
 //-----------------------------------------------------------------------------
 // It seems that standard wcstombs() have a bug. So, I replace by my own.
 void MGL_EXPORT mgl_wcstombs(char *dst, const wchar_t *src, int size)
@@ -194,164 +325,179 @@ void MGL_EXPORT mgl_wcslwr(wchar_t *str)
 // All numbers are presented as mglData(1). Do boundary checking.
 // NOTE: In any case where number is required the mglData::a[0] is used.
 // String flag is binary 0x1 -> 'x', 0x2 -> 'y', 0x4 -> 'z'
-mglData MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const std::vector<mglDataA*> &head)
+HMDT MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const std::vector<mglDataA*> &head)
 {
 #if MGL_HAVE_GSL
        gsl_set_error_handler_off();
 #endif
-       mglData res;
-       if(str.empty() || mglFormulaError)      return res;     // nothing to parse
-//     if(arg) head = arg->DataList;
+       if(str.empty()) return new mglData;     // nothing to parse
        str = mgl_trim_ws(str);
        long n,len=str.length();
        if(str[0]=='(' && mglCheck(str.substr(1,len-2)))        // remove braces
        {       str = str.substr(1,len-2);      len-=2; }
        if(str[0]=='[') // this is manual subdata
        {
-               mglData a1;
                long i, j, br=0,k;
                bool ar=true,mt=false;
+               HMDT res=0;
                for(i=1,j=1;i<len-1;i++)
                {
                        if(str[i]=='[') br++;
                        if(str[i]==']' && br>0) br--;
                        if(str[i]==',' && !br)
                        {
-                               a1=mglFormulaCalc(str.substr(j,i-j), arg, head);
+                               HMDT a1=mglFormulaCalc(str.substr(j,i-j), arg, head);
                                if(j==1)
-                               {       res = a1;       ar = (a1.nx==1);        mt = (a1.nx>1 && a1.ny==1);     }
+                               {       res = a1;       ar = (a1->nx==1);       mt = (a1->nx>1 && a1->ny==1);   }
                                else
                                {
                                        if(ar)          // res 1d array
-                                       {       k = res.nx;     res.Insert('x',k);      res.Put(a1,k);  }
+                                       {       k = res->nx;    res->Insert('x',k);     mgl_data_put_dat(res,a1,k,-1,-1);       }
                                        else if(mt)     // res 2d array
-                                       {       k = res.ny;     res.Insert('y',k);      res.Put(a1,-1,k);       }
+                                       {       k = res->ny;    res->Insert('y',k);     mgl_data_put_dat(res,a1,-1,k,-1);       }
                                        else            // res 3d array
-                                       {       k = res.nz;     res.Insert('z',k);      res.Put(a1,-1,-1,k);    }
+                                       {       k = res->nz;    res->Insert('z',k);     mgl_data_put_dat(res,a1,-1,-1,k);       }
+                                       mgl_delete_data(a1);
                                }
                                j=i+1;
                        }
                }
-               a1=mglFormulaCalc(str.substr(j,i-j), arg, head);
+               HMDT a1=mglFormulaCalc(str.substr(j,i-j), arg, head);
                if(j==1)
-               {       res = a1;       ar = (a1.nx==1);        mt = (a1.nx>1 && a1.ny==1);     }
+               {       res = a1;       ar = (a1->nx==1);       mt = (a1->nx>1 && a1->ny==1);   }
                else
                {
                        if(ar)          // res 1d array
-                       {       k = res.nx;     res.Insert('x',k);      res.Put(a1,k);  }
+                       {       k = res->nx;    res->Insert('x',k);     mgl_data_put_dat(res,a1,k,-1,-1);       }
                        else if(mt)     // res 2d array
-                       {       k = res.ny;     res.Insert('y',k);      res.Put(a1,-1,k);       }
+                       {       k = res->ny;    res->Insert('y',k);     mgl_data_put_dat(res,a1,-1,k,-1);       }
                        else            // res 3d array
-                       {       k = res.nz;     res.Insert('z',k);      res.Put(a1,-1,-1,k);    }
+                       {       k = res->nz;    res->Insert('z',k);     mgl_data_put_dat(res,a1,-1,-1,k);       }
+                       mgl_delete_data(a1);
                }
                return res;
        }
 
-       n=mglFindInText(str,"&|");                              // lowest priority -- logical
+       n=mglFindInText(str,"&|");      // lowest priority -- logical
        if(n>=0)
                return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, str[n]=='|'?cor:cand);
-       n=mglFindInText(str,"<>=");                             // low priority -- conditions
+       n=mglFindInText(str,"<>=");     // low priority -- conditions
        if(n>=0)
                return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, str[n]=='<'?clt:(str[n]=='>'?cgt:ceq));
-       n=mglFindInText(str,"+-");                              // normal priority -- additions
-       if(n>=0 && (n<2 || str[n-1]!='e' || (str[n-2]!='.' && !isdigit(str[n-2]))))
-               return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, str[n]=='+'?add:sub);
-       n=mglFindInText(str,"*/");                              // high priority -- multiplications
+       n=mglFindInText(str,"+-");      // normal priority -- additions
+       if(n>=0 && (n<2 || str[n-1]!='e' || (str[n-2]!='.' && !isdigit(str[n-2])) ))
+               return str[n]=='+'? mglApplyOperAdd(str.substr(0,n),str.substr(n+1),arg, head) : mglApplyOperSub(str.substr(0,n),str.substr(n+1),arg, head);
+       n=mglFindInText(str,"*/");      // high priority -- multiplications
        if(n>=0)
-               return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, str[n]=='*'?mul:del);
-       n=mglFindInText(str,"@");                               // high priority -- combine
+               return str[n]=='*'? mglApplyOperMul(str.substr(0,n),str.substr(n+1),arg, head) : mglApplyOperDiv(str.substr(0,n),str.substr(n+1),arg, head);
+       n=mglFindInText(str,"@");       // high priority -- combine
        if(n>=0)
-               return mglFormulaCalc(str.substr(0,n),arg, head).Combine(mglFormulaCalc(str.substr(n+1),arg, head));
-       n=mglFindInText(str,"^");                               // highest priority -- power
-       if(n>=0)
-               return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, ipw);
-       n=mglFindInText(str,":");                               // highest priority -- array
+       {
+               HMDT a1 = mglFormulaCalc(str.substr(0,n),arg, head);
+               HMDT a2 = mglFormulaCalc(str.substr(n+1),arg, head);
+               HMDT res = mgl_data_combine(a1,a2);
+               mgl_delete_data(a1);    mgl_delete_data(a2);
+               return res;
+       }
+       n=mglFindInText(str,"^");       // highest priority -- power
+       if(n>=0)        return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, ipw);
+       n=mglFindInText(str,":");       // highest priority -- array
        if(n>=0 && str.compare(L":"))
        {
-               const mglData &a1=mglFormulaCalc(str.substr(0,n), arg, head);
-               const mglData &a2=mglFormulaCalc(str.substr(n+1), arg, head);
-               res.Create(abs(int(a2.a[0]+0.5)-int(a1.a[0]+0.5))+1);
-               res.Fill(a1.a[0], a2.a[0]);
+               HMDT a1=mglFormulaCalc(str.substr(0,n), arg, head);
+               HMDT a2=mglFormulaCalc(str.substr(n+1), arg, head);
+               HMDT res = new mglData(abs(int(a2->a[0]+0.5)-int(a1->a[0]+0.5))+1);
+               res->Fill(a1->a[0], a2->a[0]);
+               mgl_delete_data(a1);    mgl_delete_data(a2);
                return res;
        }
        n=mglFindInText(str,".");                               // highest priority -- suffixes
-       if(n>=0)
+       wchar_t c0 = str[n+1];
+       if(n>=0  && c0>='a' && c0!='e')
        {
                mreal x,y,z,k,v=NAN;
-               mglData d = mglFormulaCalc(str.substr(0,n), arg, head);
+               HMDT d = mglFormulaCalc(str.substr(0,n), arg, head);
+               long ns[3] = {d->nx, d->ny, d->nz};
                const std::wstring &p=str.substr(n+1);
-               if(!p.compare(L"a"))                    v = d.a[0];
-               else if(!p.compare(L"fst"))     {       long i=-1,j=-1,l=-1;    v = d.Find(0,i,j,l);    }
-               else if(!p.compare(L"lst"))     {       long i=-1,j=-1,l=-1;    v = d.Last(0,i,j,l);    }
-               else if(!p.compare(L"nx"))      v=d.nx;
-               else if(!p.compare(L"ny"))      v=d.ny;
-               else if(!p.compare(L"nz"))      v=d.nz;
-               else if(!p.compare(L"max"))     v=d.Maximal();
-               else if(!p.compare(L"min"))     v=d.Minimal();
-               else if(!p.compare(L"pmax"))    {       v=d.Maximal();  v = v>0?v:0;    }
-               else if(!p.compare(L"pmin"))    {       v=d.MinimalPos();       }
-               else if(!p.compare(L"nmax"))    {       v=d.MaximalNeg();       }
-               else if(!p.compare(L"nmin"))    {       v=d.Minimal();  v = v<0?v:0;    }
-               else if(!p.compare(L"sum"))     v=d.Momentum('x',x,y);
-               else if(!p.compare(L"mx"))      {       d.Maximal(x,y,z);       v=x/d.nx;       }
-               else if(!p.compare(L"my"))      {       d.Maximal(x,y,z);       v=y/d.ny;       }
-               else if(!p.compare(L"mz"))      {       d.Maximal(x,y,z);       v=z/d.nz;       }
-               else if(!p.compare(L"ax"))      {       d.Momentum('x',x,y);    v=x/d.nx;       }
-               else if(!p.compare(L"ay"))      {       d.Momentum('y',x,y);    v=x/d.ny;       }
-               else if(!p.compare(L"az"))      {       d.Momentum('z',x,y);    v=x/d.nz;       }
-               else if(!p.compare(L"wx"))      {       d.Momentum('x',x,y);    v=y/d.nx;       }
-               else if(!p.compare(L"wy"))      {       d.Momentum('y',x,y);    v=y/d.ny;       }
-               else if(!p.compare(L"wz"))      {       d.Momentum('z',x,y);    v=y/d.nz;       }
-               else if(!p.compare(L"sx"))      {       d.Momentum('x',x,y,z,k);        v=z/d.nx;       }
-               else if(!p.compare(L"sy"))      {       d.Momentum('y',x,y,z,k);        v=z/d.ny;       }
-               else if(!p.compare(L"sz"))      {       d.Momentum('z',x,y,z,k);        v=z/d.nz;       }
-               else if(!p.compare(L"kx"))      {       d.Momentum('x',x,y,z,k);        v=k/d.nx;       }
-               else if(!p.compare(L"ky"))      {       d.Momentum('y',x,y,z,k);        v=k/d.ny;       }
-               else if(!p.compare(L"kz"))      {       d.Momentum('z',x,y,z,k);        v=k/d.nz;       }
-               else if(!p.compare(L"aa"))      {       d.Momentum('a',x,y);    v=x;    }
-               else if(!p.compare(L"wa"))      {       d.Momentum('a',x,y);    v=y;    }
-               else if(!p.compare(L"sa"))      {       d.Momentum('a',x,y,z,k);v=z;    }
-               else if(!p.compare(L"ka"))      {       d.Momentum('a',x,y,z,k);v=k;    }
+               wchar_t ch = p[1];
+               if(c0=='a')
+               {
+                       if(ch==0)       v = d->a[0];
+                       else
+                       {
+                               d->Momentum(ch,x,y);
+                               if(ch=='a')     v = x;
+                               else if(ch>='x' && ch<='z')     v = x/ns[ch-'x'];
+                       }
+               }
+               else if(c0=='n')
+               {
+                       if(ch>='x' && ch<='z')  v = ns[p[1]-'x'];
+                       else if(!p.compare(L"nmax"))    {       v=d->MaximalNeg();      }
+                       else if(!p.compare(L"nmin"))    {       v=d->Minimal(); v = v<0?v:0;    }
+               }
+               else if(c0=='k')
+               {
+                       d->Momentum(ch,x,y,z,k);
+                       if(ch=='a')     v = k;
+                       else if(ch>='x' && ch<='z')     v = k/ns[ch-'x'];
+               }
+               else if(c0=='w')
+               {
+                       d->Momentum(ch,x,y);
+                       if(ch=='a')     v = y;
+                       else if(ch>='x' && ch<='z')     v = y/ns[ch-'x'];
+               }
+               else if(c0=='m')
+               {
+                       if(ch=='a' && p[2]=='x')        v = d->Maximal();
+                       else if(ch=='i' && p[2]=='n')   v = d->Minimal();
+                       else if(ch=='x')        {       v = d->Maximal(x,y,z);  v = x/ns[0];    }
+                       else if(ch=='y')        {       v = d->Maximal(x,y,z);  v = y/ns[1];    }
+                       else if(ch=='z')        {       v = d->Maximal(x,y,z);  v = z/ns[2];    }
+               }
+               else if(c0=='s')
+               {
+                       if(ch=='u' && p[2]=='m')        v = d->Momentum('x',x,y);
+                       else if(ch=='a')
+                       {       d->Momentum(ch,x,y,z,k);        v = z;  }
+                       else if(ch>='x' && ch<='z')
+                       {       d->Momentum(ch,x,y,z,k);        v = z/ns[ch-'x'];       }
+               }
+               else if(!p.compare(L"fst"))     {       long i=-1,j=-1,l=-1;    v = d->Find(0,i,j,l);   }
+               else if(!p.compare(L"lst"))     {       long i=-1,j=-1,l=-1;    v = d->Last(0,i,j,l);   }
+               else if(!p.compare(L"pmax"))    {       v=d->Maximal(); v = v>0?v:0;    }
+               else if(!p.compare(L"pmin"))    {       v=d->MinimalPos();      }
+               delete d;
                // if this is valid suffix when finish parsing (it can be mreal number)
-               if(mgl_isfin(v))        {       res.a[0] = v;   return res;     }
+               if(mgl_isfin(v))
+               {       HMDT res = new mglData; res->a[0]=v;    return res;     }
        }
        for(n=0;n<len;n++)      if(str[n]=='(') break;
        if(n>=len)              // this is number or variable
        {
                HCDT v = (str!=L"#$mgl")?FindVar(head, str):0;
-               mglNum *f = arg?arg->FindNum(str.c_str()):0;
-               if(v)   res = v;
-               else if(f)      res.a[0] = f->d;
-               else if(!str.compare(L":"))             res.a[0] = -1;
-               else
+               if(v)   return new mglData(v);
+               const mglNum *f = arg?arg->FindNum(str.c_str()):0;
+               if(f)   {       HMDT res = new mglData; res->a[0] = f->d;       return res;     }
+               else if(!str.compare(L"rnd"))
                {
                        v=FindVar(head, L"#$mgl");
-                       if(v)   res.Create(v->GetNx(),v->GetNy(),v->GetNz());
-                       if(!str.compare(L"rnd"))        for(long i=0;i<res.GetNN();i++) res.a[i] = mgl_rnd();
-                       else if(!str.compare(L"nan"))   res = NAN;
-                       else if(!str.compare(L"inf"))   res = INFINITY;
-                       else if(!str.compare(L"pi"))    res = M_PI;
-                       else if(!str.compare(L"on"))    res = 1;
-                       else if(!str.compare(L"off"))   res = 0;
-/*                     else if(!str.compare(L"t"))     res.Fill(0,1,'x');
-                       else if(!str.compare(L"x") && arg && arg->curGr)
-                       {
-                               if(res.GetNN()==1)      res.Create(100);
-                               res.Fill(arg->curGr->Min.x, arg->curGr->Max.x,'x');
-                       }
-                       else if(!str.compare(L"y") && arg && arg->curGr)
-                       {
-                               if(res.GetNN()==1)      res.Create(100);
-                               res.Fill(arg->curGr->Min.x, arg->curGr->Max.x,res.ny>1?'y':'x');
-                       }
-                       else if(!str.compare(L"z") && arg && arg->curGr)
-                       {
-                               if(res.GetNN()==1)      res.Create(100);
-                               res.Fill(arg->curGr->Min.x, arg->curGr->Max.x,res.nz>1?'z':'x');
-                       }*/
-                       else res = wcstod(str.c_str(),0);       // this is number
+                       HMDT res = v?new mglData(v->GetNx(),v->GetNy(),v->GetNz()) : new mglData;
+                       for(long i=0;i<res->GetNN();i++)        res->a[i] = mgl_rnd();
+                       return res;
+               }
+               else
+               {
+                       HMDT res = new mglData;
+                       char ch = str[0];
+                       if(ch<':') res->a[0] = wcstod(str.c_str(),0);   // this is number
+                       else if(!str.compare(L"pi"))    res->a[0] = M_PI;
+                       else if(ch==':')        res->a[0] = -1;
+                       else if(!str.compare(L"nan"))   res->a[0] = NAN;
+                       else if(!str.compare(L"inf"))   res->a[0] = INFINITY;
+                       return res;
                }
-               return res;
        }
        else
        {
@@ -360,23 +506,19 @@ mglData MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const std
                HCDT v = FindVar(head, nm);
 //             mglVar *v = arg->FindVar(nm.c_str());
                if(!v && !nm.compare(0,7,L"jacobi_"))   nm = nm.substr(7);
+               n = mglFindInText(str,",");
                if(v)   // subdata
                {
                        if(str[0]=='\'' && str[len-1]=='\'')    // this is column call
                        {
                                char *buf = new char[len];
                                mgl_wcstombs(buf, str.substr(1).c_str(), len-1);        buf[len-1]=0;
-                               const mglData *vd = dynamic_cast<const mglData *>(v);
-                               if(vd)  res=vd->Column(buf);
-                               const mglDataC *vc = dynamic_cast<const mglDataC *>(v);
-                               if(vc)  res=vc->Column(buf);
-                               delete []buf;
+                               HMDT res = mgl_data_column(v,buf);
+                               delete []buf;   return res;
                        }
                        else
                        {
-                               mglData a1, a2, a3;
-                               a1.a[0] = a2.a[0] = a3.a[0] = -1;
-                               n=mglFindInText(str,",");
+                               HMDT a1=0, a2=0, a3=0;
                                if(n>0)
                                {
                                        long m=mglFindInText(str.substr(0,n),",");
@@ -394,282 +536,187 @@ mglData MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const std
                                        }
                                }
                                else    a1 = mglFormulaCalc(str, arg, head);
-                               res = mglSubData(*v,a1,a2,a3);
+                               HMDT res = mgl_data_subdata_ext(v,a1,a2,a3);
+                               mgl_delete_data(a1);    mgl_delete_data(a2);
+                               mgl_delete_data(a3);    return res;
                        }
                }
                else if(nm[0]=='a')     // function
                {
-                       if(!nm.compare(L"asin"))
-                       {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,asin); }
-                       else if(!nm.compare(L"acos"))
-                       {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,acos); }
-                       else if(!nm.compare(L"atan"))
-                       {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,atan); }
+                       if(!nm.compare(L"asin"))                return mglApplyFunc(str, arg, head, asin);
+                       else if(!nm.compare(L"acos"))   return mglApplyFunc(str, arg, head, acos);
+                       else if(!nm.compare(L"atan"))   return mglApplyFunc(str, arg, head, atan);
+                       else if(!nm.compare(L"asinh"))  return mglApplyFunc(str, arg, head, asinh);
+                       else if(!nm.compare(L"acosh"))  return mglApplyFunc(str, arg, head, acosh);
+                       else if(!nm.compare(L"atanh"))  return mglApplyFunc(str, arg, head, atanh);
                        else if(!nm.compare(L"arg"))
                        {
-                               n=mglFindInText(str,",");
-                               if(n<=0)        mglFormulaError=true;
-                               else    res = mglApplyOper(str.substr(n+1),str.substr(0,n),arg, head, atan2);
+                               if(n>0) return mglApplyOper(str.substr(n+1),str.substr(0,n),arg, head, atan2);
+                               else
+                               {
+                                       HADT a1 = mglFormulaCalcC(str, arg, head);
+                                       HMDT res = mgl_datac_arg(a1);
+                                       mgl_delete_datac(a1);   return res;
+                               }
                        }
                        else if(!nm.compare(L"abs"))
                        {
-                               n=mglFindInText(str,",");
-                               if(n<=0)        {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,fabs); }
-                               else    res = mglApplyOper(str.substr(n+1),str.substr(0,n),arg, head, hypot);
+                               if(n>0) return mglApplyOper(str.substr(n+1),str.substr(0,n),arg, head, hypot);
+                               else
+                               {
+                                       HADT a1 = mglFormulaCalcC(str, arg, head);
+                                       HMDT res = mgl_datac_abs(a1);
+                                       mgl_delete_datac(a1);   return res;
+                               }
                        }
 #if MGL_HAVE_GSL
                        else if(!nm.compare(L"ai") || !nm.compare(L"airy_ai"))
-                       {       res=mglFormulaCalc(str, arg, head);
-#pragma omp parallel for
-                               for(long i=0;i<res.nx*res.ny*res.nz;i++)
-                                       res.a[i] = gsl_sf_airy_Ai(res.a[i],GSL_PREC_SINGLE);    }
+                               return mglApplyFuncGSL(str, arg, head, gsl_sf_airy_Ai);
                        else if(!nm.compare(L"airy_dai"))
-                       {       res=mglFormulaCalc(str, arg, head);
-#pragma omp parallel for
-                               for(long i=0;i<res.nx*res.ny*res.nz;i++)
-                                       res.a[i] = gsl_sf_airy_Ai_deriv(res.a[i],GSL_PREC_SINGLE);      }
+                               return mglApplyFuncGSL(str, arg, head, gsl_sf_airy_Ai_deriv);
                        else if(!nm.compare(L"airy_bi"))
-                       {       res=mglFormulaCalc(str, arg, head);
-#pragma omp parallel for
-                               for(long i=0;i<res.nx*res.ny*res.nz;i++)
-                                       res.a[i] = gsl_sf_airy_Bi(res.a[i],GSL_PREC_SINGLE);    }
+                               return mglApplyFuncGSL(str, arg, head, gsl_sf_airy_Bi);
                        else if(!nm.compare(L"airy_dbi"))
-                       {       res=mglFormulaCalc(str, arg, head);
-#pragma omp parallel for
-                               for(long i=0;i<res.nx*res.ny*res.nz;i++)
-                                       res.a[i] = gsl_sf_airy_Bi_deriv(res.a[i],GSL_PREC_SINGLE);      }
+                               return mglApplyFuncGSL(str, arg, head, gsl_sf_airy_Bi_deriv);
                }
                else if(nm[0]=='b')
                {
-                       if(!nm.compare(L"beta"))
-                       {
-                               n=mglFindInText(str,",");
-                               if(n<=0)        mglFormulaError=true;
-                               else    res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_beta);
-                       }
+                       if(!nm.compare(L"beta") && n>0)
+                               return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_beta);
                        else if(!nm.compare(L"bi"))
-                       {       res=mglFormulaCalc(str, arg, head);
-#pragma omp parallel for
-                               for(long i=0;i<res.nx*res.ny*res.nz;i++)
-                                       res.a[i] = gsl_sf_airy_Bi(res.a[i],GSL_PREC_SINGLE);    }
-                       else if(!nm.compare(L"bessel_i"))
-                       {
-                               n=mglFindInText(str,",");
-                               if(n<=0)        mglFormulaError=true;
-                               else    res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Inu);
-                       }
-                       else if(!nm.compare(L"bessel_j"))
-                       {
-                               n=mglFindInText(str,",");
-                               if(n<=0)        mglFormulaError=true;
-                               else    res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Jnu);
-                       }
-                       else if(!nm.compare(L"bessel_k"))
-                       {
-                               n=mglFindInText(str,",");
-                               if(n<=0)        mglFormulaError=true;
-                               else    res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Knu);
-                       }
-                       else if(!nm.compare(L"bessel_y"))
-                       {
-                               n=mglFindInText(str,",");
-                               if(n<=0)        mglFormulaError=true;
-                               else    res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Ynu);
-                       }
+                               return mglApplyFuncGSL(str, arg, head, gsl_sf_airy_Bi);
+                       else if(!nm.compare(L"bessel_i") && n>0)
+                               return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Inu);
+                       else if(!nm.compare(L"bessel_j") && n>0)
+                               return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Jnu);
+                       else if(!nm.compare(L"bessel_k") && n>0)
+                               return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Knu);
+                       else if(!nm.compare(L"bessel_y") && n>0)
+                               return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Ynu);
 #endif
                }
                else if(nm[0]=='c')
                {
-                       if(!nm.compare(L"cos"))
-                       {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,cos);  }
-                       else if(!nm.compare(L"cosh") || !nm.compare(L"ch"))
-                       {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,cosh); }
+                       if(!nm.compare(L"cos")) return mglApplyFunc(str, arg, head, cos);
+                       else if(!nm.compare(L"cosh") || !nm.compare(L"ch"))     return mglApplyFunc(str, arg, head, cosh);
+                       else if(!nm.compare(L"conj"))
+                       {
+                               HADT a1 = mglFormulaCalcC(str, arg, head);
+                               HMDT res = mgl_datac_real(a1);
+                               mgl_delete_datac(a1);   return res;
+                       }
 #if MGL_HAVE_GSL
-                       else if(!nm.compare(L"ci"))
-                       {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,gsl_sf_Ci);    }
+                       else if(!nm.compare(L"ci"))     return mglApplyFunc(str, arg, head, gsl_sf_Ci);
 #endif
                }
                else if(nm[0]=='e')
                {
-                       if(!nm.compare(L"exp"))
-                       {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,exp);  }
+                       if(!nm.compare(L"exp")) return mglApplyFunc(str, arg, head, exp);
 #if MGL_HAVE_GSL
-                       else if(!nm.compare(L"erf"))
-                       {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,gsl_sf_erf);   }
-//                     else if(!nm.compare(L"en"))     Kod=EQ_EN;      // NOTE: not supported
+                       else if(!nm.compare(L"erf"))    return mglApplyFunc(str, arg, head, gsl_sf_erf);
                        else if(!nm.compare(L"ee") || !nm.compare(L"elliptic_ec"))
-                       {       res=mglFormulaCalc(str, arg, head);
-#pragma omp parallel for
-                               for(long i=0;i<res.nx*res.ny*res.nz;i++)
-                                       res.a[i] = gsl_sf_ellint_Ecomp(res.a[i],GSL_PREC_SINGLE);       }
+                               return mglApplyFuncGSL(str, arg, head, gsl_sf_ellint_Ecomp);
                        else if(!nm.compare(L"ek") || !nm.compare(L"elliptic_kc"))
-                       {       res=mglFormulaCalc(str, arg, head);
-#pragma omp parallel for
-                               for(long i=0;i<res.nx*res.ny*res.nz;i++)
-                                       res.a[i] = gsl_sf_ellint_Kcomp(res.a[i],GSL_PREC_SINGLE);       }
-                       else if(!nm.compare(L"e") || !nm.compare(L"elliptic_e"))
-                       {
-                               n=mglFindInText(str,",");
-                               if(n<=0)        mglFormulaError=true;
-                               else    res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gslEllE);
-                       }
+                               return mglApplyFuncGSL(str, arg, head, gsl_sf_ellint_Kcomp);
+                       else if((!nm.compare(L"e") || !nm.compare(L"elliptic_e")) && n>0)
+                               return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gslEllE);
                        else if(!nm.compare(L"elliptic_f"))
-                       {
-                               n=mglFindInText(str,",");
-                               if(n<=0)        mglFormulaError=true;
-                               else    res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gslEllF);
-                       }
+                               return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gslEllF);
 
-                       else if(!nm.compare(L"ei"))
-                       {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,gsl_sf_expint_Ei);     }
-                       else if(!nm.compare(L"e1"))
-                       {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,gsl_sf_expint_E1);     }
-                       else if(!nm.compare(L"e2"))
-                       {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,gsl_sf_expint_E2);     }
-                       else if(!nm.compare(L"eta"))
-                       {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,gsl_sf_eta);   }
-                       else if(!nm.compare(L"ei3"))
-                       {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,gsl_sf_expint_3);      }
+                       else if(!nm.compare(L"ei"))     return mglApplyFunc(str, arg, head, gsl_sf_expint_Ei);
+                       else if(!nm.compare(L"e1"))     return mglApplyFunc(str, arg, head, gsl_sf_expint_E1);
+                       else if(!nm.compare(L"e2"))     return mglApplyFunc(str, arg, head, gsl_sf_expint_E2);
+                       else if(!nm.compare(L"eta"))    return mglApplyFunc(str, arg, head, gsl_sf_eta);
+                       else if(!nm.compare(L"ei3"))    return mglApplyFunc(str, arg, head, gsl_sf_expint_3);
 #endif
                }
                else if(nm[0]=='l')
                {
-                       if(!nm.compare(L"log"))
-                       {
-                               n=mglFindInText(str,",");
-                               if(n<=0)        mglFormulaError=true;
-                               else    res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, llg);
-                       }
-                       else if(!nm.compare(L"lg"))
-                       {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,log10);        }
-                       else if(!nm.compare(L"ln"))
-                       {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,log);  }
+                       if(!nm.compare(L"log") && n>0)
+                               return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, llg);
+                       else if(!nm.compare(L"lg"))     return mglApplyFunc(str, arg, head, log10);
+                       else if(!nm.compare(L"ln"))     return mglApplyFunc(str, arg, head, log);
 #if MGL_HAVE_GSL
-                       else if(!nm.compare(L"li2"))
-                       {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,gsl_sf_dilog); }
-                       else if(!nm.compare(L"legendre"))
-                       {
-                               n=mglFindInText(str,",");
-                               if(n<=0)        mglFormulaError=true;
-                               else    res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gslLegP);
-                       }
+                       else if(!nm.compare(L"li2"))    return mglApplyFunc(str, arg, head, gsl_sf_dilog);
+                       else if(!nm.compare(L"legendre") && n>0)
+                               return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gslLegP);
 #endif
                }
                else if(nm[0]=='s')
                {
-                       if(!nm.compare(L"sqrt"))
-                       {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,sqrt); }
-                       else if(!nm.compare(L"sin"))
-                       {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,sin);  }
-                       else if(!nm.compare(L"step"))
-                       {       res=mglFormulaCalc(str, arg, head);
-#pragma omp parallel for
-                               for(long i=0;i<res.nx*res.ny*res.nz;i++)        res.a[i] = res.a[i]>0?1:0;      }
-                       else if(!nm.compare(L"sign"))
-                       {       res=mglFormulaCalc(str, arg, head);
-#pragma omp parallel for
-                               for(long i=0;i<res.nx*res.ny*res.nz;i++)
-                                       res.a[i] = res.a[i]>0?1:(res.a[i]<0?-1:0);      }
-                       else if(!nm.compare(L"sinh") || !nm.compare(L"sh"))
-                       {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,sinh); }
+                       if(!nm.compare(L"sqrt"))        return mglApplyFunc(str, arg, head, sqrt);
+                       else if(!nm.compare(L"sin"))    return mglApplyFunc(str, arg, head, sin);
+                       else if(!nm.compare(L"step"))   return mglApplyFunc(str, arg, head, stp);
+                       else if(!nm.compare(L"sign"))   return mglApplyFunc(str, arg, head, sgn);
+                       else if(!nm.compare(L"sinh") || !nm.compare(L"sh"))     return mglApplyFunc(str, arg, head, sinh);
 #if MGL_HAVE_GSL
-                       else if(!nm.compare(L"si"))
-                       {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,gsl_sf_Si);    }
-                       else if(!nm.compare(L"sinc"))
-                       {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,gsl_sf_sinc);  }
+                       else if(!nm.compare(L"si"))             return mglApplyFunc(str, arg, head, gsl_sf_Si);
+                       else if(!nm.compare(L"sinc"))   return mglApplyFunc(str, arg, head, gsl_sf_sinc);
 #endif
                }
                else if(nm[0]=='t')
                {
                        if(!nm.compare(L"tg") || !nm.compare(L"tan"))
-                       {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,tan);  }
+                               return mglApplyFunc(str, arg, head, tan);
                        else if(!nm.compare(L"tanh") || !nm.compare(L"th"))
-                       {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,tanh); }
+                               return mglApplyFunc(str, arg, head, tanh);
                }
-               else if(!nm.compare(L"pow"))
+               else if(!nm.compare(L"pow") && n>0)
+                       return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, pow);
+               else if(nm[0]=='m')
                {
-                       n=mglFindInText(str,",");
-                       if(n<=0)        mglFormulaError=true;
-                       else    res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, pow);
+                       if(!nm.compare(L"mod") && n>0)
+                               return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, fmod);
+                       else if(!nm.compare(L"min") && n>0)
+                               return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, fmin);
+                       else if(!nm.compare(L"max") && n>0)
+                               return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, fmax);
                }
-               else if(!nm.compare(L"mod"))
-               {
-                       n=mglFindInText(str,",");
-                       if(n<=0)        mglFormulaError=true;
-                       else    res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, fmod);
-               }
-               else if(!nm.compare(L"int"))
-               {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,floor);        }
+               else if(!nm.compare(L"int"))    return mglApplyFunc(str, arg, head, floor);
                else if(!nm.compare(L"random"))
-               {       res=mglFormulaCalc(str, arg, head);     register long n = res.GetNN(), i;
-                       for(i=0;i<n;i++)        res.a[i] = mgl_rnd();   }
-#if MGL_HAVE_GSL
-               else if(!nm.compare(L"i"))
+               {       HMDT res=mglFormulaCalc(str, arg, head);        mreal *a = res->a;
+                       for(long i=0;i<res->GetNN();i++)        a[i] = mgl_rnd();       return res;     }
+               else if(!nm.compare(L"real"))
                {
-                       n=mglFindInText(str,",");
-                       if(n<=0)        mglFormulaError=true;
-                       else    res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Inu);
+                       HADT a1 = mglFormulaCalcC(str, arg, head);
+                       HMDT res = mgl_datac_real(a1);
+                       mgl_delete_datac(a1);   return res;
                }
-               else if(!nm.compare(L"j"))
+               else if(!nm.compare(L"imag"))
                {
-                       n=mglFindInText(str,",");
-                       if(n<=0)        mglFormulaError=true;
-                       else    res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Jnu);
+                       HADT a1 = mglFormulaCalcC(str, arg, head);
+                       HMDT res = mgl_datac_imag(a1);
+                       mgl_delete_datac(a1);   return res;
                }
-               else if(!nm.compare(L"k"))
-               {
-                       n=mglFindInText(str,",");
-                       if(n<=0)        mglFormulaError=true;
-                       else    res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Knu);
-               }
-               else if(!nm.compare(L"y"))
-               {
-                       n=mglFindInText(str,",");
-                       if(n<=0)        mglFormulaError=true;
-                       else    res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Ynu);
-               }
-               else if(!nm.compare(L"f"))
-               {
-                       n=mglFindInText(str,",");
-                       if(n<=0)        mglFormulaError=true;
-                       else    res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gslEllF);
-               }
-               else if(!nm.compare(L"hypot"))
-               {
-                       n=mglFindInText(str,",");
-                       if(n<=0)        mglFormulaError=true;
-                       else    res = mglApplyOper(str.substr(n+1),str.substr(0,n),arg, head, hypot);
-               }
-               else if(!nm.compare(L"gamma"))
-               {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,gsl_sf_gamma); }
-               else if(!nm.compare(L"gamma_inc"))
-               {
-                       n=mglFindInText(str,",");
-                       if(n<=0)        mglFormulaError=true;
-                       else    res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_gamma_inc);
-               }
-               else if(!nm.compare(L"w0"))
-               {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,gsl_sf_lambert_W0);    }
-               else if(!nm.compare(L"w1"))
-               {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,gsl_sf_lambert_Wm1);   }
-               else if(!nm.compare(L"psi"))
-               {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,gsl_sf_psi);   }
-               else if(!nm.compare(L"zeta"))
-               {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,gsl_sf_zeta);  }
-               else if(!nm.compare(L"z"))
-               {       res=mglFormulaCalc(str, arg, head);     mglApplyFunc(res,gsl_sf_dawson);        }
+#if MGL_HAVE_GSL
+               else if(!nm.compare(L"i") && n>0)
+                       return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Inu);
+               else if(!nm.compare(L"j") && n>0)
+                       return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Jnu);
+               else if(!nm.compare(L"k") && n>0)
+                       return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Knu);
+               else if(!nm.compare(L"y") && n>0)
+                       return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Ynu);
+               else if(!nm.compare(L"f") && n>0)
+                       return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gslEllF);
+               else if(!nm.compare(L"hypot") && n>0)
+                       return mglApplyOper(str.substr(n+1),str.substr(0,n),arg, head, hypot);
+               else if(!nm.compare(L"gamma"))  return mglApplyFunc(str, arg, head, gsl_sf_gamma);
+               else if(!nm.compare(L"gamma_inc") && n>0)
+                       return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_gamma_inc);
+               else if(!nm.compare(L"w0"))     return mglApplyFunc(str, arg, head, gsl_sf_lambert_W0);
+               else if(!nm.compare(L"w1"))     return mglApplyFunc(str, arg, head, gsl_sf_lambert_Wm1);
+               else if(!nm.compare(L"psi"))    return mglApplyFunc(str, arg, head, gsl_sf_psi);
+               else if(!nm.compare(L"zeta"))   return mglApplyFunc(str, arg, head, gsl_sf_zeta);
+               else if(!nm.compare(L"z"))      return mglApplyFunc(str, arg, head, gsl_sf_dawson);
 #endif
        }
-       return res;
+       HMDT res = new mglData; res->a[0]=NAN;  return res;
 }
 //-----------------------------------------------------------------------------
 dual MGL_LOCAL_CONST ceqc(dual a,dual b)       {return a==b?1:0;}
 dual MGL_LOCAL_CONST cltc(dual a,dual b)       {return real(a-b)<0?1:0;}
 dual MGL_LOCAL_CONST cgtc(dual a,dual b)       {return real(a-b)>0?1:0;}
-dual MGL_LOCAL_CONST addc(dual a,dual b);      //{return a+b;}
-dual MGL_LOCAL_CONST subc(dual a,dual b);      //{return a-b;}
-dual MGL_LOCAL_CONST mulc(dual a,dual b);      //{return a*b;}
-dual MGL_LOCAL_CONST divc(dual a,dual b);      //{return a/b;}
 dual MGL_LOCAL_CONST ipwc(dual a,dual b);      //{return mgl_ipowc(a,int(b.real()));}
 dual MGL_LOCAL_CONST powc(dual a,dual b);      //{return exp(b*log(a));        }
 dual MGL_LOCAL_CONST llgc(dual a,dual b);      //{return log(a)/log(b);        }
@@ -679,6 +726,7 @@ dual MGL_LOCAL_CONST expi(double a);        //{     return dual(cos(a),sin(a));     }
 dual MGL_LOCAL_CONST asinhc(dual x);   //{     return log(x+sqrt(x*x+mreal(1)));       }
 dual MGL_LOCAL_CONST acoshc(dual x);   //{     return log(x+sqrt(x*x-mreal(1)));       }
 dual MGL_LOCAL_CONST atanhc(dual x);   //{     return log((mreal(1)+x)/(mreal(1)-x))/mreal(2); }
+dual MGL_LOCAL_CONST conjc(dual x);    //{     return dual(real(x),-imag(x));  }
 dual MGL_LOCAL_CONST sinc(dual x);     //{     return sin(x);  }
 dual MGL_LOCAL_CONST cosc(dual x);     //{     return cos(x);  }
 dual MGL_LOCAL_CONST tanc(dual x);     //{     return tan(x);  }
@@ -694,160 +742,184 @@ dual MGL_LOCAL_CONST logc(dual x);      //{     return log(x);  }
 dual MGL_LOCAL_CONST absc(dual x);     //{     return abs(x);  }
 dual MGL_LOCAL_CONST argc(dual x);     //{     return arg(x);  }
 dual MGL_LOCAL_CONST lgc(dual x);              //{     return log10(x);}
+dual MGL_LOCAL_CONST realc(dual x)     {       return real(x); }
+dual MGL_LOCAL_CONST imagc(dual x)     {       return dual(0,imag(x)); }
 //-----------------------------------------------------------------------------
 /// Parse string and substitute the script argument
 // All numbers are presented as mglData(1). Do boundary checking.
 // NOTE: In any case where number is required the mglData::a[0] is used.
 // String flag is binary 0x1 -> 'x', 0x2 -> 'y', 0x4 -> 'z'
-mglDataC MGL_NO_EXPORT mglFormulaCalcC(std::wstring str, mglParser *arg, const std::vector<mglDataA*> &head)
+HADT MGL_NO_EXPORT mglFormulaCalcC(std::wstring str, mglParser *arg, const std::vector<mglDataA*> &head)
 {
 #if MGL_HAVE_GSL
        gsl_set_error_handler_off();
 #endif
-       mglDataC res;
-       if(str.empty() || mglFormulaError)      return res;     // nothing to parse
-//     if(arg) head = arg->DataList;
+       if(str.empty()) return new mglDataC;    // nothing to parse
        str = mgl_trim_ws(str);
        long n,len=str.length();
        if(str[0]=='(' && mglCheck(str.substr(1,len-2)))        // remove braces
        {       str = str.substr(1,len-2);      len-=2; }
        if(str[0]=='[') // this is manual subdata
        {
-               mglData a1;
                long i, j, br=0,k;
                bool ar=true,mt=false;
+               HADT res=0;
                for(i=1,j=1;i<len-1;i++)
                {
                        if(str[i]=='[') br++;
                        if(str[i]==']' && br>0) br--;
                        if(str[i]==',' && !br)
                        {
-                               a1=mglFormulaCalc(str.substr(j,i-j), arg, head);
+                               HADT a1=mglFormulaCalcC(str.substr(j,i-j), arg, head);
                                if(j==1)
-                               {       res = a1;       ar = (a1.nx==1);        mt = (a1.nx>1 && a1.ny==1);     }
+                               {       res = a1;       ar = (a1->nx==1);       mt = (a1->nx>1 && a1->ny==1);   }
                                else
                                {
                                        if(ar)          // res 1d array
-                                       {       k = res.nx;     res.Insert('x',k);      res.Put(a1,k);  }
+                                       {       k = res->nx;    res->Insert('x',k);     mgl_datac_put_dat(res,a1,k,-1,-1);      }
                                        else if(mt)     // res 2d array
-                                       {       k = res.ny;     res.Insert('y',k);      res.Put(a1,-1,k);       }
+                                       {       k = res->ny;    res->Insert('y',k);     mgl_datac_put_dat(res,a1,-1,k,-1);      }
                                        else            // res 3d array
-                                       {       k = res.nz;     res.Insert('z',k);      res.Put(a1,-1,-1,k);    }
+                                       {       k = res->nz;    res->Insert('z',k);     mgl_datac_put_dat(res,a1,-1,-1,k);      }
                                }
-                               j=i+1;
+                               mgl_delete_datac(a1);   j=i+1;
                        }
                }
-               a1=mglFormulaCalc(str.substr(j,i-j), arg, head);
+               HADT a1=mglFormulaCalcC(str.substr(j,i-j), arg, head);
                if(j==1)
-               {       res = a1;       ar = (a1.nx==1);        mt = (a1.nx>1 && a1.ny==1);     }
+               {       res = a1;       ar = (a1->nx==1);       mt = (a1->nx>1 && a1->ny==1);   }
                else
                {
                        if(ar)          // res 1d array
-                       {       k = res.nx;     res.Insert('x',k);      res.Put(a1,k);  }
+                       {       k = res->nx;    res->Insert('x',k);     mgl_datac_put_dat(res,a1,k,-1,-1);      }
                        else if(mt)     // res 2d array
-                       {       k = res.ny;     res.Insert('y',k);      res.Put(a1,-1,k);       }
+                       {       k = res->ny;    res->Insert('y',k);     mgl_datac_put_dat(res,a1,-1,k,-1);      }
                        else            // res 3d array
-                       {       k = res.nz;     res.Insert('z',k);      res.Put(a1,-1,-1,k);    }
+                       {       k = res->nz;    res->Insert('z',k);     mgl_datac_put_dat(res,a1,-1,-1,k);      }
                }
-               return res;
+               mgl_delete_datac(a1);   return res;
        }
 
-       n=mglFindInText(str,"<>=");                             // low priority -- conditions
+       n=mglFindInText(str,"<>=");     // low priority -- conditions
        if(n>=0)
                return mglApplyOperC(str.substr(0,n),str.substr(n+1),arg, head, str[n]=='<'?cltc:(str[n]=='>'?cgtc:ceqc));
-       n=mglFindInText(str,"+-");                              // normal priority -- additions
+       n=mglFindInText(str,"+-");      // normal priority -- additions
        if(n>=0 && (n<2 || str[n-1]!='e' || (str[n-2]!='.' && !isdigit(str[n-2]))))
-               return mglApplyOperC(str.substr(0,n),str.substr(n+1),arg, head, str[n]=='+'?addc:subc);
-       n=mglFindInText(str,"*/");                              // high priority -- multiplications
+               return str[n]=='+'? mglApplyOperAddC(str.substr(0,n),str.substr(n+1),arg, head) : mglApplyOperSubC(str.substr(0,n),str.substr(n+1),arg, head);
+       n=mglFindInText(str,"*/");      // high priority -- multiplications
        if(n>=0)
-               return mglApplyOperC(str.substr(0,n),str.substr(n+1),arg, head, str[n]=='*'?mulc:divc);
-/*     n=mglFindInText(str,"@");                               // high priority -- combine     // TODO enable later
+               return str[n]=='*'? mglApplyOperMulC(str.substr(0,n),str.substr(n+1),arg, head) : mglApplyOperDivC(str.substr(0,n),str.substr(n+1),arg, head);
+       n=mglFindInText(str,"@");       // high priority -- combine
        if(n>=0)
-               return mglFormulaCalcC(str.substr(0,n),arg, head).Combine(mglFormulaCalcC(str.substr(n+1),arg, head));*/
+       {
+               HADT a1 = mglFormulaCalcC(str.substr(0,n),arg, head);
+               HADT a2 = mglFormulaCalcC(str.substr(n+1),arg, head);
+               HADT res = mgl_datac_combine(a1,a2);
+               mgl_delete_datac(a1);   mgl_delete_datac(a2);
+               return res;
+       }
        n=mglFindInText(str,"^");                               // highest priority -- power
        if(n>=0)
                return mglApplyOperC(str.substr(0,n),str.substr(n+1),arg, head, ipwc);
        n=mglFindInText(str,":");                               // highest priority -- array
        if(n>=0 && str.compare(L":"))
        {
-               const mglData &a1=mglFormulaCalc(str.substr(0,n), arg, head);
-               const mglData &a2=mglFormulaCalc(str.substr(n+1), arg, head);
-               res.Create(abs(int(a2.a[0]+0.5)-int(a1.a[0]+0.5))+1);
-               res.Fill(a1.a[0], a2.a[0]);
+               HMDT a1=mglFormulaCalc(str.substr(0,n), arg, head);
+               HMDT a2=mglFormulaCalc(str.substr(n+1), arg, head);
+               HADT res = new mglDataC(abs(int(a2->a[0]+0.5)-int(a1->a[0]+0.5))+1);
+               res->Fill(a1->a[0], a2->a[0]);
+               mgl_delete_data(a1);    mgl_delete_data(a2);
                return res;
        }
        n=mglFindInText(str,".");                               // highest priority -- suffixes
-       if(n>=0)
+       wchar_t c0 = str[n+1];
+       if(n>=0  && c0>='a' && c0!='e')
        {
-               mreal x,y,z,k;
                dual v=NAN;
-               mglDataC d = mglFormulaCalcC(str.substr(0,n), arg, head);
+               HADT d = mglFormulaCalcC(str.substr(0,n), arg, head);
+               long ns[3] = {d->nx, d->ny, d->nz};
                const std::wstring &p=str.substr(n+1);
-               if(!p.compare(L"a"))                    v = d.a[0];
-               else if(!p.compare(L"fst"))     {       long i=-1,j=-1,l=-1;    v = d.Find(0,i,j,l);    }
-               else if(!p.compare(L"lst"))     {       long i=-1,j=-1,l=-1;    v = d.Last(0,i,j,l);    }
-               else if(!p.compare(L"nx"))      v=d.nx;
-               else if(!p.compare(L"ny"))      v=d.ny;
-               else if(!p.compare(L"nz"))      v=d.nz;
-               else if(!p.compare(L"max"))     v=d.Maximal();
-               else if(!p.compare(L"min"))     v=d.Minimal();
-               else if(!p.compare(L"pmax"))    {       v=d.Maximal();  }
-//             else if(!p.compare(L"pmin"))    {       v=d.MinimalPos();       }
-//             else if(!p.compare(L"nmax"))    {       v=d.MaximalNeg();       }
-               else if(!p.compare(L"nmin"))    {       v=0;    }
-               else if(!p.compare(L"sum"))     v=d.Momentum('x',x,y);
-               else if(!p.compare(L"mx"))      {       d.Maximal(x,y,z);       v=x/d.nx;       }
-               else if(!p.compare(L"my"))      {       d.Maximal(x,y,z);       v=y/d.ny;       }
-               else if(!p.compare(L"mz"))      {       d.Maximal(x,y,z);       v=z/d.nz;       }
-               else if(!p.compare(L"ax"))      {       d.Momentum('x',x,y);    v=x/d.nx;       }
-               else if(!p.compare(L"ay"))      {       d.Momentum('y',x,y);    v=x/d.ny;       }
-               else if(!p.compare(L"az"))      {       d.Momentum('z',x,y);    v=x/d.nz;       }
-               else if(!p.compare(L"wx"))      {       d.Momentum('x',x,y);    v=y/d.nx;       }
-               else if(!p.compare(L"wy"))      {       d.Momentum('y',x,y);    v=y/d.ny;       }
-               else if(!p.compare(L"wz"))      {       d.Momentum('z',x,y);    v=y/d.nz;       }
-               else if(!p.compare(L"sx"))      {       d.Momentum('x',x,y,z,k);        v=z/d.nx;       }
-               else if(!p.compare(L"sy"))      {       d.Momentum('y',x,y,z,k);        v=z/d.ny;       }
-               else if(!p.compare(L"sz"))      {       d.Momentum('z',x,y,z,k);        v=z/d.nz;       }
-               else if(!p.compare(L"kx"))      {       d.Momentum('x',x,y,z,k);        v=k/d.nx;       }
-               else if(!p.compare(L"ky"))      {       d.Momentum('y',x,y,z,k);        v=k/d.ny;       }
-               else if(!p.compare(L"kz"))      {       d.Momentum('z',x,y,z,k);        v=k/d.nz;       }
-               else if(!p.compare(L"aa"))      {       d.Momentum('a',x,y);    v=x;    }
-               else if(!p.compare(L"wa"))      {       d.Momentum('a',x,y);    v=y;    }
-               else if(!p.compare(L"sa"))      {       d.Momentum('a',x,y,z,k);v=z;    }
-               else if(!p.compare(L"ka"))      {       d.Momentum('a',x,y,z,k);v=k;    }
+               wchar_t ch = p[1];
+               if(c0=='a')
+               {
+                       if(ch==0)       v = d->a[0];
+                       else
+                       {
+                               mreal x,y;
+                               d->Momentum(ch,x,y);
+                               if(ch=='a')     v = x;
+                               else if(ch>='x' && ch<='z')     v = x/ns[ch-'x'];
+                       }
+               }
+               else if(c0=='n' && ch>='x' && ch<='z')  v = ns[ch-'x'];
+               else if(c0=='k')
+               {
+                       mreal x,y,z,k;
+                       d->Momentum(ch,x,y,z,k);
+                       if(ch=='a')     v = k;
+                       else if(ch>='x' && ch<='z')     v = k/ns[ch-'x'];
+               }
+               else if(c0=='w')
+               {
+                       mreal x,y;
+                       d->Momentum(ch,x,y);
+                       if(ch=='a')     v = y;
+                       else if(ch>='x' && ch<='z')     v = y/ns[ch-'x'];
+               }
+               else if(c0=='m')
+               {
+                       mreal x,y,z;
+                       if(ch=='a' && p[2]=='x')        v = d->Maximal();
+                       else if(ch=='i' && p[2]=='n')   v = d->Minimal();
+                       else if(ch=='x')        {       v = d->Maximal(x,y,z);  v = x/ns[0];    }
+                       else if(ch=='y')        {       v = d->Maximal(x,y,z);  v = y/ns[1];    }
+                       else if(ch=='z')        {       v = d->Maximal(x,y,z);  v = z/ns[2];    }
+               }
+               else if(c0=='s')
+               {
+                       mreal x,y,z,k;
+                       if(ch=='u' && p[2]=='m')        v = d->Momentum('x',x,y);
+                       else if(ch=='a')
+                       {       d->Momentum(ch,x,y,z,k);        v = z;  }
+                       else if(ch>='x' && ch<='z')
+                       {       d->Momentum(ch,x,y,z,k);        v = z/ns[ch-'x'];       }
+               }
+               else if(!p.compare(L"fst"))     {       long i=-1,j=-1,l=-1;    v = d->Find(0,i,j,l);   }
+               else if(!p.compare(L"lst"))     {       long i=-1,j=-1,l=-1;    v = d->Last(0,i,j,l);   }
+               delete d;
                // if this is valid suffix when finish parsing (it can be mreal number)
-               if(mgl_isfin(v))        {       res.a[0] = v;   return res;     }
+               if(mgl_isfin(v))
+               {       HADT res = new mglDataC;        res->a[0]=v;    return res;     }
        }
        for(n=0;n<len;n++)      if(str[n]=='(') break;
        if(n>=len)              // this is number or variable
        {
                HCDT v = (str!=L"#$mgl")?FindVar(head, str):0;
-               mglNum *f = arg?arg->FindNum(str.c_str()):0;
-               if(v)   res = v;
-               else if(f)      res.a[0] = f->d;
-               else if(!str.compare(L":"))             res.a[0] = -1;
-               else
+               if(v)   return new mglDataC(v);
+               const mglNum *f = arg?arg->FindNum(str.c_str()):0;
+               if(f)   {       HADT res = new mglDataC;        res->a[0] = f->c;       return res;     }
+               else if(!str.compare(L"rnd"))
                {
                        v=FindVar(head, L"#$mgl");
-                       if(v)   res.Create(v->GetNx(),v->GetNy(),v->GetNz());
-                       if(!str.compare(L"rnd"))        for(long i=0;i<res.GetNN();i++) res.a[i] = mgl_rnd();
-                       else if(!str.compare(L"nan"))   res = mreal(NAN);
-                       else if(!str.compare(L"inf"))   res = mreal(INFINITY);
-                       else if(!str.compare(L"pi"))    res = mreal(M_PI);
-                       else if(!str.compare(L"on"))    res = mreal(1.);
-                       else if(!str.compare(L"off"))   res = mreal(0.);
-/*                     else if(!str.compare(L"t"))     res.Fill(0,1,'x');
-                       else if(!str.compare(L"x") && arg && arg->curGr)
-                               res.Fill(arg->curGr->Min.x, arg->curGr->Max.x,'x');
-                       else if(!str.compare(L"y") && arg && arg->curGr)
-                               res.Fill(arg->curGr->Min.x, arg->curGr->Max.x,res.ny>1?'y':'x');
-                       else if(!str.compare(L"z") && arg && arg->curGr)
-                               res.Fill(arg->curGr->Min.x, arg->curGr->Max.x,res.nz>1?'z':'x');*/
-                       else if(str[0]=='i')    // this is imaginary number
-                               res = dual(0,(str.length()>1 && str[1]>' ')?wcstod(str.c_str(),0):1);
-                       else res = mreal(wcstod(str.c_str(),0));        // this is real number
+                       HADT res = v?new mglDataC(v->GetNx(),v->GetNy(),v->GetNz()) : new mglDataC;
+                       for(long i=0;i<res->GetNN();i++)
+                               res->a[i] = dual(mgl_rnd(), mgl_rnd());
+                       return res;
+               }
+               else
+               {
+                       HADT res = new mglDataC;
+                       char ch = str[0];
+                       if(ch<':')      // this is real number
+                               res->a[0] = (str[str.length()-1]=='i') ? dual(0,wcstod(str.c_str(),0)) :  mreal(wcstod(str.c_str(),0));
+                       else if(ch=='i')        // this is imaginary number
+                               res->a[0] = dual(0,str[1]>' '?wcstod(str.c_str()+1,0):1);
+                       else if(!str.compare(L"pi"))    res->a[0] = M_PI;
+                       else if(ch==':')        res->a[0] = -1;
+                       else if(!str.compare(L"nan"))   res->a[0] = NAN;
+                       else if(!str.compare(L"inf"))   res->a[0] = INFINITY;
+                       return res;
                }
-               return res;
        }
        else
        {
@@ -856,98 +928,83 @@ mglDataC MGL_NO_EXPORT mglFormulaCalcC(std::wstring str, mglParser *arg, const s
                HCDT v = FindVar(head, nm);
 //             mglVar *v = arg->FindVar(nm.c_str());
                if(!v && !nm.compare(0,7,L"jacobi_"))   nm = nm.substr(7);
+               n = mglFindInText(str,",");
                if(v)   // subdata
                {
                        if(str[0]=='\'' && str[len-1]=='\'')    // this is column call
                        {
                                char *buf = new char[len];
                                mgl_wcstombs(buf, str.substr(1).c_str(), len-1);        buf[len-1]=0;
-                               const mglData *vd = dynamic_cast<const mglData *>(v);
-                               if(vd)  res=vd->Column(buf);
-                               const mglDataC *vc = dynamic_cast<const mglDataC *>(v);
-                               if(vc)  res=vc->Column(buf);
-                               delete []buf;
+                               HADT res = mgl_datac_column(v,buf);
+                               delete []buf;   return res;
                        }
                        else
                        {
-                               mglData a1, a2, a3;
-                               a1.a[0] = a2.a[0] = a3.a[0] = -1;
-                               n=mglFindInText(str,",");
+                               HMDT a1=0, a2=0, a3=0;
                                if(n>0)
                                {
                                        long m=mglFindInText(str.substr(0,n),",");
                                        if(m>0)
                                        {
                                                str[m]=0;
-                                               a1 = mglFormulaCalcC(str.substr(0,m), arg, head);
-                                               a2 = mglFormulaCalcC(str.substr(m+1,n-m-1), arg, head);
-                                               a3 = mglFormulaCalcC(str.substr(n+1), arg, head);
+                                               a1 = mglFormulaCalc(str.substr(0,m), arg, head);
+                                               a2 = mglFormulaCalc(str.substr(m+1,n-m-1), arg, head);
+                                               a3 = mglFormulaCalc(str.substr(n+1), arg, head);
                                        }
                                        else
                                        {
-                                               a1 = mglFormulaCalcC(str.substr(0,n), arg, head);
-                                               a2 = mglFormulaCalcC(str.substr(n+1), arg, head);
+                                               a1 = mglFormulaCalc(str.substr(0,n), arg, head);
+                                               a2 = mglFormulaCalc(str.substr(n+1), arg, head);
                                        }
                                }
-                               else    a1 = mglFormulaCalcC(str, arg, head);
-                               res = mglSubData(*v,a1,a2,a3);
+                               else    a1 = mglFormulaCalc(str, arg, head);
+                               HADT res = mgl_datac_subdata_ext(v,a1,a2,a3);
+                               mgl_delete_data(a1);    mgl_delete_data(a2);
+                               mgl_delete_data(a3);    return res;
                        }
                }
                else if(nm[0]=='a')     // function
                {
-                       if(!nm.compare(L"asin"))
-                       {       res=mglFormulaCalcC(str, arg, head);    mglApplyFuncC(res,asinc);       }
-                       else if(!nm.compare(L"acos"))
-                       {       res=mglFormulaCalcC(str, arg, head);    mglApplyFuncC(res,acosc);       }
-                       else if(!nm.compare(L"atan"))
-                       {       res=mglFormulaCalcC(str, arg, head);    mglApplyFuncC(res,atanc);       }
-                       else if(!nm.compare(L"arg"))
-                       {       res=mglFormulaCalcC(str, arg, head);    mglApplyFuncC(res,argc);        }
-                       else if(!nm.compare(L"abs"))
-                       {       res=mglFormulaCalcC(str, arg, head);    mglApplyFuncC(res,absc);        }
+                       if(!nm.compare(L"asin"))        return mglApplyFuncC(str, arg, head, asinc);
+                       else if(!nm.compare(L"acos"))   return mglApplyFuncC(str, arg, head, acosc);
+                       else if(!nm.compare(L"atan"))   return mglApplyFuncC(str, arg, head, atanc);
+                       else if(!nm.compare(L"asinh"))  return mglApplyFuncC(str, arg, head, asinhc);
+                       else if(!nm.compare(L"acosh"))  return mglApplyFuncC(str, arg, head, acoshc);
+                       else if(!nm.compare(L"atanh"))  return mglApplyFuncC(str, arg, head, atanhc);
+                       else if(!nm.compare(L"arg"))    return mglApplyFuncC(str, arg, head, argc);
+                       else if(!nm.compare(L"abs"))            return mglApplyFuncC(str, arg, head, absc);
                }
                else if(nm[0]=='c')
                {
-                       if(!nm.compare(L"cos"))
-                       {       res=mglFormulaCalcC(str, arg, head);    mglApplyFuncC(res,cosc);        }
-                       else if(!nm.compare(L"cosh") || !nm.compare(L"ch"))
-                       {       res=mglFormulaCalcC(str, arg, head);    mglApplyFuncC(res,coshc);       }
+                       if(!nm.compare(L"cos")) return mglApplyFuncC(str, arg, head, cosc);
+                       else if(!nm.compare(L"cosh") || !nm.compare(L"ch"))     return mglApplyFuncC(str, arg, head, coshc);
+                       else if(!nm.compare(L"conj"))   return mglApplyFuncC(str, arg, head, conjc);
                }
-               else if(!nm.compare(L"exp"))
-               {       res=mglFormulaCalcC(str, arg, head);    mglApplyFuncC(res,expc);        }
+               else if(!nm.compare(L"exp"))    return mglApplyFuncC(str, arg, head, expc);
                else if(nm[0]=='l')
                {
-                       if(!nm.compare(L"log") || !nm.compare(L"ln"))
-                       {       res=mglFormulaCalcC(str, arg, head);    mglApplyFuncC(res,logc);        }
-                       else if(!nm.compare(L"lg"))
-                       {       res=mglFormulaCalcC(str, arg, head);    mglApplyFuncC(res,lgc); }
+                       if(!nm.compare(L"log") || !nm.compare(L"ln"))   return mglApplyFuncC(str, arg, head, logc);
+                       else if(!nm.compare(L"lg"))     return mglApplyFuncC(str, arg, head, lgc);
                }
                else if(nm[0]=='s')
                {
-                       if(!nm.compare(L"sqrt"))
-                       {       res=mglFormulaCalcC(str, arg, head);    mglApplyFuncC(res,sqrtc);       }
-                       else if(!nm.compare(L"sin"))
-                       {       res=mglFormulaCalcC(str, arg, head);    mglApplyFuncC(res,sinc);        }
-                       else if(!nm.compare(L"sinh") || !nm.compare(L"sh"))
-                       {       res=mglFormulaCalcC(str, arg, head);    mglApplyFuncC(res,sinhc);       }
+                       if(!nm.compare(L"sqrt"))        return mglApplyFuncC(str, arg, head, sqrtc);
+                       else if(!nm.compare(L"sin"))    return mglApplyFuncC(str, arg, head, sinc);
+                       else if(!nm.compare(L"sinh") || !nm.compare(L"sh"))     return mglApplyFuncC(str, arg, head, sinhc);
                }
                else if(nm[0]=='t')
                {
-                       if(!nm.compare(L"tg") || !nm.compare(L"tan"))
-                       {       res=mglFormulaCalcC(str, arg, head);    mglApplyFuncC(res,tanc);        }
-                       else if(!nm.compare(L"tanh") || !nm.compare(L"th"))
-                       {       res=mglFormulaCalcC(str, arg, head);    mglApplyFuncC(res,tanhc);       }
-               }
-               else if(!nm.compare(L"pow"))
-               {
-                       n=mglFindInText(str,",");
-                       if(n<=0)        mglFormulaError=true;
-                       else    res = mglApplyOperC(str.substr(0,n),str.substr(n+1),arg, head, powc);
+                       if(!nm.compare(L"tg") || !nm.compare(L"tan"))   return mglApplyFuncC(str, arg, head, tanc);
+                       else if(!nm.compare(L"tanh") || !nm.compare(L"th"))     return mglApplyFuncC(str, arg, head, tanhc);
                }
+               else if(!nm.compare(L"pow") && n>0)
+                       return mglApplyOperC(str.substr(0,n),str.substr(n+1),arg, head, powc);
                else if(!nm.compare(L"random"))
-               {       res=mglFormulaCalcC(str, arg, head);    register long n = res.GetNN(), i;
-                       for(i=0;i<n;i++)        res.a[i] = mgl_rnd();   }
+               {       HADT res=mglFormulaCalcC(str, arg, head);       dual *a = res->a;
+                       for(long i=0;i<res->GetNN();i++)        a[i] = dual(mgl_rnd(), mgl_rnd());      return res;     }
+               else if(!nm.compare(L"real"))   return mglApplyFuncC(str, arg, head, realc);
+               else if(!nm.compare(L"imag"))   return mglApplyFuncC(str, arg, head, imagc);
        }
-       return res;
+       HADT res = new mglDataC;        res->a[0]=NAN;  return res;
 }
 //-----------------------------------------------------------------------------
index e91e1ac4050bbd8b2c576a48cb2fda8ea9f074c8..98e8b0a3d1757d1c3b1e354a414f57de19be0002 100644 (file)
@@ -26,7 +26,6 @@
 
 #include "mgl2/base.h"
 #include "mgl2/parser.h"
-inline long iint(mreal x)      {return long(x+0.5);}
 wchar_t *mgl_str_copy(const char *s);
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_addlegend(mglGraph *gr, long , mglArg *a, const char *k, const char *)
@@ -39,27 +38,30 @@ int MGL_NO_EXPORT mgls_addlegend(mglGraph *gr, long , mglArg *a, const char *k,
 int MGL_NO_EXPORT mgls_addto(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dd"))             *d += *(a[1].d);
-       else if(!strcmp(k,"dn"))*d += a[1].v;
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"dd"))                *d += *(a[1].d);
+       else if(d && !strcmp(k,"dn"))   *d += a[1].v;
+       else if(c && !strcmp(k,"dd"))   *c += *(a[1].d);
+       else if(c && !strcmp(k,"dn"))   *c += a[1].c;
        else    res = 1;        return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_sort(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dn"))     d->Sort(a[1].v, -1);
-       else if(!strcmp(k,"dnn"))       d->Sort(a[1].v, a[2].v);
+       if(d && !strcmp(k,"dn"))        d->Sort(a[1].v, -1);
+       else if(d && !strcmp(k,"dnn"))  d->Sort(a[1].v, a[2].v);
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_alpha(mglGraph *gr, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
-       if(!strcmp(k,""))       gr->Alpha(true);
+       if(k[0]==0)     gr->Alpha(true);
        else if(!strcmp(k,"n")) gr->Alpha(a[0].v!=0);
        else res = 1;   return res;
 }
@@ -76,7 +78,7 @@ int MGL_NO_EXPORT mgls_mask(mglGraph *gr, long , mglArg *a, const char *k, const
        int res=0;
        if(!strcmp(k,"sn"))     gr->SetMask(a[0].s[0],a[1].v);
        else if(!strcmp(k,"ss"))        gr->SetMask(a[0].s[0],a[1].s.c_str());
-       else if(!strcmp(k,"n"))         gr->SetMaskAngle(iint(a[0].v));
+       else if(!strcmp(k,"n"))         gr->SetMaskAngle(mgl_int(a[0].v));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -134,12 +136,14 @@ int MGL_NO_EXPORT mgls_axial(mglGraph *gr, long , mglArg *a, const char *k, cons
 int MGL_NO_EXPORT mgls_axis(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
 {
        int res=0;
-       if(!strcmp(k,""))       gr->Axis("xyz","",opt);
+       if(k[0]==0)     gr->Axis("xyz","",opt);
        else if(!strcmp(k,"s"))         gr->Axis(a[0].s.c_str(), "",opt);
        else if(!strcmp(k,"ss"))        gr->Axis(a[0].s.c_str(), a[1].s.c_str(),opt);
        else if(!strcmp(k,"sss"))       gr->SetFunc(a[0].s.c_str(),a[1].s.c_str(),a[2].s.c_str(),"");
        else if(!strcmp(k,"ssss"))      gr->SetFunc(a[0].s.c_str(),a[1].s.c_str(),a[2].s.c_str(),a[3].s.c_str());
-       else if(!strcmp(k,"n"))         gr->SetCoor(iint(a[0].v));
+       else if(!strcmp(k,"n"))         gr->SetCoor(mgl_int(a[0].v));
+       else if(!strcmp(k,"nnnn"))      gr->SetRanges(a[0].v,a[2].v, a[1].v,a[3].v);
+       else if(!strcmp(k,"nnnnnn"))gr->SetRanges(a[0].v,a[3].v, a[1].v,a[4].v, a[2].v,a[5].v);
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -156,7 +160,7 @@ int MGL_NO_EXPORT mgls_ball(mglGraph *gr, long , mglArg *a, const char *k, const
 int MGL_NO_EXPORT mgls_box(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
 {
        int res=0;      gr->Self()->SaveState(opt);
-       if(!strcmp(k,""))       gr->Box();
+       if(k[0]==0)     gr->Box();
        else if(!strcmp(k,"s"))         gr->Box(a[0].s.c_str());
        else if(!strcmp(k,"sn"))        gr->Box(a[0].s.c_str(), a[1].v);
        else res = 1;   gr->Self()->LoadState();        return res;
@@ -234,22 +238,22 @@ int MGL_NO_EXPORT mgls_beam(mglGraph *gr, long , mglArg *a, const char *k, const
        else if(!strcmp(k,"ddddns"))
                gr->Beam(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].v,a[5].s.c_str(),0, 3);
        else if(!strcmp(k,"ddddnsn"))
-               gr->Beam(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].v,a[5].s.c_str(),iint(a[6].v), 3);
+               gr->Beam(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].v,a[5].s.c_str(),mgl_int(a[6].v), 3);
        else if(!strcmp(k,"ddddnsnn"))
-               gr->Beam(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].v,a[5].s.c_str(),iint(a[6].v), iint(a[7].v));
+               gr->Beam(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].v,a[5].s.c_str(),mgl_int(a[6].v), mgl_int(a[7].v));
        else if(!strcmp(k,"nddddn"))
                gr->Beam(a[0].v,*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[5].v,"",0);
        else if(!strcmp(k,"nddddns"))
                gr->Beam(a[0].v,*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[5].v,a[6].s.c_str(),0);
        else if(!strcmp(k,"nddddnsn"))
-               gr->Beam(a[0].v,*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[5].v,a[6].s.c_str(),iint(a[7].v));
+               gr->Beam(a[0].v,*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[5].v,a[6].s.c_str(),mgl_int(a[7].v));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_clearlegend(mglGraph *gr, long , mglArg *, const char *k, const char *)
 {
        int res=0;
-       if(!strcmp(k,""))       gr->ClearLegend();
+       if(k[0]==0)     gr->ClearLegend();
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -269,7 +273,7 @@ int MGL_NO_EXPORT mgls_background(mglGraph *gr, long , mglArg *a, const char *k,
 int MGL_NO_EXPORT mgls_clf(mglGraph *gr, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
-       if(!strcmp(k,""))       gr->Clf();
+       if(k[0]==0)     gr->Clf();
        else if(!strcmp(k,"s")) gr->Clf(a[0].s.c_str());
        else if(!strcmp(k,"nnn"))       gr->Clf(a[0].v,a[1].v,a[2].v);
        else res = 1;   return res;
@@ -278,7 +282,7 @@ int MGL_NO_EXPORT mgls_clf(mglGraph *gr, long , mglArg *a, const char *k, const
 int MGL_NO_EXPORT mgls_reset(mglGraph *gr, long , mglArg *, const char *k, const char *)
 {
        int res=0;
-       if(!strcmp(k,""))       gr->DefaultPlotParam();
+       if(k[0]==0)     gr->DefaultPlotParam();
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -317,27 +321,31 @@ int MGL_NO_EXPORT mgls_crange(mglGraph *gr, long , mglArg *a, const char *k, con
 int MGL_NO_EXPORT mgls_crop(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dnns"))   d->Crop(iint(a[1].v),iint(a[2].v),a[3].s.c_str()[0]);
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"dnns"))      d->Crop(mgl_int(a[1].v),mgl_int(a[2].v),a[3].s.c_str()[0]);
+       else if(c && !strcmp(k,"dnns")) c->Crop(mgl_int(a[1].v),mgl_int(a[2].v),a[3].s.c_str()[0]);
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_clean(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dn"))     d->Clean(iint(a[1].v));
+       if(d && !strcmp(k,"dn"))        d->Clean(mgl_int(a[1].v));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_cumsum(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"ds"))     d->CumSum(a[1].s.c_str());
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"ds"))        d->CumSum(a[1].s.c_str());
+       else if(c && !strcmp(k,"ds"))   c->CumSum(a[1].s.c_str());
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -388,7 +396,7 @@ int MGL_NO_EXPORT mgls_crust(mglGraph *gr, long , mglArg *a, const char *k, cons
 int MGL_NO_EXPORT mgls_colorbar(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
 {
        int res=0;      gr->Self()->SaveState(opt);
-       if(!strcmp(k,""))       gr->Colorbar();
+       if(k[0]==0)     gr->Colorbar();
        else if(!strcmp(k,"s"))         gr->Colorbar(a[0].s.c_str());
        else if(!strcmp(k,"d"))         gr->Colorbar(*(a[0].d));
        else if(!strcmp(k,"ds"))        gr->Colorbar(*(a[0].d), a[1].s.c_str());
@@ -405,11 +413,21 @@ int MGL_NO_EXPORT mgls_colorbar(mglGraph *gr, long , mglArg *a, const char *k, c
 int MGL_NO_EXPORT mgls_copy(mglGraph *gr, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dd"))     d->Set(*(a[1].d));
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(c && !strcmp(k,"dd"))        c->Set(a[1].d);
+       else if(!d)     return 1;
+       else if(!strcmp(k,"dd"))        d->Set(a[1].d);
        else if(!strcmp(k,"dds"))
-       {       d->Set(*(a[1].d));      gr->Fill(*d, a[2].s.c_str());   }
+       {       d->Set(a[1].d); gr->Fill(*d, a[2].s.c_str());   }
+       else if(!strcmp(k,"ddd"))
+       {
+               mglData *D = dynamic_cast<mglData *>(a[1].d);
+               mglDataC *C = dynamic_cast<mglDataC *>(a[2].d);
+               if(D && C)      {       d->Set(C->Real());      D->Set(C->Imag());      }
+               else    res = 1;                
+       }
        else if(!strcmp(k,"dn"))        *d = a[1].v;
        else res = 1;   return res;
 }
@@ -475,16 +493,16 @@ int MGL_NO_EXPORT mgls_cont3(mglGraph *gr, long , mglArg *a, const char *k, cons
        int res=0;
        if(!strcmp(k,"d"))      gr->Cont3(*(a[0].d), "", -1,opt);
        else if(!strcmp(k,"ds"))        gr->Cont3(*(a[0].d), a[1].s.c_str(), -1,opt);
-       else if(!strcmp(k,"dsn"))       gr->Cont3(*(a[0].d), a[1].s.c_str(), iint(a[2].v),opt);
+       else if(!strcmp(k,"dsn"))       gr->Cont3(*(a[0].d), a[1].s.c_str(), mgl_int(a[2].v),opt);
        else if(!strcmp(k,"dd"))        gr->Cont3(*(a[0].d), *(a[1].d), "", -1,opt);
        else if(!strcmp(k,"dds"))       gr->Cont3(*(a[0].d), *(a[1].d), a[2].s.c_str(),-1,opt);
-       else if(!strcmp(k,"ddsn"))      gr->Cont3(*(a[0].d), *(a[1].d), a[2].s.c_str(),iint(a[3].v),opt);
+       else if(!strcmp(k,"ddsn"))      gr->Cont3(*(a[0].d), *(a[1].d), a[2].s.c_str(),mgl_int(a[3].v),opt);
        else if(!strcmp(k,"dddd"))      gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), "", -1,opt);
        else if(!strcmp(k,"dddds"))     gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(),-1,opt);
-       else if(!strcmp(k,"ddddsn"))    gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(),iint(a[5].v),opt);
+       else if(!strcmp(k,"ddddsn"))    gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(),mgl_int(a[5].v),opt);
        else if(!strcmp(k,"ddddd"))     gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), "", -1,opt);
        else if(!strcmp(k,"ddddds"))    gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(),-1,opt);
-       else if(!strcmp(k,"dddddsn"))gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(),iint(a[6].v),opt);
+       else if(!strcmp(k,"dddddsn"))gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(),mgl_int(a[6].v),opt);
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -493,16 +511,16 @@ int MGL_NO_EXPORT mgls_contf3(mglGraph *gr, long , mglArg *a, const char *k, con
        int res=0;
        if(!strcmp(k,"d"))      gr->ContF3(*(a[0].d), "", -1,opt);
        else if(!strcmp(k,"ds"))        gr->ContF3(*(a[0].d), a[1].s.c_str(), -1,opt);
-       else if(!strcmp(k,"dsn"))       gr->ContF3(*(a[0].d), a[1].s.c_str(), iint(a[2].v),opt);
+       else if(!strcmp(k,"dsn"))       gr->ContF3(*(a[0].d), a[1].s.c_str(), mgl_int(a[2].v),opt);
        else if(!strcmp(k,"dd"))        gr->ContF3(*(a[0].d), *(a[1].d), "", -1,opt);
        else if(!strcmp(k,"dds"))       gr->ContF3(*(a[0].d), *(a[1].d), a[2].s.c_str(),-1,opt);
-       else if(!strcmp(k,"ddsn"))      gr->ContF3(*(a[0].d), *(a[1].d), a[2].s.c_str(),iint(a[3].v),opt);
+       else if(!strcmp(k,"ddsn"))      gr->ContF3(*(a[0].d), *(a[1].d), a[2].s.c_str(),mgl_int(a[3].v),opt);
        else if(!strcmp(k,"dddd"))      gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), "", -1,opt);
        else if(!strcmp(k,"dddds"))     gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(),-1,opt);
-       else if(!strcmp(k,"ddddsn"))    gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(),iint(a[5].v),opt);
+       else if(!strcmp(k,"ddddsn"))    gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(),mgl_int(a[5].v),opt);
        else if(!strcmp(k,"ddddd"))     gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), "", -1,opt);
        else if(!strcmp(k,"ddddds"))    gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(),-1,opt);
-       else if(!strcmp(k,"dddddsn"))gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(),iint(a[6].v),opt);
+       else if(!strcmp(k,"dddddsn"))gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(),mgl_int(a[6].v),opt);
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -612,13 +630,13 @@ int MGL_NO_EXPORT mgls_polygon(mglGraph *gr, long , mglArg *a, const char *k, co
 {
        int res=0;      gr->Self()->SaveState(opt);
        if(!strcmp(k,"nnnnn"))
-               gr->Polygon(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN), iint(a[4].v));
+               gr->Polygon(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN), mgl_int(a[4].v));
        else if(!strcmp(k,"nnnnns"))
-               gr->Polygon(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN), iint(a[4].v), a[5].s.c_str());
+               gr->Polygon(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN), mgl_int(a[4].v), a[5].s.c_str());
        else if(!strcmp(k,"nnnnnnn"))
-               gr->Polygon(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), iint(a[6].v));
+               gr->Polygon(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), mgl_int(a[6].v));
        else if(!strcmp(k,"nnnnnnns"))
-               gr->Polygon(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), iint(a[6].v), a[7].s.c_str());
+               gr->Polygon(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), mgl_int(a[6].v), a[7].s.c_str());
        else res = 1;   gr->Self()->LoadState();        return res;
 }
 //-----------------------------------------------------------------------------
@@ -655,10 +673,10 @@ int MGL_NO_EXPORT mgls_dens3(mglGraph *gr, long , mglArg *a, const char *k, cons
        int res=0;
        if(!strcmp(k,"d"))      gr->Dens3(*(a[0].d),"",-1,opt);
        else if(!strcmp(k,"ds"))        gr->Dens3(*(a[0].d),a[1].s.c_str(),-1,opt);
-       else if(!strcmp(k,"dsn"))       gr->Dens3(*(a[0].d),a[1].s.c_str(),iint(a[2].v),opt);
+       else if(!strcmp(k,"dsn"))       gr->Dens3(*(a[0].d),a[1].s.c_str(),mgl_int(a[2].v),opt);
        else if(!strcmp(k,"dddd"))      gr->Dens3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"", -1,opt);
        else if(!strcmp(k,"dddds"))     gr->Dens3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),-1,opt);
-       else if(!strcmp(k,"ddddsn"))    gr->Dens3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),iint(a[5].v),opt);
+       else if(!strcmp(k,"ddddsn"))    gr->Dens3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),mgl_int(a[5].v),opt);
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -692,30 +710,39 @@ int MGL_NO_EXPORT mgls_densz(mglGraph *gr, long , mglArg *a, const char *k, cons
 int MGL_NO_EXPORT mgls_divto(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dd"))             *d /= *(a[1].d);
-       else if(!strcmp(k,"dn"))        *d /= a[1].v;
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"dd"))                *d /= *(a[1].d);
+       else if(d && !strcmp(k,"dn"))   *d /= a[1].v;
+       else if(c && !strcmp(k,"dd"))   *c /= *(a[1].d);
+       else if(c && !strcmp(k,"dn"))   *c /= a[1].c;
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_multo(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dd"))             *d *= *(a[1].d);
-       else if(!strcmp(k,"dn"))        *d *= a[1].v;
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"dd"))                *d *= *(a[1].d);
+       else if(d && !strcmp(k,"dn"))   *d *= a[1].v;
+       else if(c && !strcmp(k,"dd"))   *c *= *(a[1].d);
+       else if(c && !strcmp(k,"dn"))   *c *= a[1].c;
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_subto(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dd"))             *d -= *(a[1].d);
-       else if(!strcmp(k,"dn"))        *d -= a[1].v;
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"dd"))                *d -= *(a[1].d);
+       else if(d && !strcmp(k,"dn"))   *d -= a[1].v;
+       else if(c && !strcmp(k,"dd"))   *c -= *(a[1].d);
+       else if(c && !strcmp(k,"dn"))   *c -= a[1].c;
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -734,20 +761,26 @@ int MGL_NO_EXPORT mgls_dots(mglGraph *gr, long , mglArg *a, const char *k, const
 int MGL_NO_EXPORT mgls_diff(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"ds"))     d->Diff(a[1].s.c_str());
-       else if(!strcmp(k,"ddd"))       d->Diff(*(a[1].d), *(a[2].d));
-       else if(!strcmp(k,"dddd"))      d->Diff(*(a[1].d), *(a[2].d), *(a[3].d));
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"ds"))        d->Diff(a[1].s.c_str());
+       else if(d && !strcmp(k,"ddd"))  d->Diff(*(a[1].d), *(a[2].d));
+       else if(d && !strcmp(k,"dddd")) d->Diff(*(a[1].d), *(a[2].d), *(a[3].d));
+       else if(c && !strcmp(k,"ds"))   c->Diff(a[1].s.c_str());
+//     else if(c && !strcmp(k,"ddd"))  c->Diff(*(a[1].d), *(a[2].d));  // TODO Add later
+//     else if(c && !strcmp(k,"dddd")) c->Diff(*(a[1].d), *(a[2].d), *(a[3].d));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_diff2(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"ds"))     d->Diff2(a[1].s.c_str());
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"ds"))        d->Diff2(a[1].s.c_str());
+       else if(c && !strcmp(k,"ds"))   c->Diff2(a[1].s.c_str());
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -833,6 +866,16 @@ int MGL_NO_EXPORT mgls_surfa(mglGraph *gr, long , mglArg *a, const char *k, cons
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
+int MGL_NO_EXPORT mgls_surfca(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
+{
+       int res=0;
+       if(!strcmp(k,"ddd"))    gr->SurfCA(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
+       else if(!strcmp(k,"ddds"))      gr->SurfCA(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
+       else if(!strcmp(k,"ddddd"))     gr->SurfCA(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),"",opt);
+       else if(!strcmp(k,"ddddds"))gr->SurfCA(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[5].s.c_str(),opt);
+       else res = 1;   return res;
+}
+//-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_flow(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
 {
        int res=0;
@@ -881,45 +924,76 @@ int MGL_NO_EXPORT mgls_grad(mglGraph *gr, long , mglArg *a, const char *k, const
 int MGL_NO_EXPORT mgls_fill(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dnn"))    d->Fill(a[1].v,a[2].v);
-       else if(!strcmp(k,"dnns"))      d->Fill(a[1].v,a[2].v,a[3].s.c_str()[0]);
-       else if(!strcmp(k,"ds"))        gr->Fill(*d,a[1].s.c_str(),opt);
-       else if(!strcmp(k,"dsd"))       gr->Fill(*d,a[1].s.c_str(), *(a[2].d),opt);
-       else if(!strcmp(k,"dsdd"))      gr->Fill(*d,a[1].s.c_str(), *(a[2].d), *(a[3].d),opt);
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && k[0]=='d')
+       {
+               if(!strcmp(k,"dnn"))    d->Fill(a[1].v,a[2].v);
+               else if(!strcmp(k,"dnns"))      d->Fill(a[1].v,a[2].v,a[3].s.c_str()[0]);
+               else if(!strcmp(k,"ds"))        gr->Fill(*d,a[1].s.c_str(),opt);
+               else if(!strcmp(k,"dsd"))       gr->Fill(*d,a[1].s.c_str(), *(a[2].d),opt);
+               else if(!strcmp(k,"dsdd"))      gr->Fill(*d,a[1].s.c_str(), *(a[2].d), *(a[3].d),opt);
+               else res = 1;
+       }
+       else if(c && k[0]=='d')
+       {
+               if(!strcmp(k,"dnn"))    c->Fill(a[1].v,a[2].v);
+               else if(!strcmp(k,"dnns"))      c->Fill(a[1].v,a[2].v,a[3].s.c_str()[0]);
+               else if(!strcmp(k,"ds"))        gr->Fill(*c,a[1].s.c_str(),opt);
+               else if(!strcmp(k,"dsd"))       gr->Fill(*c,a[1].s.c_str(), *(a[2].d),opt);
+               else if(!strcmp(k,"dsdd"))      gr->Fill(*c,a[1].s.c_str(), *(a[2].d), *(a[3].d),opt);
+               else res = 1;
+       }
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_refill(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"ddd"))    gr->Refill(*d,*(a[1].d),*(a[2].d),-1,opt);
-       else if(!strcmp(k,"dddn"))      gr->Refill(*d,*(a[1].d),*(a[2].d),iint(a[3].v),opt);
-       else if(!strcmp(k,"dddd"))      gr->Refill(*d,*(a[1].d),*(a[2].d),*(a[3].d),-1,opt);
-       else if(!strcmp(k,"ddddn"))     gr->Refill(*d,*(a[1].d),*(a[2].d),*(a[3].d),iint(a[4].v),opt);
-       else if(!strcmp(k,"ddddd"))     gr->Refill(*d,*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),opt);
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && k[0]=='d' && k[1]=='d' && k[2]=='d')
+       {
+               if(k[3]==0)     gr->Refill(*d,*(a[1].d),*(a[2].d),-1,opt);
+               else if(!strcmp(k+3,"n"))       gr->Refill(*d,*(a[1].d),*(a[2].d),mgl_int(a[3].v),opt);
+               else if(!strcmp(k+3,"d"))       gr->Refill(*d,*(a[1].d),*(a[2].d),*(a[3].d),-1,opt);
+               else if(!strcmp(k+3,"dn"))      gr->Refill(*d,*(a[1].d),*(a[2].d),*(a[3].d),mgl_int(a[4].v),opt);
+               else if(!strcmp(k+3,"dd"))      gr->Refill(*d,*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),opt);
+               else res = 1;
+       }
+       else if(c && k[0]=='d' && k[1]=='d' && k[2]=='d')
+       {
+               if(k[3]==0)     gr->Refill(*c,*(a[1].d),*(a[2].d),-1,opt);
+               else if(!strcmp(k+3,"n"))       gr->Refill(*c,*(a[1].d),*(a[2].d),mgl_int(a[3].v),opt);
+               else if(!strcmp(k+3,"d"))       gr->Refill(*c,*(a[1].d),*(a[2].d),*(a[3].d),-1,opt);
+               else if(!strcmp(k+3,"dn"))      gr->Refill(*c,*(a[1].d),*(a[2].d),*(a[3].d),mgl_int(a[4].v),opt);
+               else if(!strcmp(k+3,"dd"))      gr->Refill(*c,*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),opt);
+               else res = 1;
+       }
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_gspline(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"ddd"))    d->RefillGS(*(a[1].d),*(a[2].d),gr->Self()->Min.x,gr->Self()->Max.x,-1);
-       else if(!strcmp(k,"dddn"))      d->RefillGS(*(a[1].d),*(a[2].d),gr->Self()->Min.x,gr->Self()->Max.x,iint(a[3].v));
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"ddd"))       d->RefillGS(*(a[1].d),*(a[2].d),gr->Self()->Min.x,gr->Self()->Max.x,-1);
+       else if(d && !strcmp(k,"dddn")) d->RefillGS(*(a[1].d),*(a[2].d),gr->Self()->Min.x,gr->Self()->Max.x,mgl_int(a[3].v));
+       else if(c && !strcmp(k,"ddd"))  c->RefillGS(*(a[1].d),*(a[2].d),gr->Self()->Min.x,gr->Self()->Max.x,-1);
+       else if(c && !strcmp(k,"dddn")) c->RefillGS(*(a[1].d),*(a[2].d),gr->Self()->Min.x,gr->Self()->Max.x,mgl_int(a[3].v));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_fillsample(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"ds"))     d->FillSample(a[1].s.c_str());
+       if(d && !strcmp(k,"ds"))        d->FillSample(a[1].s.c_str());
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -943,7 +1017,7 @@ int MGL_NO_EXPORT mgls_font(mglGraph *gr, long , mglArg *a, const char *k, const
 int MGL_NO_EXPORT mgls_loadfont(mglGraph *gr, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
-       if(!strcmp(k,"") || (!strcmp(k,"s") && a[0].s[0]==0))   gr->RestoreFont();
+       if(k[0]==0 || (!strcmp(k,"s") && a[0].s[0]==0)) gr->RestoreFont();
        else if(!strcmp(k,"s")) gr->LoadFont(a[0].s.c_str());
        else res = 1;   return res;
 }
@@ -951,7 +1025,7 @@ int MGL_NO_EXPORT mgls_loadfont(mglGraph *gr, long , mglArg *a, const char *k, c
 int MGL_NO_EXPORT mgls_grid(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
 {
        int res=0;
-       if(!strcmp(k,""))       gr->Grid("xyzt", "B",opt);
+       if(k[0]==0)     gr->Grid("xyzt", "B",opt);
        else if(!strcmp(k,"s")) gr->Grid(a[0].s.c_str(), "B",opt);
        else if(!strcmp(k,"ss"))gr->Grid(a[0].s.c_str(), a[1].s.c_str(),opt);
        else res = 1;   return res;
@@ -972,35 +1046,42 @@ int MGL_NO_EXPORT mgls_grid3(mglGraph *gr, long , mglArg *a, const char *k, cons
        int res=0;
        if(!strcmp(k,"d"))      gr->Grid3(*(a[0].d),"",-1,opt);
        else if(!strcmp(k,"ds"))        gr->Grid3(*(a[0].d),a[1].s.c_str(),-1,opt);
-       else if(!strcmp(k,"dsn"))       gr->Grid3(*(a[0].d),a[1].s.c_str(),iint(a[2].v),opt);
+       else if(!strcmp(k,"dsn"))       gr->Grid3(*(a[0].d),a[1].s.c_str(),mgl_int(a[2].v),opt);
        else if(!strcmp(k,"dddd"))      gr->Grid3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",-1,opt);
        else if(!strcmp(k,"dddds"))     gr->Grid3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),-1,opt);
-       else if(!strcmp(k,"ddddsn"))gr->Grid3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),iint(a[5].v),opt);
+       else if(!strcmp(k,"ddddsn"))gr->Grid3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),mgl_int(a[5].v),opt);
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_light(mglGraph *gr, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
-       if(!strcmp(k,""))       gr->Light(true);
+       if(k[0]==0)     gr->Light(true);
        else if(!strcmp(k,"n")) gr->Light(a[0].v!=0);
-       else if(!strcmp(k,"nn"))        gr->Light(iint(a[0].v),a[1].v!=0);
-       else if(!strcmp(k,"nnnn"))      gr->AddLight(iint(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v));
-       else if(!strcmp(k,"nnnns"))     gr->AddLight(iint(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v), a[4].s.c_str()[0]);
-       else if(!strcmp(k,"nnnnsn"))gr->AddLight(iint(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v), a[4].s.c_str()[0],a[5].v);
+       else if(!strcmp(k,"nn"))        gr->Light(mgl_int(a[0].v),a[1].v!=0);
+       else if(!strcmp(k,"nnnn"))      gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v));
+       else if(!strcmp(k,"nnnns"))     gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v), a[4].s.c_str()[0]);
+       else if(!strcmp(k,"nnnnsn"))gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v), a[4].s.c_str()[0],a[5].v);
        else if(!strcmp(k,"nnnnsnn"))
-               gr->AddLight(iint(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v), a[4].s.c_str()[0],a[5].v,a[6].v);
+               gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v), a[4].s.c_str()[0],a[5].v,a[6].v);
        else if(!strcmp(k,"nnnnnnn"))
-               gr->AddLight(iint(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v),mglPoint(a[4].v,a[5].v,a[6].v));
+               gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v),mglPoint(a[4].v,a[5].v,a[6].v));
        else if(!strcmp(k,"nnnnnnns"))
-               gr->AddLight(iint(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v),mglPoint(a[4].v,a[5].v,a[6].v), a[7].s.c_str()[0]);
+               gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v),mglPoint(a[4].v,a[5].v,a[6].v), a[7].s.c_str()[0]);
        else if(!strcmp(k,"nnnnnnnsn"))
-               gr->AddLight(iint(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v),mglPoint(a[4].v,a[5].v,a[6].v), a[7].s.c_str()[0],a[8].v);
+               gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v),mglPoint(a[4].v,a[5].v,a[6].v), a[7].s.c_str()[0],a[8].v);
        else if(!strcmp(k,"nnnnnnnsnn"))
-               gr->AddLight(iint(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v),mglPoint(a[4].v,a[5].v,a[6].v), a[7].s.c_str()[0],a[8].v,a[9].v);
+               gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v),mglPoint(a[4].v,a[5].v,a[6].v), a[7].s.c_str()[0],a[8].v,a[9].v);
        return res;
 }
 //-----------------------------------------------------------------------------
+int MGL_NO_EXPORT mgls_attachlight(mglGraph *gr, long , mglArg *a, const char *k, const char *)
+{
+       int res=0;
+       if(!strcmp(k,"n"))      gr->AttachLight(a[0].v!=0);
+       else res = 1;   return res;
+}
+//-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_line(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
 {
        int res=0;      gr->Self()->SaveState(opt);
@@ -1032,9 +1113,9 @@ int MGL_NO_EXPORT mgls_errbox(mglGraph *gr, long , mglArg *a, const char *k, con
 int MGL_NO_EXPORT mgls_legend(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
 {
        int res=0;
-       if(!strcmp(k,""))       gr->Legend(3, "#", opt);
-       else if(!strcmp(k,"n")) gr->Legend(iint(a[0].v), "#", opt);
-       else if(!strcmp(k,"ns"))        gr->Legend(iint(a[0].v), a[1].s.c_str(), opt);
+       if(k[0]==0)     gr->Legend(3, "#", opt);
+       else if(!strcmp(k,"n")) gr->Legend(mgl_int(a[0].v), "#", opt);
+       else if(!strcmp(k,"ns"))        gr->Legend(mgl_int(a[0].v), a[1].s.c_str(), opt);
        else if(!strcmp(k,"nn"))        gr->Legend(a[0].v, a[1].v, "#", opt);
        else if(!strcmp(k,"nns"))       gr->Legend(a[0].v, a[1].v, a[2].s.c_str(), opt);
        else res = 1;   return res;
@@ -1050,46 +1131,53 @@ int MGL_NO_EXPORT mgls_barwidth(mglGraph *gr, long , mglArg *a, const char *k, c
 int MGL_NO_EXPORT mgls_legendmarks(mglGraph *gr, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
-       if(!strcmp(k,"n"))      gr->SetLegendMarks(iint(a[0].v));
+       if(!strcmp(k,"n"))      gr->SetLegendMarks(mgl_int(a[0].v));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_modify(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"ds"))     d->Modify(a[1].s.c_str());
-       else if(!strcmp(k,"dsn"))       d->Modify(a[1].s.c_str(), iint(a[2].v));
-       else if(!strcmp(k,"dsd"))       d->Modify(a[1].s.c_str(),*(a[2].d));
-       else if(!strcmp(k,"dsdd"))      d->Modify(a[1].s.c_str(),*(a[2].d),*(a[3].d));
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"ds"))        d->Modify(a[1].s.c_str());
+       else if(d && !strcmp(k,"dsn"))  d->Modify(a[1].s.c_str(), mgl_int(a[2].v));
+       else if(d && !strcmp(k,"dsd"))  d->Modify(a[1].s.c_str(),*(a[2].d));
+       else if(d && !strcmp(k,"dsdd")) d->Modify(a[1].s.c_str(),*(a[2].d),*(a[3].d));
+       else if(c && !strcmp(k,"ds"))   c->Modify(a[1].s.c_str());
+       else if(c && !strcmp(k,"dsn"))  c->Modify(a[1].s.c_str(), mgl_int(a[2].v));
+       else if(c && !strcmp(k,"dsd"))  c->Modify(a[1].s.c_str(),*(a[2].d));
+       else if(c && !strcmp(k,"dsdd")) c->Modify(a[1].s.c_str(),*(a[2].d),*(a[3].d));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_max(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dds"))    *d = mglData(true,mgl_data_max_dir(a[1].d,a[2].s.c_str()));
+       if(d && !strcmp(k,"dds"))       *d = mglData(true,mgl_data_max_dir(a[1].d,a[2].s.c_str()));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_min(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dds"))    *d = mglData(true,mgl_data_min_dir(a[1].d,a[2].s.c_str()));
+       if(d && !strcmp(k,"dds"))       *d = mglData(true,mgl_data_min_dir(a[1].d,a[2].s.c_str()));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_sum(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dds"))    *d = mglData(true,mgl_data_sum(a[1].d,a[2].s.c_str()));
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"dds"))       *d = mglData(true,mgl_data_sum(a[1].d,a[2].s.c_str()));
+       else if(c && !strcmp(k,"dds"))  *c = mglDataC(true,mgl_datac_sum(a[1].d,a[2].s.c_str()));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -1110,8 +1198,8 @@ int MGL_NO_EXPORT mgls_facenum(mglGraph *gr, long , mglArg *a, const char *k, co
 int MGL_NO_EXPORT mgls_quality(mglGraph *gr, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
-       if(!strcmp(k,""))       gr->SetQuality();
-       else if(!strcmp(k,"n")) gr->SetQuality(iint(a[0].v));
+       if(k[0]==0)     gr->SetQuality();
+       else if(!strcmp(k,"n")) gr->SetQuality(mgl_int(a[0].v));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -1148,26 +1236,38 @@ int MGL_NO_EXPORT mgls_read(mglGraph *gr, long , mglArg *a, const char *k, const
 {
        int res=0;
        bool rr=true;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
+       if(k[1]=='d' && a[1].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
        mglData *f = dynamic_cast<mglData *>(a[1].d);
-       if(!d)  return 1;
-       mglDataC c;
-       if(!strcmp(k,"ds"))
-       {       rr=c.Read(a[1].s.c_str());      *d = c.Real();  }
-       else if(!strcmp(k,"dsn"))
-       {       rr=c.Read(a[1].s.c_str(), iint(a[2].v));        *d = c.Real();  }
-       else if(!strcmp(k,"dsnn"))
-       {       rr=c.Read(a[1].s.c_str(), iint(a[2].v),iint(a[3].v));   *d = c.Real();  }
-       else if(!strcmp(k,"dsnnn"))
-       {       rr=c.Read(a[1].s.c_str(), iint(a[2].v),iint(a[3].v),iint(a[4].v));      *d = c.Real();  }
-       if(!strcmp(k,"dds") && f)
-       {       rr=c.Read(a[2].s.c_str());      *d = c.Real();  *f = c.Imag();  }
-       if(!strcmp(k,"ddsn") && f)
-       {       rr=c.Read(a[2].s.c_str(), iint(a[3].v));        *d = c.Real();  *f = c.Imag();  }
-       if(!strcmp(k,"ddsnn") && f)
-       {       rr=c.Read(a[2].s.c_str(), iint(a[3].v),iint(a[4].v));   *d = c.Real();  *f = c.Imag();  }
-       if(!strcmp(k,"ddsnnn") && f)
-       {       rr=c.Read(a[2].s.c_str(), iint(a[3].v),iint(a[4].v),iint(a[5].v));      *d = c.Real();  *f = c.Imag();  }
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(c)
+       {
+               if(!strcmp(k,"ds"))                     rr=c->Read(a[1].s.c_str());
+               else if(!strcmp(k,"dsn"))       rr=c->Read(a[1].s.c_str(), mgl_int(a[2].v));
+               else if(!strcmp(k,"dsnn"))      rr=c->Read(a[1].s.c_str(), mgl_int(a[2].v),mgl_int(a[3].v));
+               else if(!strcmp(k,"dsnnn"))     rr=c->Read(a[1].s.c_str(), mgl_int(a[2].v),mgl_int(a[3].v),mgl_int(a[4].v));
+               else res = 1;
+       }
+       else if(d && f && k[0]=='d' && k[1]=='d' && k[2]=='s')
+       {
+               mglDataC r;
+               if(k[3]==0)     rr=r.Read(a[2].s.c_str());
+               else if(!strcmp(k+3,"n"))       rr=r.Read(a[2].s.c_str(), mgl_int(a[3].v));
+               else if(!strcmp(k+3,"nn"))      rr=r.Read(a[2].s.c_str(), mgl_int(a[3].v),mgl_int(a[4].v));
+               else if(!strcmp(k+3,"nnn"))     rr=r.Read(a[2].s.c_str(), mgl_int(a[3].v),mgl_int(a[4].v),mgl_int(a[5].v));
+               else res = 1;
+               if(res==0)      {       *d = r.Real();  *f = r.Imag();  }
+       }
+       else if(d)
+       {
+               if(!strcmp(k,"ds"))     rr=d->Read(a[1].s.c_str());
+               else if(!strcmp(k,"dsn"))       rr=d->Read(a[1].s.c_str(), mgl_int(a[2].v));
+               else if(!strcmp(k,"dsnn"))      rr=d->Read(a[1].s.c_str(), mgl_int(a[2].v),mgl_int(a[3].v));
+               else if(!strcmp(k,"dsnnn"))     rr=d->Read(a[1].s.c_str(), mgl_int(a[2].v),mgl_int(a[3].v),mgl_int(a[4].v));
+               else res = 1;
+       }
+       else res = 1;
        if(!rr) gr->SetWarn(mglWarnFile,"Read");
        return res;
 }
@@ -1176,10 +1276,13 @@ int MGL_NO_EXPORT mgls_readmat(mglGraph *gr, long , mglArg *a, const char *k, co
 {
        int res=0;
        bool rr=true;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"ds")) rr=d->ReadMat(a[1].s.c_str());
-       else if(!strcmp(k,"dsn")) rr=d->ReadMat(a[1].s.c_str(), iint(a[2].v));
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"ds"))                rr=d->ReadMat(a[1].s.c_str());
+       else if(d && !strcmp(k,"dsn"))  rr=d->ReadMat(a[1].s.c_str(), mgl_int(a[2].v));
+       else if(c && !strcmp(k,"ds"))   rr=c->ReadMat(a[1].s.c_str());
+       else if(c && !strcmp(k,"dsn"))  rr=c->ReadMat(a[1].s.c_str(), mgl_int(a[2].v));
        else res = 1;
        if(!rr) gr->SetWarn(mglWarnFile,"ReadMat");
        return res;
@@ -1189,24 +1292,32 @@ int MGL_NO_EXPORT mgls_readall(mglGraph *gr, long , mglArg *a, const char *k, co
 {
        int res=0;
        bool rr=true;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"ds")) rr=d->ReadAll(a[1].s.c_str());
-       else if(!strcmp(k,"dsn")) rr=d->ReadAll(a[1].s.c_str(), a[2].v);
-       else if(!strcmp(k,"dsnn"))      rr=d->ReadRange(a[1].s.c_str(), a[2].v, a[3].v);
-       else if(!strcmp(k,"dsnnn"))     rr=d->ReadRange(a[1].s.c_str(), a[2].v, a[3].v, a[4].v);
-       else if(!strcmp(k,"dsnnnn"))rr=d->ReadRange(a[1].s.c_str(), a[2].v, a[3].v, a[4].v, a[5].v);
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"ds"))        rr=d->ReadAll(a[1].s.c_str());
+       else if(d && !strcmp(k,"dsn"))          rr=d->ReadAll(a[1].s.c_str(), a[2].v);
+       else if(d && !strcmp(k,"dsnn"))         rr=d->ReadRange(a[1].s.c_str(), a[2].v, a[3].v);
+       else if(d && !strcmp(k,"dsnnn"))        rr=d->ReadRange(a[1].s.c_str(), a[2].v, a[3].v, a[4].v);
+       else if(d && !strcmp(k,"dsnnnn"))       rr=d->ReadRange(a[1].s.c_str(), a[2].v, a[3].v, a[4].v, a[5].v);
+       else if(c && !strcmp(k,"ds"))           rr=c->ReadAll(a[1].s.c_str());
+       else if(c && !strcmp(k,"dsn"))          rr=c->ReadAll(a[1].s.c_str(), a[2].v);
+       else if(c && !strcmp(k,"dsnn"))         rr=c->ReadRange(a[1].s.c_str(), a[2].v, a[3].v);
+       else if(c && !strcmp(k,"dsnnn"))        rr=c->ReadRange(a[1].s.c_str(), a[2].v, a[3].v, a[4].v);
+       else if(c && !strcmp(k,"dsnnnn"))       rr=c->ReadRange(a[1].s.c_str(), a[2].v, a[3].v, a[4].v, a[5].v);
        else res = 1;
-       if(!rr) gr->SetWarn(mglWarnFile,"ReadMat");
+       if(!rr) gr->SetWarn(mglWarnFile,"ReadAll");
        return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_readhdf(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dss"))    d->ReadHDF(a[1].s.c_str(), a[2].s.c_str());
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"dss"))       d->ReadHDF(a[1].s.c_str(), a[2].s.c_str());
+       else if(c && !strcmp(k,"dss"))  c->ReadHDF(a[1].s.c_str(), a[2].s.c_str());
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -1264,18 +1375,22 @@ int MGL_NO_EXPORT mgls_logo(mglGraph *gr, long , mglArg *a, const char *k, const
 {
        int res=0;
        if(!strcmp(k,"s"))      gr->Logo(a[0].s.c_str(),false,opt);
-       else if(!strcmp(k,"sn"))        gr->Logo(a[0].s.c_str(),iint(a[1].v),opt);
+       else if(!strcmp(k,"sn"))        gr->Logo(a[0].s.c_str(),mgl_int(a[1].v),opt);
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_resize(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"ddn"))    *d = mglData(true,mgl_data_resize_box(a[1].d, iint(a[2].v),0,0, 0,1, 0,1, 0,1));
-       else if(!strcmp(k,"ddnn"))      *d = mglData(true,mgl_data_resize_box(a[1].d, iint(a[2].v),iint(a[3].v),0, 0,1, 0,1, 0,1));
-       else if(!strcmp(k,"ddnnn"))     *d = mglData(true,mgl_data_resize_box(a[1].d, iint(a[2].v),iint(a[3].v),iint(a[4].v), 0,1, 0,1, 0,1));
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"ddn"))       *d = mglData(true,mgl_data_resize_box(a[1].d, mgl_int(a[2].v),0,0, 0,1, 0,1, 0,1));
+       else if(d && !strcmp(k,"ddnn")) *d = mglData(true,mgl_data_resize_box(a[1].d, mgl_int(a[2].v),mgl_int(a[3].v),0, 0,1, 0,1, 0,1));
+       else if(d && !strcmp(k,"ddnnn"))*d = mglData(true,mgl_data_resize_box(a[1].d, mgl_int(a[2].v),mgl_int(a[3].v),mgl_int(a[4].v), 0,1, 0,1, 0,1));
+       else if(c && !strcmp(k,"ddn"))  *c = mglDataC(true,mgl_datac_resize_box(a[1].d, mgl_int(a[2].v),0,0, 0,1, 0,1, 0,1));
+       else if(c && !strcmp(k,"ddnn")) *c = mglDataC(true,mgl_datac_resize_box(a[1].d, mgl_int(a[2].v),mgl_int(a[3].v),0, 0,1, 0,1, 0,1));
+       else if(c && !strcmp(k,"ddnnn"))*c = mglDataC(true,mgl_datac_resize_box(a[1].d, mgl_int(a[2].v),mgl_int(a[3].v),mgl_int(a[4].v), 0,1, 0,1, 0,1));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -1298,8 +1413,8 @@ int MGL_NO_EXPORT mgls_rotatetext(mglGraph *gr, long , mglArg *a, const char *k,
 int MGL_NO_EXPORT mgls_tuneticks(mglGraph *gr, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
-       if(!strcmp(k,"n"))      gr->SetTuneTicks(iint(a[0].v));
-       else if(!strcmp(k,"nn"))        gr->SetTuneTicks(iint(a[0].v),a[1].v);
+       if(!strcmp(k,"n"))      gr->SetTuneTicks(mgl_int(a[0].v));
+       else if(!strcmp(k,"nn"))        gr->SetTuneTicks(mgl_int(a[0].v),a[1].v);
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -1322,29 +1437,35 @@ int MGL_NO_EXPORT mgls_save(mglGraph *, long , mglArg *a, const char *k, const c
 int MGL_NO_EXPORT mgls_smooth(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"d"))      d->Smooth();
-       else if(!strcmp(k,"ds"))        d->Smooth(a[1].s.c_str());
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"d")) d->Smooth();
+       else if(d && !strcmp(k,"ds"))   d->Smooth(a[1].s.c_str());
+       else if(c && !strcmp(k,"d"))    c->Smooth();
+       else if(c && !strcmp(k,"ds"))   c->Smooth(a[1].s.c_str());
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_swap(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"ds"))     d->Swap(a[1].s.c_str());
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"ds"))        d->Swap(a[1].s.c_str());
+       else if(c && !strcmp(k,"ds"))   c->Swap(a[1].s.c_str());
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_idset(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
        mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(!strcmp(k,"ds") && d)        d->SetColumnId(a[1].s.c_str());
-       else if(!strcmp(k,"ds") && c)   c->SetColumnId(a[1].s.c_str());
+       if(d && !strcmp(k,"ds"))        d->SetColumnId(a[1].s.c_str());
+       else if(c && !strcmp(k,"ds"))   c->SetColumnId(a[1].s.c_str());
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -1433,24 +1554,28 @@ int MGL_NO_EXPORT mgls_radar(mglGraph *gr, long , mglArg *a, const char *k, cons
 int MGL_NO_EXPORT mgls_squeeze(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dn"))     d->Squeeze(iint(a[1].v));
-       else if(!strcmp(k,"dnn"))       d->Squeeze(iint(a[1].v), iint(a[2].v));
-       else if(!strcmp(k,"dnnn"))      d->Squeeze(iint(a[1].v), iint(a[2].v),iint(a[3].v));
-       else if(!strcmp(k,"dnnnn"))     d->Squeeze(iint(a[1].v), iint(a[2].v),iint(a[3].v), a[4].v);
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"dn"))        d->Squeeze(mgl_int(a[1].v));
+       else if(d && !strcmp(k,"dnn"))  d->Squeeze(mgl_int(a[1].v), mgl_int(a[2].v));
+       else if(d && !strcmp(k,"dnnn")) d->Squeeze(mgl_int(a[1].v), mgl_int(a[2].v),mgl_int(a[3].v));
+       else if(d && !strcmp(k,"dnnnn"))d->Squeeze(mgl_int(a[1].v), mgl_int(a[2].v),mgl_int(a[3].v), a[4].v);
+       else if(c && !strcmp(k,"dn"))   c->Squeeze(mgl_int(a[1].v));
+       else if(c && !strcmp(k,"dnn"))  c->Squeeze(mgl_int(a[1].v), mgl_int(a[2].v));
+       else if(c && !strcmp(k,"dnnn")) c->Squeeze(mgl_int(a[1].v), mgl_int(a[2].v),mgl_int(a[3].v));
+       else if(c && !strcmp(k,"dnnnn"))c->Squeeze(mgl_int(a[1].v), mgl_int(a[2].v),mgl_int(a[3].v), a[4].v);
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_stfad(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
        if(!d)  return 1;
-       if(!strcmp(k,"dddn"))
-               *d = mglSTFA(*(a[1].d),*(a[2].d), iint(a[3].v));
-       else if(!strcmp(k,"dddns"))
-               *d = mglSTFA(*(a[1].d),*(a[2].d), iint(a[3].v), a[4].s.c_str()[0]);
+       if(!strcmp(k,"dddn"))           *d = mglSTFA(*(a[1].d),*(a[2].d), mgl_int(a[3].v));
+       else if(!strcmp(k,"dddns"))     *d = mglSTFA(*(a[1].d),*(a[2].d), mgl_int(a[3].v), a[4].s.c_str()[0]);
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -1458,7 +1583,7 @@ int MGL_NO_EXPORT mgls_setsize(mglGraph *gr, long , mglArg *a, const char *k, co
 {
        int res=0;
        if(!strcmp(k,"nn") && a[1].v>1 && a[0].v>1)
-               gr->SetSize(iint(a[0].v), iint(a[1].v));
+               gr->SetSize(mgl_int(a[0].v), mgl_int(a[1].v));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -1476,13 +1601,13 @@ int MGL_NO_EXPORT mgls_stfa(mglGraph *gr, long , mglArg *a, const char *k, const
 {
        int res=0;
        if(!strcmp(k,"ddn"))
-               gr->STFA(*(a[0].d),*(a[1].d), iint(a[2].v), "",opt);
+               gr->STFA(*(a[0].d),*(a[1].d), mgl_int(a[2].v), "",opt);
        else if(!strcmp(k,"ddns"))
-               gr->STFA(*(a[0].d),*(a[1].d), iint(a[2].v), a[3].s.c_str(),opt);
+               gr->STFA(*(a[0].d),*(a[1].d), mgl_int(a[2].v), a[3].s.c_str(),opt);
        else if(!strcmp(k,"ddddn"))
-               gr->STFA(*(a[0].d),*(a[1].d), *(a[2].d),*(a[3].d), iint(a[4].v), "",opt);
+               gr->STFA(*(a[0].d),*(a[1].d), *(a[2].d),*(a[3].d), mgl_int(a[4].v), "",opt);
        else if(!strcmp(k,"ddddns"))
-               gr->STFA(*(a[0].d),*(a[1].d), *(a[2].d),*(a[3].d), iint(a[4].v), a[5].s.c_str(),opt);
+               gr->STFA(*(a[0].d),*(a[1].d), *(a[2].d),*(a[3].d), mgl_int(a[4].v), a[5].s.c_str(),opt);
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -1536,12 +1661,30 @@ int MGL_NO_EXPORT mgls_surf3a(mglGraph *gr, long , mglArg *a, const char *k, con
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
+int MGL_NO_EXPORT mgls_surf3ca(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
+{
+       int res=0;
+       if(!strcmp(k,"ddd"))    gr->Surf3CA(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
+       else if(!strcmp(k,"ddds"))      gr->Surf3CA(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
+       else if(!strcmp(k,"dddn"))      gr->Surf3CA(a[4].v,*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
+       else if(!strcmp(k,"dddns"))     gr->Surf3CA(a[4].v,*(a[0].d),*(a[1].d),*(a[2].d),a[4].s.c_str(),opt);
+       else if(!strcmp(k,"dddddd"))
+               gr->Surf3CA(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d), "",opt);
+       else if(!strcmp(k,"dddddds"))
+               gr->Surf3CA(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d), a[6].s.c_str(),opt);
+       else if(!strcmp(k,"ddddddn"))
+               gr->Surf3CA(a[6].v,*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),"",opt);
+       else if(!strcmp(k,"ddddddns"))
+               gr->Surf3CA(a[6].v,*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),a[7].s.c_str(),opt);
+       else res = 1;   return res;
+}
+//-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_subplot(mglGraph *gr, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
-       if(!strcmp(k,"nnn"))    gr->SubPlot(iint(a[0].v), iint(a[1].v), iint(a[2].v));
-       else if(!strcmp(k,"nnns"))      gr->SubPlot(iint(a[0].v), iint(a[1].v), iint(a[2].v), a[3].s.c_str());
-       else if(!strcmp(k,"nnnsnn"))    gr->SubPlot(iint(a[0].v), iint(a[1].v), iint(a[2].v), a[3].s.c_str(), a[4].v,a[5].v);
+       if(!strcmp(k,"nnn"))    gr->SubPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v));
+       else if(!strcmp(k,"nnns"))      gr->SubPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v), a[3].s.c_str());
+       else if(!strcmp(k,"nnnsnn"))    gr->SubPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v), a[3].s.c_str(), a[4].v,a[5].v);
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -1549,9 +1692,9 @@ int MGL_NO_EXPORT mgls_multiplot(mglGraph *gr, long , mglArg *a, const char *k,
 {
        int res=0;
        if(!strcmp(k,"nnnnn"))
-               gr->MultiPlot(iint(a[0].v), iint(a[1].v), iint(a[2].v), iint(a[3].v), iint(a[4].v));
+               gr->MultiPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v), mgl_int(a[3].v), mgl_int(a[4].v));
        else if(!strcmp(k,"nnnnns"))
-               gr->MultiPlot(iint(a[0].v), iint(a[1].v), iint(a[2].v), iint(a[3].v), iint(a[4].v), a[5].s.c_str());
+               gr->MultiPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v), mgl_int(a[3].v), mgl_int(a[4].v), a[5].s.c_str());
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -1567,33 +1710,51 @@ int MGL_NO_EXPORT mgls_title(mglGraph *gr, long , mglArg *a, const char *k, cons
 int MGL_NO_EXPORT mgls_column(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dds"))    *d = mglData(true,mgl_data_column(a[1].d,a[2].s.c_str()));
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"dds"))       *d = mglData(true,mgl_data_column(a[1].d,a[2].s.c_str()));
+       else if(c && !strcmp(k,"dds"))  *c = mglDataC(true,mgl_datac_column(a[1].d,a[2].s.c_str()));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_subdata(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"ddn"))    *d = mglData(true,mgl_data_subdata(a[1].d, iint(a[2].v), -1, -1));
-       else if(!strcmp(k,"ddnn"))      *d = mglData(true,mgl_data_subdata(a[1].d, iint(a[2].v), iint(a[3].v), -1));
-       else if(!strcmp(k,"ddnnn"))     *d = mglData(true,mgl_data_subdata(a[1].d, iint(a[2].v), iint(a[3].v), iint(a[4].v)));
-       else if(!strcmp(k,"ddd"))       *d = mglSubData(*(a[1].d), *(a[2].d));
-       else if(!strcmp(k,"dddd"))      *d = mglSubData(*(a[1].d), *(a[2].d), *(a[3].d));
-       else if(!strcmp(k,"ddddd"))     *d = mglSubData(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d));
-       else res = 1;
-       return res;
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d)
+       {
+               if(!strcmp(k,"ddn"))            *d = mglData(true,mgl_data_subdata(a[1].d, mgl_int(a[2].v), -1, -1));
+               else if(!strcmp(k,"ddnn"))      *d = mglData(true,mgl_data_subdata(a[1].d, mgl_int(a[2].v), mgl_int(a[3].v), -1));
+               else if(!strcmp(k,"ddnnn"))     *d = mglData(true,mgl_data_subdata(a[1].d, mgl_int(a[2].v), mgl_int(a[3].v), mgl_int(a[4].v)));
+               else if(!strcmp(k,"ddd"))       *d = mglData(true,mgl_data_subdata_ext(a[1].d, a[2].d, 0, 0));
+               else if(!strcmp(k,"dddd"))      *d = mglData(true,mgl_data_subdata_ext(a[1].d, a[2].d, a[3].d, 0));
+               else if(!strcmp(k,"ddddd"))     *d = mglData(true,mgl_data_subdata_ext(a[1].d, a[2].d, a[3].d, a[4].d));
+               else res = 1;
+       }
+       else if(c)
+       {
+               if(!strcmp(k,"ddn"))            *c = mglDataC(true,mgl_datac_subdata(a[1].d, mgl_int(a[2].v), -1, -1));
+               else if(!strcmp(k,"ddnn"))      *c = mglDataC(true,mgl_datac_subdata(a[1].d, mgl_int(a[2].v), mgl_int(a[3].v), -1));
+               else if(!strcmp(k,"ddnnn"))     *c = mglDataC(true,mgl_datac_subdata(a[1].d, mgl_int(a[2].v), mgl_int(a[3].v), mgl_int(a[4].v)));
+               else if(!strcmp(k,"ddd"))       *c = mglDataC(true,mgl_datac_subdata_ext(a[1].d, a[2].d, 0, 0));
+               else if(!strcmp(k,"dddd"))      *c = mglDataC(true,mgl_datac_subdata_ext(a[1].d, a[2].d, a[3].d, 0));
+               else if(!strcmp(k,"ddddd"))     *c = mglDataC(true,mgl_datac_subdata_ext(a[1].d, a[2].d, a[3].d, a[4].d));
+               else res = 1;
+       }
+       else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_trace(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dd"))     *d = mglData(true,mgl_data_trace(a[1].d));
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"dd"))        *d = mglData(true,mgl_data_trace(a[1].d));
+       else if(c && !strcmp(k,"dd"))   *c = mglDataC(true,mgl_datac_trace(a[1].d));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -1665,14 +1826,18 @@ int MGL_NO_EXPORT mgls_transptype(mglGraph *gr, long , mglArg *a, const char *k,
 int MGL_NO_EXPORT mgls_fourier(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *re = dynamic_cast<mglData *>(a[0].d), *im = dynamic_cast<mglData *>(a[1].d);
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
        if(!strcmp(k,"dds") && re && im)        mglFourier(*re,*im,a[2].s.c_str());
+       else if(!strcmp(k,"ds") && c)           c->FFT(a[1].s.c_str());
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_transform(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
        if(!strcmp(k,"dsdd") && d)      *d = mglTransform(*(a[2].d),*(a[3].d),a[1].s.c_str());
        else res = 1;   return res;
@@ -1681,6 +1846,7 @@ int MGL_NO_EXPORT mgls_transform(mglGraph *, long , mglArg *a, const char *k, co
 int MGL_NO_EXPORT mgls_transforma(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
        if(!strcmp(k,"dsdd") && d)      *d = mglTransformA(*(a[2].d),*(a[3].d),a[1].s.c_str());
        else res = 1;   return res;
@@ -1800,10 +1966,13 @@ int MGL_NO_EXPORT mgls_ternary(mglGraph *gr, long , mglArg *a, const char *k, co
 int MGL_NO_EXPORT mgls_transpose(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"d"))      d->Transpose();
-       else if(!strcmp(k,"ds"))        d->Transpose(a[1].s.c_str());
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"d")) d->Transpose();
+       else if(d && !strcmp(k,"ds"))   d->Transpose(a[1].s.c_str());
+       else if(c && !strcmp(k,"d"))    c->Transpose();
+       else if(c && !strcmp(k,"ds"))   c->Transpose(a[1].s.c_str());
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -1965,10 +2134,10 @@ int MGL_NO_EXPORT mgls_xtick(mglGraph *gr, long n, mglArg *a, const char *k, con
        int res=0;
        if(!strcmp(k,"n"))      gr->SetTicks('x', a[0].v);
        else if(!strcmp(k,"ns"))        gr->SetTicks('x', a[0].v, 0, NAN, a[1].w.c_str());
-       else if(!strcmp(k,"nn"))        gr->SetTicks('x', a[0].v, iint(a[1].v));
-       else if(!strcmp(k,"nns"))       gr->SetTicks('x', a[0].v, iint(a[1].v), NAN, a[2].w.c_str());
-       else if(!strcmp(k,"nnn"))       gr->SetTicks('x', a[0].v, iint(a[1].v), a[2].v);
-       else if(!strcmp(k,"nnns"))      gr->SetTicks('x', a[0].v, iint(a[1].v), a[2].v, a[3].w.c_str());
+       else if(!strcmp(k,"nn"))        gr->SetTicks('x', a[0].v, mgl_int(a[1].v));
+       else if(!strcmp(k,"nns"))       gr->SetTicks('x', a[0].v, mgl_int(a[1].v), NAN, a[2].w.c_str());
+       else if(!strcmp(k,"nnn"))       gr->SetTicks('x', a[0].v, mgl_int(a[1].v), a[2].v);
+       else if(!strcmp(k,"nnns"))      gr->SetTicks('x', a[0].v, mgl_int(a[1].v), a[2].v, a[3].w.c_str());
        else if(!strcmp(k,"s"))         gr->SetTickTempl('x',a[0].w.c_str());
        else if(!strcmp(k,"ds"))        gr->SetTicksVal('x', *(a[0].d), a[1].w.c_str());
        else if(!strcmp(k,"dsn"))       gr->SetTicksVal('x', *(a[0].d), a[1].w.c_str(), a[2].v);
@@ -1991,10 +2160,10 @@ int MGL_NO_EXPORT mgls_ytick(mglGraph *gr, long n, mglArg *a, const char *k, con
        int res=0;
        if(!strcmp(k,"n"))      gr->SetTicks('y', a[0].v);
        else if(!strcmp(k,"ns"))        gr->SetTicks('y', a[0].v, 0, NAN, a[1].w.c_str());
-       else if(!strcmp(k,"nn"))        gr->SetTicks('y', a[0].v, iint(a[1].v));
-       else if(!strcmp(k,"nns"))       gr->SetTicks('y', a[0].v, iint(a[1].v), NAN, a[2].w.c_str());
-       else if(!strcmp(k,"nnn"))       gr->SetTicks('y', a[0].v, iint(a[1].v), a[2].v);
-       else if(!strcmp(k,"nnns"))      gr->SetTicks('y', a[0].v, iint(a[1].v), a[2].v, a[3].w.c_str());
+       else if(!strcmp(k,"nn"))        gr->SetTicks('y', a[0].v, mgl_int(a[1].v));
+       else if(!strcmp(k,"nns"))       gr->SetTicks('y', a[0].v, mgl_int(a[1].v), NAN, a[2].w.c_str());
+       else if(!strcmp(k,"nnn"))       gr->SetTicks('y', a[0].v, mgl_int(a[1].v), a[2].v);
+       else if(!strcmp(k,"nnns"))      gr->SetTicks('y', a[0].v, mgl_int(a[1].v), a[2].v, a[3].w.c_str());
        else if(!strcmp(k,"s"))         gr->SetTickTempl('y',a[0].w.c_str());
        else if(!strcmp(k,"ds"))        gr->SetTicksVal('y', *(a[0].d), a[1].w.c_str());
        else if(!strcmp(k,"dsn"))       gr->SetTicksVal('y', *(a[0].d), a[1].w.c_str(), a[2].v);
@@ -2017,10 +2186,10 @@ int MGL_NO_EXPORT mgls_ztick(mglGraph *gr, long n, mglArg *a, const char *k, con
        int res=0;
        if(!strcmp(k,"n"))      gr->SetTicks('z', a[0].v);
        else if(!strcmp(k,"ns"))        gr->SetTicks('z', a[0].v, 0, NAN, a[1].w.c_str());
-       else if(!strcmp(k,"nn"))        gr->SetTicks('z', a[0].v, iint(a[1].v));
-       else if(!strcmp(k,"nns"))       gr->SetTicks('z', a[0].v, iint(a[1].v), NAN, a[2].w.c_str());
-       else if(!strcmp(k,"nnn"))       gr->SetTicks('z', a[0].v, iint(a[1].v), a[2].v);
-       else if(!strcmp(k,"nnns"))      gr->SetTicks('z', a[0].v, iint(a[1].v), a[2].v, a[3].w.c_str());
+       else if(!strcmp(k,"nn"))        gr->SetTicks('z', a[0].v, mgl_int(a[1].v));
+       else if(!strcmp(k,"nns"))       gr->SetTicks('z', a[0].v, mgl_int(a[1].v), NAN, a[2].w.c_str());
+       else if(!strcmp(k,"nnn"))       gr->SetTicks('z', a[0].v, mgl_int(a[1].v), a[2].v);
+       else if(!strcmp(k,"nnns"))      gr->SetTicks('z', a[0].v, mgl_int(a[1].v), a[2].v, a[3].w.c_str());
        else if(!strcmp(k,"s"))         gr->SetTickTempl('z',a[0].w.c_str());
        else if(!strcmp(k,"ds"))        gr->SetTicksVal('z', *(a[0].d), a[1].w.c_str());
        else if(!strcmp(k,"dsn"))       gr->SetTicksVal('z', *(a[0].d), a[1].w.c_str(), a[2].v);
@@ -2053,19 +2222,26 @@ int MGL_NO_EXPORT mgls_error(mglGraph *gr, long , mglArg *a, const char *k, cons
 int MGL_NO_EXPORT mgls_extend(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dn"))     d->Extend(iint(a[1].v));
-       else if(!strcmp(k,"dnn"))       d->Extend(iint(a[1].v),iint(a[2].v));
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"dn"))        d->Extend(mgl_int(a[1].v));
+       else if(d && !strcmp(k,"dnn"))  d->Extend(mgl_int(a[1].v),mgl_int(a[2].v));
+       else if(c && !strcmp(k,"dn"))   c->Extend(mgl_int(a[1].v));
+       else if(c && !strcmp(k,"dnn"))  c->Extend(mgl_int(a[1].v),mgl_int(a[2].v));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_join(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!strcmp(k,"dd") && d)        d->Join(*(a[1].d));
-       else res = 1;   return res;
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if((!d && !c) || k[1]!='d')     res = 1;
+       else if(d)      for(long i=1;k[i]=='d';i++)     d->Join(*(a[i].d));
+       else if(c)      for(long i=1;k[i]=='d';i++)     c->Join(*(a[i].d));
+       return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_datas(mglGraph *gr, long , mglArg *a, const char *k, const char *)
@@ -2094,8 +2270,11 @@ int MGL_NO_EXPORT mgls_info(mglGraph *gr, long , mglArg *a, const char *k, const
 int MGL_NO_EXPORT mgls_integrate(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!strcmp(k,"ds") && d)        d->Integral(a[1].s.c_str());
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"ds"))        d->Integral(a[1].s.c_str());
+       else if(c && !strcmp(k,"ds"))   c->Integral(a[1].s.c_str());
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -2110,23 +2289,23 @@ int MGL_NO_EXPORT mgls_inplot(mglGraph *gr, long , mglArg *a, const char *k, con
 int MGL_NO_EXPORT mgls_columnplot(mglGraph *gr, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
-       if(!strcmp(k,"nn"))     gr->ColumnPlot(iint(a[0].v), iint(a[1].v));
-       else if(!strcmp(k,"nnn"))       gr->ColumnPlot(iint(a[0].v), iint(a[1].v), a[2].v);
+       if(!strcmp(k,"nn"))     gr->ColumnPlot(mgl_int(a[0].v), mgl_int(a[1].v));
+       else if(!strcmp(k,"nnn"))       gr->ColumnPlot(mgl_int(a[0].v), mgl_int(a[1].v), a[2].v);
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_gridplot(mglGraph *gr, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
-       if(!strcmp(k,"nnn"))    gr->GridPlot(iint(a[0].v), iint(a[1].v), iint(a[2].v));
-       else if(!strcmp(k,"nnnn"))      gr->GridPlot(iint(a[0].v), iint(a[1].v), iint(a[2].v), a[3].v);
+       if(!strcmp(k,"nnn"))    gr->GridPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v));
+       else if(!strcmp(k,"nnnn"))      gr->GridPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v), a[3].v);
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_stickplot(mglGraph *gr, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
-       if(!strcmp(k,"nnnn"))   gr->StickPlot(iint(a[0].v), iint(a[1].v), a[2].v, a[3].v);
+       if(!strcmp(k,"nnnn"))   gr->StickPlot(mgl_int(a[0].v), mgl_int(a[1].v), a[2].v, a[3].v);
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -2168,48 +2347,57 @@ int MGL_NO_EXPORT mgls_origin(mglGraph *gr, long , mglArg *a, const char *k, con
 int MGL_NO_EXPORT mgls_norm(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
        if(!d)  return 1;
        if(!strcmp(k,"dnn"))    d->Norm(a[1].v,a[2].v);
        else if(!strcmp(k,"dnnn"))      d->Norm(a[1].v,a[2].v,a[3].v!=0);
-       else if(!strcmp(k,"dnnnn"))     d->Norm(a[1].v,a[2].v,a[3].v!=0,iint(a[4].v));
+       else if(!strcmp(k,"dnnnn"))     d->Norm(a[1].v,a[2].v,a[3].v!=0,mgl_int(a[4].v));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_hist(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
        if(!d)  return 1;
        if(!strcmp(k,"ddd"))            *d = gr->Hist(*(a[1].d), *(a[2].d),opt);
        else if(!strcmp(k,"dddd"))      *d = gr->Hist(*(a[1].d), *(a[2].d), *(a[3].d),opt);
        else if(!strcmp(k,"ddddd"))     *d = gr->Hist(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d),opt);
        else if(!strcmp(k,"ddnnn"))     *d = mglData(true,mgl_data_hist(a[1].d,int(a[2].v+0.5), a[3].v, a[4].v, 0));
-       else if(!strcmp(k,"ddnnnn"))    *d = mglData(true,mgl_data_hist(a[1].d,int(a[2].v+0.5), a[3].v, a[4].v, int(a[5].v+0.5)));
-       else if(!strcmp(k,"dddnnn"))    *d = mglData(true,mgl_data_hist_w(a[1].d,a[2].d, int(a[3].v+0.5), a[4].v, a[5].v, 0));
-       else if(!strcmp(k,"dddnnnn"))   *d = mglData(true,mgl_data_hist_w(a[1].d,a[2].d, int(a[3].v+0.5), a[4].v, a[5].v, int(a[6].v+0.5)));
+       else if(!strcmp(k,"ddnnnn"))    *d = mglData(true,mgl_data_hist(a[1].d,mgl_int(a[2].v), a[3].v, a[4].v, mgl_int(a[5].v)));
+       else if(!strcmp(k,"dddnnn"))    *d = mglData(true,mgl_data_hist_w(a[1].d,a[2].d, mgl_int(a[3].v), a[4].v, a[5].v, 0));
+       else if(!strcmp(k,"dddnnnn"))   *d = mglData(true,mgl_data_hist_w(a[1].d,a[2].d, mgl_int(a[3].v), a[4].v, a[5].v, mgl_int(a[6].v)));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_mirror(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!strcmp(k,"ds") && d)        d->Mirror(a[1].s.c_str());
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"ds"))                d->Mirror(a[1].s.c_str());
+       else if(c && !strcmp(k,"ds"))   c->Mirror(a[1].s.c_str());
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_hankel(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!strcmp(k,"ds") && d)        d->Hankel(a[1].s.c_str());
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"ds"))                d->Hankel(a[1].s.c_str());
+       else if(c && !strcmp(k,"ds"))   c->Hankel(a[1].s.c_str());
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_sinfft(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
        if(!strcmp(k,"ds") && d)        d->SinFFT(a[1].s.c_str());
        else res = 1;   return res;
@@ -2218,40 +2406,58 @@ int MGL_NO_EXPORT mgls_sinfft(mglGraph *, long , mglArg *a, const char *k, const
 int MGL_NO_EXPORT mgls_cosfft(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
        if(!strcmp(k,"ds") && d)        d->CosFFT(a[1].s.c_str());
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
+int MGL_NO_EXPORT mgls_wavelet(mglGraph *, long , mglArg *a, const char *k, const char *)
+{
+       int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
+       mglData *d = dynamic_cast<mglData *>(a[0].d);
+       if(!strcmp(k,"dsn") && d)       d->Wavelet(a[1].s.c_str(), mgl_int(a[2].v));
+       else res = 1;   return res;
+}
+//-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_new(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dn"))     d->Create(iint(a[1].v));
-       else if(!strcmp(k,"dns"))
-       {       d->Create(iint(a[1].v));
-               d->Fill(gr->Self(),a[2].s.c_str(),opt); }
-       else if(!strcmp(k,"dnn"))       d->Create(iint(a[1].v),iint(a[2].v));
-       else if(!strcmp(k,"dnns"))
-       {       d->Create(iint(a[1].v),iint(a[2].v));
-               d->Fill(gr->Self(),a[3].s.c_str(),opt); }
-       else if(!strcmp(k,"dnnn"))      d->Create(iint(a[1].v),iint(a[2].v),iint(a[3].v));
-       else if(!strcmp(k,"dnnns"))
-       {       d->Create(iint(a[1].v),iint(a[2].v),iint(a[3].v));
-               d->Fill(gr->Self(),a[4].s.c_str(),opt); }
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"dn"))        d->Create(mgl_int(a[1].v));
+       else if(d && !strcmp(k,"dns"))
+       {       d->Create(mgl_int(a[1].v));     d->Fill(gr->Self(),a[2].s.c_str(),opt); }
+       else if(d && !strcmp(k,"dnn"))  d->Create(mgl_int(a[1].v),mgl_int(a[2].v));
+       else if(d && !strcmp(k,"dnns"))
+       {       d->Create(mgl_int(a[1].v),mgl_int(a[2].v));     d->Fill(gr->Self(),a[3].s.c_str(),opt); }
+       else if(d && !strcmp(k,"dnnn")) d->Create(mgl_int(a[1].v),mgl_int(a[2].v),mgl_int(a[3].v));
+       else if(d && !strcmp(k,"dnnns"))
+       {       d->Create(mgl_int(a[1].v),mgl_int(a[2].v),mgl_int(a[3].v));     d->Fill(gr->Self(),a[4].s.c_str(),opt); }
+       else if(c && !strcmp(k,"dn"))   c->Create(mgl_int(a[1].v));
+       else if(c && !strcmp(k,"dns"))
+       {       c->Create(mgl_int(a[1].v));     c->Fill(gr->Self(),a[2].s.c_str(),opt); }
+       else if(c && !strcmp(k,"dnn"))  c->Create(mgl_int(a[1].v),mgl_int(a[2].v));
+       else if(c && !strcmp(k,"dnns"))
+       {       c->Create(mgl_int(a[1].v),mgl_int(a[2].v));     c->Fill(gr->Self(),a[3].s.c_str(),opt); }
+       else if(c && !strcmp(k,"dnnn")) c->Create(mgl_int(a[1].v),mgl_int(a[2].v),mgl_int(a[3].v));
+       else if(c && !strcmp(k,"dnnns"))
+       {       c->Create(mgl_int(a[1].v),mgl_int(a[2].v),mgl_int(a[3].v));     c->Fill(gr->Self(),a[4].s.c_str(),opt); }
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_var(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);   // TODO use mglDataV here?!
        if(!d)  return 1;
        if(!strcmp(k,"dnn"))
-       {       d->Create(iint(a[1].v));        d->Fill(a[2].v, NAN);   }
+       {       d->Create(mgl_int(a[1].v));     d->Fill(a[2].v, NAN);   }
        else if(!strcmp(k,"dnnn"))
-       {       d->Create(iint(a[1].v));        d->Fill(a[2].v, a[3].v);        }
+       {       d->Create(mgl_int(a[1].v));     d->Fill(a[2].v, a[3].v);        }
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -2300,6 +2506,7 @@ int MGL_NO_EXPORT mgls_facez(mglGraph *gr, long , mglArg *a, const char *k, cons
 int MGL_NO_EXPORT mgls_normsl(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
        if(!d)  return 1;
        if(!strcmp(k,"dnn"))    d->NormSl(a[1].v, a[2].v);
@@ -2312,16 +2519,20 @@ int MGL_NO_EXPORT mgls_normsl(mglGraph *, long , mglArg *a, const char *k, const
 int MGL_NO_EXPORT mgls_momentum(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dds"))    *d = mglData(true,mgl_data_momentum(a[1].d,'z', a[2].s.c_str()));
-       else if(!strcmp(k,"ddss"))      *d = mglData(true,mgl_data_momentum(a[1].d,a[3].s.c_str()[0], a[2].s.c_str()));
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"dds"))       *d = mglData(true,mgl_data_momentum(a[1].d,'z', a[2].s.c_str()));
+       else if(d && !strcmp(k,"ddss")) *d = mglData(true,mgl_data_momentum(a[1].d,a[3].s.c_str()[0], a[2].s.c_str()));
+       else if(c && !strcmp(k,"dds"))  *c = mglDataC(true,mgl_datac_momentum(a[1].d,'z', a[2].s.c_str()));
+       else if(c && !strcmp(k,"ddss")) *c = mglDataC(true,mgl_datac_momentum(a[1].d,a[3].s.c_str()[0], a[2].s.c_str()));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_fit(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
        if(!d)  return 1;
        if(!strcmp(k,"dddddssd"))
@@ -2362,6 +2573,7 @@ int MGL_NO_EXPORT mgls_fit(mglGraph *gr, long , mglArg *a, const char *k, const
 int MGL_NO_EXPORT mgls_fits(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
        if(!d)  return 1;
        if(!strcmp(k,"ddddddssd"))
@@ -2424,10 +2636,13 @@ int MGL_NO_EXPORT mgls_rearrange(mglGraph *, long , mglArg *a, const char *k, co
 {
        int res=0;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dn"))     d->Rearrange(iint(a[1].v));
-       else if(!strcmp(k,"dnn"))       d->Rearrange(iint(a[1].v), iint(a[2].v));
-       else if(!strcmp(k,"dnnn"))      d->Rearrange(iint(a[1].v), iint(a[2].v), iint(a[3].v));
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"dn"))        d->Rearrange(mgl_int(a[1].v));
+       else if(d && !strcmp(k,"dnn"))  d->Rearrange(mgl_int(a[1].v), mgl_int(a[2].v));
+       else if(d && !strcmp(k,"dnnn")) d->Rearrange(mgl_int(a[1].v), mgl_int(a[2].v), mgl_int(a[3].v));
+       else if(c && !strcmp(k,"dn"))   c->Rearrange(mgl_int(a[1].v));
+       else if(c && !strcmp(k,"dnn"))  c->Rearrange(mgl_int(a[1].v), mgl_int(a[2].v));
+       else if(c && !strcmp(k,"dnnn")) c->Rearrange(mgl_int(a[1].v), mgl_int(a[2].v), mgl_int(a[3].v));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -2458,7 +2673,7 @@ int MGL_NO_EXPORT mgls_fgets(mglGraph *gr, long , mglArg *a, const char *k, cons
        FILE *fp;
        if(!strncmp(k,"nns",3))
        {
-               int i, n = (k[3]=='n'?iint(a[3].v):0);
+               int i, n = (k[3]=='n'?mgl_int(a[3].v):0);
                fp = fopen(a[2].s.c_str(),"rt");
                if(!fp)
                {
@@ -2478,7 +2693,7 @@ int MGL_NO_EXPORT mgls_fgets(mglGraph *gr, long , mglArg *a, const char *k, cons
        }
        else if(!strncmp(k,"nnns",4))
        {
-               int i, n = (k[4]=='n'?iint(a[4].v):0);
+               int i, n = (k[4]=='n'?mgl_int(a[4].v):0);
                fp = fopen(a[3].s.c_str(),"rt");
                if(!fp)
                {
@@ -2502,6 +2717,7 @@ int MGL_NO_EXPORT mgls_fgets(mglGraph *gr, long , mglArg *a, const char *k, cons
 int MGL_NO_EXPORT mgls_import(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
        if(!d)  return 1;
        if(!strcmp(k,"dss"))    d->Import(a[1].s.c_str(), a[2].s.c_str());
@@ -2520,7 +2736,7 @@ int MGL_NO_EXPORT mgls_export(mglGraph *, long , mglArg *a, const char *k, const
 int MGL_NO_EXPORT mgls_write(mglGraph *gr, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
-       if(!strcmp(k,""))       gr->WriteFrame("", "MathGL");
+       if(k[0]==0)     gr->WriteFrame("", "MathGL");
        else if(!strcmp(k,"s")) gr->WriteFrame(a[0].s.c_str(), "MathGL");
        else res = 1;   return res;
 }
@@ -2542,6 +2758,7 @@ int MGL_NO_EXPORT mgls_region(mglGraph *gr, long , mglArg *a, const char *k, con
 int MGL_NO_EXPORT mgls_envelop(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
        if(!d)  return 1;
        if(!strcmp(k,"d"))      d->Envelop();
@@ -2552,6 +2769,7 @@ int MGL_NO_EXPORT mgls_envelop(mglGraph *, long , mglArg *a, const char *k, cons
 int MGL_NO_EXPORT mgls_sew(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
        if(!d)  return 1;
        if(!strcmp(k,"d"))      d->Sew();
@@ -2563,20 +2781,36 @@ int MGL_NO_EXPORT mgls_sew(mglGraph *, long , mglArg *a, const char *k, const ch
 int MGL_NO_EXPORT mgls_evaluate(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"ddd"))    *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,0,0,true));
-       else if(!strcmp(k,"dddn"))      *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,0,0, a[3].v!=0));
-       else if(!strcmp(k,"dddd"))      *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,a[3].d,0,true));
-       else if(!strcmp(k,"ddddn"))     *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,a[3].d,0, a[4].v!=0));
-       else if(!strcmp(k,"ddddd"))     *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,a[3].d,a[4].d,true));
-       else if(!strcmp(k,"dddddn"))*d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,a[3].d,a[4].d, a[5].v!=0));
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && k[0]=='d' && k[1]=='d' && k[2]=='d')
+       {
+               if(k[3]==0)     *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,0,0,true));
+               else if(!strcmp(k+3,"n"))       *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,0,0, a[3].v!=0));
+               else if(!strcmp(k+3,"d"))       *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,a[3].d,0,true));
+               else if(!strcmp(k+3,"dn"))      *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,a[3].d,0, a[4].v!=0));
+               else if(!strcmp(k+3,"dd"))      *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,a[3].d,a[4].d,true));
+               else if(!strcmp(k+3,"ddn"))     *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,a[3].d,a[4].d, a[5].v!=0));
+               else res = 1;
+       }
+       else if(c && k[0]=='d' && k[1]=='d' && k[2]=='d')
+       {
+               if(k[3]==0)     *c = mglDataC(true,mgl_datac_evaluate(a[1].d,a[2].d,0,0,true));
+               else if(!strcmp(k+3,"n"))       *c = mglDataC(true,mgl_datac_evaluate(a[1].d,a[2].d,0,0, a[3].v!=0));
+               else if(!strcmp(k+3,"d"))       *c = mglDataC(true,mgl_datac_evaluate(a[1].d,a[2].d,a[3].d,0,true));
+               else if(!strcmp(k+3,"dn"))      *c = mglDataC(true,mgl_datac_evaluate(a[1].d,a[2].d,a[3].d,0, a[4].v!=0));
+               else if(!strcmp(k+3,"dd"))      *c = mglDataC(true,mgl_datac_evaluate(a[1].d,a[2].d,a[3].d,a[4].d,true));
+               else if(!strcmp(k+3,"ddn"))     *c = mglDataC(true,mgl_datac_evaluate(a[1].d,a[2].d,a[3].d,a[4].d, a[5].v!=0));
+               else res = 1;
+       }
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_solve(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
        if(!d)  return 1;
        if(!strcmp(k,"ddns"))   *d = mglData(true,mgl_data_solve(a[1].d, a[2].v, a[3].s[0], 0, true));
@@ -2589,16 +2823,33 @@ int MGL_NO_EXPORT mgls_solve(mglGraph *, long , mglArg *a, const char *k, const
 int MGL_NO_EXPORT mgls_put(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dn"))     d->Put(a[1].v);
-       else if(!strcmp(k,"dnn"))       d->Put(a[1].v, iint(a[2].v));
-       else if(!strcmp(k,"dnnn"))      d->Put(a[1].v, iint(a[2].v),iint(a[3].v));
-       else if(!strcmp(k,"dnnnn"))     d->Put(a[1].v, iint(a[2].v),iint(a[3].v),iint(a[4].v));
-       else if(!strcmp(k,"dd"))        d->Put(*(a[1].d));
-       else if(!strcmp(k,"ddn"))       d->Put(*(a[1].d), iint(a[2].v));
-       else if(!strcmp(k,"ddnn"))      d->Put(*(a[1].d), iint(a[2].v),iint(a[3].v));
-       else if(!strcmp(k,"ddnnn"))     d->Put(*(a[1].d), iint(a[2].v),iint(a[3].v),iint(a[4].v));
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d)
+       {
+               if(!strcmp(k,"dn"))     d->Put(a[1].v);
+               else if(!strcmp(k,"dnn"))       d->Put(a[1].v, mgl_int(a[2].v));
+               else if(!strcmp(k,"dnnn"))      d->Put(a[1].v, mgl_int(a[2].v),mgl_int(a[3].v));
+               else if(!strcmp(k,"dnnnn"))     d->Put(a[1].v, mgl_int(a[2].v),mgl_int(a[3].v),mgl_int(a[4].v));
+               else if(!strcmp(k,"dd"))        d->Put(*(a[1].d));
+               else if(!strcmp(k,"ddn"))       d->Put(*(a[1].d), mgl_int(a[2].v));
+               else if(!strcmp(k,"ddnn"))      d->Put(*(a[1].d), mgl_int(a[2].v),mgl_int(a[3].v));
+               else if(!strcmp(k,"ddnnn"))     d->Put(*(a[1].d), mgl_int(a[2].v),mgl_int(a[3].v),mgl_int(a[4].v));
+               else res = 1;
+       }
+       else if(c)
+       {
+               if(!strcmp(k,"dn"))     c->Put(a[1].c);
+               else if(!strcmp(k,"dnn"))       c->Put(a[1].c, mgl_int(a[2].v));
+               else if(!strcmp(k,"dnnn"))      c->Put(a[1].c, mgl_int(a[2].v),mgl_int(a[3].v));
+               else if(!strcmp(k,"dnnnn"))     c->Put(a[1].c, mgl_int(a[2].v),mgl_int(a[3].v),mgl_int(a[4].v));
+               else if(!strcmp(k,"dd"))        c->Put(*(a[1].d));
+               else if(!strcmp(k,"ddn"))       c->Put(*(a[1].d), mgl_int(a[2].v));
+               else if(!strcmp(k,"ddnn"))      c->Put(*(a[1].d), mgl_int(a[2].v),mgl_int(a[3].v));
+               else if(!strcmp(k,"ddnnn"))     c->Put(*(a[1].d), mgl_int(a[2].v),mgl_int(a[3].v),mgl_int(a[4].v));
+               else res = 1;
+       }
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -2612,22 +2863,29 @@ int MGL_NO_EXPORT mgls_palette(mglGraph *gr, long , mglArg *a, const char *k, co
 int MGL_NO_EXPORT mgls_combine(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!strcmp(k,"ddd") && d)       *d = mglData(true,mgl_data_combine(a[1].d, a[2].d));
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"ddd"))       *d = mglData(true,mgl_data_combine(a[1].d, a[2].d));
+       else if(c && !strcmp(k,"ddd"))  *c = mglDataC(true,mgl_datac_combine(a[1].d, a[2].d));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_correl(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!strcmp(k,"ddds") && d)      *d = mglData(true,mgl_data_correl(a[1].d, a[2].d, a[3].s.c_str()));
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"ddds"))      *d = mglData(true,mgl_data_correl(a[1].d, a[2].d, a[3].s.c_str()));
+       else if(c && !strcmp(k,"ddds")) *c = mglDataC(true,mgl_datac_correl(a[1].d, a[2].d, a[3].s.c_str()));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_roots(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
        if(!d)  return 1;
        if(!strcmp(k,"dsds"))   *d = mglData(true,mgl_data_roots(a[1].s.c_str(), a[2].d, a[3].s[0]));
@@ -2640,6 +2898,7 @@ int MGL_NO_EXPORT mgls_roots(mglGraph *, long , mglArg *a, const char *k, const
 int MGL_NO_EXPORT mgls_ode(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
        if(!d)  return 1;
        if(!strcmp(k,"dssd"))
@@ -2652,85 +2911,145 @@ int MGL_NO_EXPORT mgls_ode(mglGraph *, long , mglArg *a, const char *k, const ch
 int MGL_NO_EXPORT mgls_pde(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
 {
        int res=0;
-       mglData *d = dynamic_cast<mglData *>(a[0].d), *c = dynamic_cast<mglData *>(a[1].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dsdd"))   // TODO mglDataC can be used here
-               *d = gr->PDE(a[1].s.c_str(), *(a[2].d), *(a[3].d), 0.1,100,opt);
-       else if(!strcmp(k,"dsddn"))
-               *d = gr->PDE(a[1].s.c_str(), *(a[2].d), *(a[3].d), a[4].v,100,opt);
-       else if(!strcmp(k,"dsddnn"))
-               *d = gr->PDE(a[1].s.c_str(), *(a[2].d), *(a[3].d), a[4].v,a[5].v,opt);
-       else if(!strcmp(k,"ddsdd") && c)
-       {       mglDataC res = mglDataC(true, mgl_pde_solve_c(gr->Self(),a[2].s.c_str(), a[3].d, a[4].d, 0.1,100,opt));
-               *d = res.Abs(); *c = res.Arg(); }
-       else if(!strcmp(k,"ddsddn") && c)
-       {       mglDataC res = mglDataC(true, mgl_pde_solve_c(gr->Self(),a[2].s.c_str(), a[3].d, a[4].d, a[5].v,100,opt));
-               *d = res.Abs(); *c = res.Arg(); }
-       else if(!strcmp(k,"ddsddnn") && c)
-       {       mglDataC res = mglDataC(true, mgl_pde_solve_c(gr->Self(),a[2].s.c_str(), a[3].d, a[4].d, a[5].v,a[6].v,opt));
-               *d = res.Abs(); *c = res.Arg(); }
+       if(k[0]=='d' && a[0].d->temp)   return 5;
+       if(k[1]=='d' && a[1].d->temp)   return 5;
+       mglData *d = dynamic_cast<mglData *>(a[0].d), *f = dynamic_cast<mglData *>(a[1].d);
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && f)
+       {
+               mglDataC r;
+               if(!strcmp(k,"ddsdd"))
+                       r = gr->PDEc(a[2].s.c_str(), *(a[3].d), *(a[4].d), 0.1,100,opt);
+               else if(!strcmp(k,"ddsddn"))
+                       r = gr->PDEc(a[2].s.c_str(), *(a[3].d), *(a[4].d), a[5].v,100,opt);
+               else if(!strcmp(k,"ddsddnn"))
+                       r = gr->PDEc(a[2].s.c_str(), *(a[3].d), *(a[4].d), a[5].v,a[6].v,opt);
+               else res = 1;
+               if(res==0)      {       *d = r.Abs();   *f = r.Arg();   }
+       }
+       else if(d)
+       {
+               if(!strcmp(k,"dsdd"))
+                       *d = gr->PDE(a[1].s.c_str(), *(a[2].d), *(a[3].d), 0.1,100,opt);
+               else if(!strcmp(k,"dsddn"))
+                       *d = gr->PDE(a[1].s.c_str(), *(a[2].d), *(a[3].d), a[4].v,100,opt);
+               else if(!strcmp(k,"dsddnn"))
+                       *d = gr->PDE(a[1].s.c_str(), *(a[2].d), *(a[3].d), a[4].v,a[5].v,opt);
+               else res = 1;
+       }
+       else if(c)
+       {
+               if(!strcmp(k,"dsdd"))
+                       *c = gr->PDEc(a[1].s.c_str(), *(a[2].d), *(a[3].d), 0.1,100,opt);
+               else if(!strcmp(k,"dsddn"))
+                       *c = gr->PDEc(a[1].s.c_str(), *(a[2].d), *(a[3].d), a[4].v,100,opt);
+               else if(!strcmp(k,"dsddnn"))
+                       *c = gr->PDEc(a[1].s.c_str(), *(a[2].d), *(a[3].d), a[4].v,a[5].v,opt);
+               else res = 1;
+       }
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_qo2d(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
-       mglData *d = dynamic_cast<mglData *>(a[0].d), *c = dynamic_cast<mglData *>(a[1].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dsddd"))
-               *d = mglData(true, mgl_qo2d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, 1,100, 0,0));
-       else if(!strcmp(k,"dsdddn"))
-               *d = mglData(true, mgl_qo2d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,100, 0,0));
-       else if(!strcmp(k,"dsdddnn"))
-               *d = mglData(true, mgl_qo2d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, 0,0));
-       else if(!strcmp(k,"dsdddnndd"))
-               *d = mglData(true, mgl_qo2d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, dynamic_cast<mglData *>(a[7].d),dynamic_cast<mglData *>(a[8].d)));
-       else if(!strcmp(k,"ddsddd") && c)
-       {       mglDataC res = mglDataC(true, mgl_qo2d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, 1,100, 0,0));
-               *d = res.Abs(); *c = res.Arg(); }
-       else if(!strcmp(k,"ddsdddn") && c)
-       {       mglDataC res = mglDataC(true, mgl_qo2d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,100, 0,0));
-               *d = res.Abs(); *c = res.Arg(); }
-       else if(!strcmp(k,"ddsdddnn") && c)
-       {       mglDataC res = mglDataC(true, mgl_qo2d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,a[7].v, 0,0));
-               *d = res.Abs(); *c = res.Arg(); }
-       else if(!strcmp(k,"ddsdddnndd") && c)
-       {       mglDataC res = mglDataC(true, mgl_qo2d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,a[7].v, dynamic_cast<mglData *>(a[8].d),dynamic_cast<mglData *>(a[9].d)));
-               *d = res.Abs(); *c = res.Arg(); }
+       if(k[0]=='d' && a[0].d->temp)   return 5;
+       if(k[1]=='d' && a[1].d->temp)   return 5;
+       mglData *d = dynamic_cast<mglData *>(a[0].d), *f = dynamic_cast<mglData *>(a[1].d);
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && f)
+       {
+               mglDataC r;
+               if(!strcmp(k,"ddsddd"))
+                       r = mglDataC(true, mgl_qo2d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, 1,100, 0,0));
+               else if(!strcmp(k,"ddsdddn"))
+                       r = mglDataC(true, mgl_qo2d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,100, 0,0));
+               else if(!strcmp(k,"ddsdddnn"))
+                       r = mglDataC(true, mgl_qo2d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,a[7].v, 0,0));
+               else if(!strcmp(k,"ddsdddnndd"))
+                       r = mglDataC(true, mgl_qo2d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,a[7].v, dynamic_cast<mglData *>(a[8].d),dynamic_cast<mglData *>(a[9].d)));
+               else res = 1;
+               if(res==0)      {       *d = r.Abs();   *f = r.Arg();   }
+       }
+       else if(d)
+       {
+               if(!strcmp(k,"dsddd"))
+                       *d = mglData(true, mgl_qo2d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, 1,100, 0,0));
+               else if(!strcmp(k,"dsdddn"))
+                       *d = mglData(true, mgl_qo2d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,100, 0,0));
+               else if(!strcmp(k,"dsdddnn"))
+                       *d = mglData(true, mgl_qo2d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, 0,0));
+               else if(!strcmp(k,"dsdddnndd"))
+                       *d = mglData(true, mgl_qo2d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, dynamic_cast<mglData *>(a[7].d),dynamic_cast<mglData *>(a[8].d)));
+               else res = 1;
+       }
+       else if(c)
+       {
+               if(!strcmp(k,"dsddd"))
+                       *c = mglDataC(true, mgl_qo2d_solve_c(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, 1,100, 0,0));
+               else if(!strcmp(k,"dsdddn"))
+                       *c = mglDataC(true, mgl_qo2d_solve_c(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,100, 0,0));
+               else if(!strcmp(k,"dsdddnn"))
+                       *c = mglDataC(true, mgl_qo2d_solve_c(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, 0,0));
+               else if(!strcmp(k,"dsdddnndd"))
+                       *c = mglDataC(true, mgl_qo2d_solve_c(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, dynamic_cast<mglData *>(a[7].d),dynamic_cast<mglData *>(a[8].d)));
+               else res = 1;
+       }
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_qo3d(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
-       mglData *d = dynamic_cast<mglData *>(a[0].d), *c = dynamic_cast<mglData *>(a[1].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dsddd"))
-               *d = mglData(true, mgl_qo3d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, 1,100, 0,0,0));
-       else if(!strcmp(k,"dsdddn"))
-               *d = mglData(true, mgl_qo3d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,100, 0,0,0));
-       else if(!strcmp(k,"dsdddnn"))
-               *d = mglData(true, mgl_qo3d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, 0,0,0));
-       else if(!strcmp(k,"dsdddnnddd"))
-               *d = mglData(true, mgl_qo3d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, dynamic_cast<mglData *>(a[7].d),dynamic_cast<mglData *>(a[8].d),dynamic_cast<mglData *>(a[9].d)));
-       else if(!strcmp(k,"ddsddd") && c)
-       {       mglDataC res = mglDataC(true, mgl_qo3d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, 1,100, 0,0,0));
-               *d = res.Abs(); *c = res.Arg(); }
-       else if(!strcmp(k,"ddsdddn") && c)
-       {       mglDataC res = mglDataC(true, mgl_qo3d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,100, 0,0,0));
-               *d = res.Abs(); *c = res.Arg(); }
-       else if(!strcmp(k,"ddsdddnn") && c)
-       {       mglDataC res = mglDataC(true, mgl_qo3d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,a[7].v, 0,0,0));
-               *d = res.Abs(); *c = res.Arg(); }
-       else if(!strcmp(k,"ddsdddnnddd") && c)
-       {       mglDataC res = mglDataC(true, mgl_qo3d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,a[7].v, dynamic_cast<mglData *>(a[8].d),dynamic_cast<mglData *>(a[9].d),dynamic_cast<mglData *>(a[10].d)));
-               *d = res.Abs(); *c = res.Arg(); }
+       if(k[0]=='d' && a[0].d->temp)   return 5;
+       if(k[1]=='d' && a[1].d->temp)   return 5;
+       mglData *d = dynamic_cast<mglData *>(a[0].d), *f = dynamic_cast<mglData *>(a[1].d);
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && f)
+       {
+               mglDataC r;
+               if(!strcmp(k,"ddsddd"))
+                       r = mglDataC(true, mgl_qo3d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, 1,100, 0,0,0));
+               else if(!strcmp(k,"ddsdddn"))
+                       r = mglDataC(true, mgl_qo3d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,100, 0,0,0));
+               else if(!strcmp(k,"ddsdddnn"))
+                       r = mglDataC(true, mgl_qo3d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,a[7].v, 0,0,0));
+               else if(!strcmp(k,"ddsdddnnddd"))
+                       r = mglDataC(true, mgl_qo3d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,a[7].v, dynamic_cast<mglData *>(a[8].d),dynamic_cast<mglData *>(a[9].d),dynamic_cast<mglData *>(a[10].d)));
+               else res = 1;
+               if(res==0)      {       *d = r.Abs();   *f = r.Arg();   }
+       }
+       else if(d)
+       {
+               if(!strcmp(k,"dsddd"))
+                       *d = mglData(true, mgl_qo3d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, 1,100, 0,0,0));
+               else if(!strcmp(k,"dsdddn"))
+                       *d = mglData(true, mgl_qo3d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,100, 0,0,0));
+               else if(!strcmp(k,"dsdddnn"))
+                       *d = mglData(true, mgl_qo3d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, 0,0,0));
+               else if(!strcmp(k,"dsdddnnddd"))
+                       *d = mglData(true, mgl_qo3d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, dynamic_cast<mglData *>(a[7].d),dynamic_cast<mglData *>(a[8].d),dynamic_cast<mglData *>(a[9].d)));
+               else res = 1;
+       }
+       else if(c)
+       {
+               if(!strcmp(k,"dsddd"))
+                       *c = mglDataC(true, mgl_qo3d_solve_c(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, 1,100, 0,0,0));
+               else if(!strcmp(k,"dsdddn"))
+                       *c = mglDataC(true, mgl_qo3d_solve_c(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,100, 0,0,0));
+               else if(!strcmp(k,"dsdddnn"))
+                       *c = mglDataC(true, mgl_qo3d_solve_c(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, 0,0,0));
+               else if(!strcmp(k,"dsdddnnddd"))
+                       *c = mglDataC(true, mgl_qo3d_solve_c(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, dynamic_cast<mglData *>(a[7].d),dynamic_cast<mglData *>(a[8].d),dynamic_cast<mglData *>(a[9].d)));
+               else res = 1;
+       }
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_ray(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
        if(!d)  return 1;
        if(!strcmp(k,"dsnnnn"))
@@ -2747,6 +3066,7 @@ int MGL_NO_EXPORT mgls_ray(mglGraph *, long , mglArg *a, const char *k, const ch
 int MGL_NO_EXPORT mgls_jacobian(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
        if(!d)  return 1;
        if(!strcmp(k,"ddd"))    *d = mglJacobian(*(a[1].d), *(a[2].d));
@@ -2794,7 +3114,7 @@ int MGL_NO_EXPORT mgls_origintick(mglGraph *gr, long , mglArg *a, const char *k,
 int MGL_NO_EXPORT mgls_axisstl(mglGraph *gr, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
-       if(!strcmp(k,""))       gr->SetAxisStl();
+       if(k[0]==0)     gr->SetAxisStl();
        else if(!strcmp(k,"s")) gr->SetAxisStl(a[0].s.c_str());
        else if(!strcmp(k,"ss"))        gr->SetAxisStl(a[0].s.c_str(), a[1].s.c_str());
        else if(!strcmp(k,"sss"))       gr->SetAxisStl(a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str());
@@ -2815,7 +3135,7 @@ int MGL_NO_EXPORT mgls_ranges(mglGraph *gr, long , mglArg *a, const char *k, con
 int MGL_NO_EXPORT mgls_adjust(mglGraph *gr, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
-       if(!strcmp(k,""))       gr->Adjust();
+       if(k[0]==0)     gr->Adjust();
        else if(!strcmp(k,"s")) gr->Adjust(a[0].s.c_str());
        else res = 1;   return res;
 }
@@ -2823,36 +3143,48 @@ int MGL_NO_EXPORT mgls_adjust(mglGraph *gr, long , mglArg *a, const char *k, con
 int MGL_NO_EXPORT mgls_insert(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"ds"))     d->Insert(a[1].s.c_str()[0]);
-       else if(!strcmp(k,"dsn"))       d->Insert(a[1].s.c_str()[0], iint(a[2].v));
-       else if(!strcmp(k,"dsnn"))      d->Insert(a[1].s.c_str()[0], iint(a[2].v), iint(a[3].v));
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"ds"))        d->Insert(a[1].s.c_str()[0]);
+       else if(d && !strcmp(k,"dsn"))  d->Insert(a[1].s.c_str()[0], mgl_int(a[2].v));
+       else if(d && !strcmp(k,"dsnn")) d->Insert(a[1].s.c_str()[0], mgl_int(a[2].v), mgl_int(a[3].v));
+       else if(c && !strcmp(k,"ds"))   c->Insert(a[1].s.c_str()[0]);
+       else if(c && !strcmp(k,"dsn"))  c->Insert(a[1].s.c_str()[0], mgl_int(a[2].v));
+       else if(c && !strcmp(k,"dsnn")) c->Insert(a[1].s.c_str()[0], mgl_int(a[2].v), mgl_int(a[3].v));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_delete(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"ds"))     d->Delete(a[1].s.c_str()[0]);
-       else if(!strcmp(k,"dsn"))       d->Delete(a[1].s.c_str()[0], iint(a[2].v));
-       else if(!strcmp(k,"dsnn"))      d->Delete(a[1].s.c_str()[0], iint(a[2].v), iint(a[3].v));
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"ds"))        d->Delete(a[1].s.c_str()[0]);
+       else if(d && !strcmp(k,"dsn"))  d->Delete(a[1].s.c_str()[0], mgl_int(a[2].v));
+       else if(d && !strcmp(k,"dsnn")) d->Delete(a[1].s.c_str()[0], mgl_int(a[2].v), mgl_int(a[3].v));
+       else if(c && !strcmp(k,"ds"))   c->Delete(a[1].s.c_str()[0]);
+       else if(c && !strcmp(k,"dsn"))  c->Delete(a[1].s.c_str()[0], mgl_int(a[2].v));
+       else if(c && !strcmp(k,"dsnn")) c->Delete(a[1].s.c_str()[0], mgl_int(a[2].v), mgl_int(a[3].v));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_roll(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!strcmp(k,"dsn") && d)       d->Roll(a[1].s.c_str()[0], iint(a[2].v));
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"dsn"))       d->Roll(a[1].s.c_str()[0], mgl_int(a[2].v));
+       else if(c && !strcmp(k,"dsn"))  c->Roll(a[1].s.c_str()[0], mgl_int(a[2].v));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
 int MGL_NO_EXPORT mgls_datagrid(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
        if(!strcmp(k,"dddd") && d)      gr->DataGrid(*d, *(a[1].d), *(a[2].d), *(a[3].d),opt);
        else res = 1;   return res;
@@ -2861,6 +3193,7 @@ int MGL_NO_EXPORT mgls_datagrid(mglGraph *gr, long , mglArg *a, const char *k, c
 int MGL_NO_EXPORT mgls_triangulate(mglGraph *, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
        mglData *d = dynamic_cast<mglData *>(a[0].d);
        if(!d)  return 1;
        if(!strcmp(k,"ddd"))            *d = mglTriangulation(*(a[1].d), *(a[2].d));
@@ -2896,8 +3229,8 @@ int MGL_NO_EXPORT mgls_zoomaxis(mglGraph *gr, long , mglArg *a, const char *k, c
 int MGL_NO_EXPORT mgls_drawreg(mglGraph *gr, long , mglArg *a, const char *k, const char *)
 {
        int res=0;
-       if(!strcmp(k,""))       gr->SetDrawReg();
-       else if(!strcmp(k,"nnn"))       gr->SetDrawReg(iint(a[0].v), iint(a[1].v), iint(a[2].v));
+       if(k[0]==0)     gr->SetDrawReg();
+       else if(!strcmp(k,"nnn"))       gr->SetDrawReg(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v));
        else res = 1;   return res;
 }
 //-----------------------------------------------------------------------------
@@ -2905,7 +3238,7 @@ int MGL_NO_EXPORT mgls_version(mglGraph *gr, long , mglArg *a, const char *k, co
 {
        int res=0;
        char buf[32];   sprintf(buf,"MathGL version is 2.%g",MGL_VER2);
-       if(!strcmp(k,""))       gr->SetWarn(-1,buf);
+       if(k[0]==0)     gr->SetWarn(-1,buf);
        else if(!strcmp(k,"s")) res = mgl_check_version(a[0].s.c_str())?1:0;
        else res = 1;   return res;
 }
@@ -2922,6 +3255,7 @@ mglCommand mgls_base_cmd[] = {
        {"arrowsize","Set size of arrows","arrowsize val", mgls_arrowsize ,2},
        {"ask","Define parameter from user input","ask $N 'question'", 0, 6},
        {"aspect","Set aspect ration","aspect valx valy [valz]", mgls_aspect ,5},
+       {"attachlight","Attach light settings to inplot","attachlight val", mgls_attachlight ,2},
        {"axial","Draw surfaces of contour lines rotation","axial Zdat ['fmt' num]|Xdat Ydat Zdat ['fmt' num]", mgls_axial ,8},
        {"axis","Setup or draw axis","axis ['dir' 'fmt']|'fx' 'fy' 'fz' ['fc']|how", mgls_axis ,12},
        {"axisstl","Set axis and tick style","axisstl 'stl' ['sub']", mgls_axisstl ,14},
@@ -2979,7 +3313,7 @@ mglCommand mgls_base_cmd[] = {
        {"defchr","Define parameter as character","defchr $N val", 0, 6},
        {"define","Define constant or parameter","define $N sth | Var val", 0, 6},
        {"defnum","Define parameter as numerical value","defnum $N val", 0, 6},
-       {"defpal","Define parameter as palette color","defpal $N val", 0, 6},
+//     {"defpal","Define parameter as palette color","defpal $N val", 0, 6},
        {"delete","Delete slice of data","delete Dat 'dir' [pos=0 num=1]", mgls_delete ,3},
        {"dens","Draw density plot","dens Zdat ['fmt' zpos]|Xdat Ydat Zdat ['fmt' zpos]", mgls_dens ,8},
        {"dens3","Draw density plot at slices of 3D data","dens3 Adat 'dir' [pos 'fmt']|Xdat Ydat Zdat Adat 'dir' [pos 'fmt']", mgls_dens3 ,9},
@@ -3020,7 +3354,7 @@ mglCommand mgls_base_cmd[] = {
        {"fog","Switch on/off fog","fog val [pos]", mgls_fog ,2},
        {"font","Setup font","font 'fmt' [size]", mgls_font ,15},
        {"for","For cycle","for $N v1 v2 [dv] | $N Dat", 0, 6},
-       {"fourier","In-place Fourier transform","fourier ReDat ImDat 'dir'", mgls_fourier , 16},
+       {"fourier","In-place Fourier transform","fourier ReDat ImDat 'dir'|Cmplx 'dir'", mgls_fourier , 16},
        {"fplot","Plot curve by formula","fplot 'y_x' ['fmt']|'x_t' 'y_t' 'z_t' ['fmt']", mgls_fplot ,1},
        {"fsurf","Plot surface by formula","fsurf 'z_xy' ['fmt']|'x_uv' 'y_uv' 'z_uv' ['fmt']", mgls_fsurf ,1},
        {"func","Start function definition and stop execution of main script","func 'name' [narg]", 0, 6},
@@ -3101,6 +3435,7 @@ mglCommand mgls_base_cmd[] = {
        {"resize","Resize data","resize Res Dat mx [my mz]", mgls_resize ,4},
        {"return","Return from function","return", 0, 6},
        {"rhomb","Draw rhombus","rhomb x1 y1 x2 y2 r ['fmt']|x1 y1 z1 x2 y2 z2 r ['fmt']", mgls_rhomb ,13},
+       {"rkstep","Apply Runge-Kutta","rkstep 'Diff1;Diff2;...' 'Var1;Var2;...' [dt]", 0, 6},
        {"roll","Roll data along direction","roll Dat 'dir' num", mgls_roll ,16},
        {"roots", "Find roots using data as initial values", "roots Res 'func' Ini ['var']|Res 'func' ini ['var']", mgls_roots ,4},
        {"rotate","Rotate plot","rotate tetz tetx [tety] | tet x y z", mgls_rotate ,5},
@@ -3129,8 +3464,10 @@ mglCommand mgls_base_cmd[] = {
        {"surf3","Draw isosurface for 3D data","surf3 Adat ['fmt' num]|Xdat Ydat Zdat Adat ['fmt' num]|Adat val ['fmt']|Xdat Ydat Zdat Adat val ['fmt']", mgls_surf3 ,9},
        {"surf3a","Draw isosurface for 3D data transpared by other data","surf3a Adat Cdat ['fmt' num]|Xdat Ydat Zdat Adat Cdat ['fmt' num]|Adat Cdat val ['fmt']|Xdat Ydat Zdat Adat Cdat val ['fmt']", mgls_surf3a ,10},
        {"surf3c","Draw isosurface for 3D data colored by other data","surf3c Adat Cdat ['fmt' num]|Xdat Ydat Zdat Adat Cdat ['fmt' num]|Adat Cdat val ['fmt']|Xdat Ydat Zdat Adat Cdat val ['fmt']", mgls_surf3c ,10},
+       {"surf3ca","Draw isosurface for 3D data colored and transpared by other data","surf3c Adat Cdat Bdat ['fmt' num]|Xdat Ydat Zdat Adat Cdat Bdat ['fmt' num]|Adat Cdat Bdat val ['fmt']|Xdat Ydat Zdat Adat Cdat Bdat val ['fmt']", mgls_surf3ca ,10},
        {"surfa","Draw solid surface transpared by other data","surfa Zdat Cdat ['fmt']|Xdat Ydat Zdat Cdat ['fmt']", mgls_surfa ,10},
        {"surfc","Draw solid surface colored by other data","surfc Zdat Cdat ['fmt']|Xdat Ydat Zdat Cdat ['fmt']", mgls_surfc ,10},
+       {"surfca","Draw solid surface colored and transpared by other data","surfca Zdat Cdat Adat ['fmt']|Xdat Ydat Zdat Cdat Adat ['fmt']", mgls_surfca ,10},
        {"swap","Swap data (usefull after Fourier transform)","swap Dat 'dir'", mgls_swap ,16},
        {"table","Draw table with data values","table Dat ['txt' 'fmt']|x y Dat ['txt' 'fmt']", mgls_table ,7},
        {"tape","Draw binormales for 1D data","tape Ydat ['fmt']|Xdat Ydat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_tape ,7},
@@ -3163,6 +3500,7 @@ mglCommand mgls_base_cmd[] = {
        {"vect3","Draw vector field at slices of 3D data","vect Udat Vdat Wdat ['fmt' sval]|Xdat Ydat Zdat Udat Vdat Wdat ['fmt' sval]", mgls_vect3 ,11},
        {"version","Print MathGL version or check if it is valid","version |'ver'", mgls_version, 2},
        {"view","Change view angles - use 'rotate' for plot rotation","view tetz tetx [tety]", mgls_view ,5},
+       {"wavelet","Wavelet transform at some direction","wavelet Dat 'dir' k", mgls_wavelet ,16},
        {"write","Write current image to graphical file","write ['fname']", mgls_write ,2},
        {"xlabel","Draw label for x-axis","xlabel 'txt' [pos]", mgls_xlabel ,12},
        {"xrange","Set range for x-axis","xrange Dat [add] | x1 x2 [add]", mgls_xrange ,14},
index 01a9b94ca54478cd75fd2bb25c261a91ed153dbe..4c6c7a22aa9737e67ba5fc211ec7b48d8e24d828 100644 (file)
@@ -62,16 +62,16 @@ bool MGL_LOCAL_PURE mgl_is_same(HMGL gr, long i, mreal wp,uint32_t cp, int st)
        return (cp==_Gr_->GetPrmCol(i));
 }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT put_line(HMGL gr, void *fp, bool gz, long i, mreal wp, uint32_t cp,int st, const char *ifmt, const char *nfmt, bool neg, mreal fc)
+std::vector<long> MGL_NO_EXPORT put_line(HMGL gr, long i, mreal wp, uint32_t cp,int st)
 {
+       std::vector<long> ids;
        long n1=gr->GetPrm(i).n1, n2=gr->GetPrm(i).n2;
        if(n1>n2)       {       n1=gr->GetPrm(i).n2;    n2=gr->GetPrm(i).n1;    }
-       if(n1<0 || n2<0)        return;
+       if(n1<0 || n2<0)        return ids;
        const mglPnt &pp1 = gr->GetPnt(n1), &pp2 = gr->GetPnt(n2);
        mreal x0=pp1.x, y0=pp1.y;
        bool ok=true;
-       register long j;        // first point
-       std::vector<long> ids;
+       long j; // first point
        while(ok)       // try to find starting point
        {
                for(ok=false,j=i+1;j<gr->GetPrmNum();j++)
@@ -121,12 +121,7 @@ void MGL_NO_EXPORT put_line(HMGL gr, void *fp, bool gz, long i, mreal wp, uint32
                        }
                }
        }
-       for(size_t j=0;j<ids.size();j++)
-       {
-               const mglPnt &p = gr->GetPnt(ids[j]);
-               x0 = p.x;       y0 = p.y;
-               mgl_printf(fp, gz, j>0?nfmt:ifmt,fc*x0,(neg?_Gr_->GetHeight()-y0:y0)*fc);
-       }
+       return ids;
 }
 //-----------------------------------------------------------------------------
 //put_desc(fp,"%c%c%c_%04x {", "np %d %d mt %d %d ll %d %d ll cp fill\n",
@@ -343,7 +338,13 @@ void MGL_EXPORT mgl_write_eps(HMGL gr, const char *fname,const char *descr)
                {
                        snprintf(str,256,"%.2g lw %.2g %.2g %.2g rgb ", q.w>1 ? q.w:1., cp.r[0]/255.,cp.r[1]/255.,cp.r[2]/255.);
                        str[255]=0;     wp = q.w>1  ? q.w:1;    st = q.n3;
-                       put_line(gr,fp,gz,i,wp,cp.c,st, "np %g %g mt ", "%g %g ll ", false, 1);
+                       std::vector<long> ids = put_line(gr,i,wp,cp.c,st);
+                       for(size_t j=0;j<ids.size();j++)
+                       {
+                               const mglPnt &p = gr->GetPnt(ids[j]);
+                               register float x0 = p.x, y0 = p.y;
+                               mgl_printf(fp, gz, j==0?"np %g %g mt ":"%g %g ll ",x0,y0);
+                       }
                        const char *sd = mgl_get_dash(q.n3,q.w,' ');
                        if(sd && sd[0]) mgl_printf(fp, gz, "%s [%s] %g sd dr\n",str,sd,q.w*q.s);
                        else                    mgl_printf(fp, gz, "%s d0 dr\n",str);
@@ -514,7 +515,13 @@ void MGL_EXPORT mgl_write_svg(HMGL gr, const char *fname,const char *descr)
                        }
                        if(q.w>1)       mgl_printf(fp, gz, " stroke-width=\"%g\"", q.w);
                        wp = q.w>1  ? q.w:1;    st = q.n3;
-                       put_line(gr,fp,gz,i,wp,cp.c,st, "><path d=\" M %g %g", " L %g %g", true, 1);
+                       std::vector<long> ids = put_line(gr,i,wp,cp.c,st);
+                       for(size_t j=0;j<ids.size();j++)
+                       {
+                               const mglPnt &p = gr->GetPnt(ids[j]);
+                               register float x0 = p.x, y0 = p.y;
+                               mgl_printf(fp, gz, j==0?"><path d=\" M %g %g":" L %g %g",x0,_Gr_->GetHeight()-y0);
+                       }
                        mgl_printf(fp, gz, "\"/> </g>\n");
                }
                else if(q.type==2 && cp.r[3])
@@ -573,32 +580,32 @@ void MGL_EXPORT mgl_write_tex(HMGL gr, const char *fname,const char *descr)
        if(gr->GetPrmNum()<1)   return;
        _Gr_->clr(MGL_FINISHED);        _Gr_->PreparePrim(1);
 
-       FILE *fp = fopen(fname,"wt");
+       FILE *fp = fopen(fname,"w");    fwide(fp,1);
        if(!fp)         {       gr->SetWarn(mglWarnOpen,fname); return; }
        const std::string loc = setlocale(LC_NUMERIC, NULL);    setlocale(LC_NUMERIC, "C");
-       fprintf(fp, "%% Created by MathGL library\n%% Title: %s\n\n",descr?descr:fname);
+       fwprintf(fp, L"%% Created by MathGL library\n%% Title: %s\n\n",descr?descr:fname);
        // provide marks
-       fprintf(fp, "\\providecommand{\\mglp}[4]{\\draw[#3] (#1-#4, #2) -- (#1+#4,#2) (#1,#2-#4) -- (#1,#2+#4);}\n");
-       fprintf(fp, "\\providecommand{\\mglx}[4]{\\draw[#3] (#1-#4, #2-#4) -- (#1+#4,#2+#4) (#1+#4,#2-#4) -- (#1-#4,#2+#4);}\n");
-       fprintf(fp, "\\providecommand{\\mgls}[4]{\\draw[#3] (#1-#4, #2-#4) -- (#1+#4,#2-#4) -- (#1+#4,#2+#4) -- (#1-#4,#2+#4) -- cycle;}\n");
-       fprintf(fp, "\\providecommand{\\mglS}[4]{\\fill[#3] (#1-#4, #2-#4) -- (#1+#4,#2-#4) -- (#1+#4,#2+#4) -- (#1-#4,#2+#4) -- cycle;}\n");
-       fprintf(fp, "\\providecommand{\\mgld}[4]{\\draw[#3] (#1, #2-#4) -- (#1+#4,#2) -- (#1,#2+#4) -- (#1-#4,#2) -- cycle;}\n");
-       fprintf(fp, "\\providecommand{\\mglD}[4]{\\fill[#3] (#1, #2-#4) -- (#1+#4,#2) -- (#1,#2+#4) -- (#1-#4,#2) -- cycle;}\n");
-       fprintf(fp, "\\providecommand{\\mglv}[4]{\\draw[#3] (#1-#4, #2+#4/2) -- (#1+#4,#2+#4/2) -- (#1,#2-#4) -- cycle;}\n");
-       fprintf(fp, "\\providecommand{\\mglV}[4]{\\fill[#3] (#1-#4, #2+#4/2) -- (#1+#4,#2+#4/2) -- (#1,#2-#4) -- cycle;}\n");
-       fprintf(fp, "\\providecommand{\\mglt}[4]{\\draw[#3] (#1-#4, #2-#4/2) -- (#1+#4,#2-#4/2) -- (#1,#2+#4) -- cycle;}\n");
-       fprintf(fp, "\\providecommand{\\mglT}[4]{\\fill[#3] (#1-#4, #2-#4/2) -- (#1+#4,#2-#4/2) -- (#1,#2+#4) -- cycle;}\n");
-       fprintf(fp, "\\providecommand{\\mgll}[4]{\\draw[#3] (#1+#4/2, #2-#4) -- (#1+#4/2,#2+#4) -- (#1-#4,#2) -- cycle;}\n");
-       fprintf(fp, "\\providecommand{\\mglL}[4]{\\fill[#3] (#1+#4/2, #2-#4) -- (#1+#4/2,#2+#4) -- (#1-#4,#2) -- cycle;}\n");
-       fprintf(fp, "\\providecommand{\\mglr}[4]{\\draw[#3] (#1-#4/2, #2-#4) -- (#1-#4/2,#2+#4) -- (#1+#4,#2) -- cycle;}\n");
-       fprintf(fp, "\\providecommand{\\mglR}[4]{\\fill[#3] (#1-#4/2, #2-#4) -- (#1-#4/2,#2+#4) -- (#1+#4,#2) -- cycle;}\n");
-       fprintf(fp, "\\providecommand{\\mglR}[4]{\\draw[#3] (#1, #2-#4) -- (#1,#2) -- (#1-#4,#2+#4) (#1,#2) -- (#1+#4,#2+#4);}\n");
-       fprintf(fp, "\\providecommand{\\mgla}[4]{\\draw[#3] (#1-#4, #2) -- (#1+#4,#2) (#1-0.6*#4,#2-0.8*#4) -- (#1+0.6*#4,#2+0.8*#4) (#1-0.6*#4,#2+0.8*#4) -- (#1+0.6*#4,#2-0.8*#4);}\n");
-       fprintf(fp, "\\providecommand{\\mglY}[4]{\\draw[#3] (#1, #2-#4) -- (#1,#2) (#1-#4,#2+#4) -- (#1,#2) (#1+#4,#2+#4) -- (#1,#2);}\n");
-       fprintf(fp, "\\providecommand{\\mglo}[4]{\\draw[#3] (#1, #2) circle (#4);}\n");
-       fprintf(fp, "\\providecommand{\\mglO}[4]{\\fill[#3] (#1, #2) circle (#4);}\n");
-       fprintf(fp, "\\providecommand{\\mglc}[3]{\\draw[#3] (#1, #2) circle (%g);}\n\n", 4e-4*gr->mark_size());
-       fprintf(fp, "\\begin{tikzpicture}\n");
+       fwprintf(fp, L"\\providecommand{\\mglp}[4]{\\draw[#3] (#1-#4, #2) -- (#1+#4,#2) (#1,#2-#4) -- (#1,#2+#4);}\n");
+       fwprintf(fp, L"\\providecommand{\\mglx}[4]{\\draw[#3] (#1-#4, #2-#4) -- (#1+#4,#2+#4) (#1+#4,#2-#4) -- (#1-#4,#2+#4);}\n");
+       fwprintf(fp, L"\\providecommand{\\mgls}[4]{\\draw[#3] (#1-#4, #2-#4) -- (#1+#4,#2-#4) -- (#1+#4,#2+#4) -- (#1-#4,#2+#4) -- cycle;}\n");
+       fwprintf(fp, L"\\providecommand{\\mglS}[4]{\\fill[#3] (#1-#4, #2-#4) -- (#1+#4,#2-#4) -- (#1+#4,#2+#4) -- (#1-#4,#2+#4) -- cycle;}\n");
+       fwprintf(fp, L"\\providecommand{\\mgld}[4]{\\draw[#3] (#1, #2-#4) -- (#1+#4,#2) -- (#1,#2+#4) -- (#1-#4,#2) -- cycle;}\n");
+       fwprintf(fp, L"\\providecommand{\\mglD}[4]{\\fill[#3] (#1, #2-#4) -- (#1+#4,#2) -- (#1,#2+#4) -- (#1-#4,#2) -- cycle;}\n");
+       fwprintf(fp, L"\\providecommand{\\mglv}[4]{\\draw[#3] (#1-#4, #2+#4/2) -- (#1+#4,#2+#4/2) -- (#1,#2-#4) -- cycle;}\n");
+       fwprintf(fp, L"\\providecommand{\\mglV}[4]{\\fill[#3] (#1-#4, #2+#4/2) -- (#1+#4,#2+#4/2) -- (#1,#2-#4) -- cycle;}\n");
+       fwprintf(fp, L"\\providecommand{\\mglt}[4]{\\draw[#3] (#1-#4, #2-#4/2) -- (#1+#4,#2-#4/2) -- (#1,#2+#4) -- cycle;}\n");
+       fwprintf(fp, L"\\providecommand{\\mglT}[4]{\\fill[#3] (#1-#4, #2-#4/2) -- (#1+#4,#2-#4/2) -- (#1,#2+#4) -- cycle;}\n");
+       fwprintf(fp, L"\\providecommand{\\mgll}[4]{\\draw[#3] (#1+#4/2, #2-#4) -- (#1+#4/2,#2+#4) -- (#1-#4,#2) -- cycle;}\n");
+       fwprintf(fp, L"\\providecommand{\\mglL}[4]{\\fill[#3] (#1+#4/2, #2-#4) -- (#1+#4/2,#2+#4) -- (#1-#4,#2) -- cycle;}\n");
+       fwprintf(fp, L"\\providecommand{\\mglr}[4]{\\draw[#3] (#1-#4/2, #2-#4) -- (#1-#4/2,#2+#4) -- (#1+#4,#2) -- cycle;}\n");
+       fwprintf(fp, L"\\providecommand{\\mglR}[4]{\\fill[#3] (#1-#4/2, #2-#4) -- (#1-#4/2,#2+#4) -- (#1+#4,#2) -- cycle;}\n");
+       fwprintf(fp, L"\\providecommand{\\mglR}[4]{\\draw[#3] (#1, #2-#4) -- (#1,#2) -- (#1-#4,#2+#4) (#1,#2) -- (#1+#4,#2+#4);}\n");
+       fwprintf(fp, L"\\providecommand{\\mgla}[4]{\\draw[#3] (#1-#4, #2) -- (#1+#4,#2) (#1-0.6*#4,#2-0.8*#4) -- (#1+0.6*#4,#2+0.8*#4) (#1-0.6*#4,#2+0.8*#4) -- (#1+0.6*#4,#2-0.8*#4);}\n");
+       fwprintf(fp, L"\\providecommand{\\mglY}[4]{\\draw[#3] (#1, #2-#4) -- (#1,#2) (#1-#4,#2+#4) -- (#1,#2) (#1+#4,#2+#4) -- (#1,#2);}\n");
+       fwprintf(fp, L"\\providecommand{\\mglo}[4]{\\draw[#3] (#1, #2) circle (#4);}\n");
+       fwprintf(fp, L"\\providecommand{\\mglO}[4]{\\fill[#3] (#1, #2) circle (#4);}\n");
+       fwprintf(fp, L"\\providecommand{\\mglc}[3]{\\draw[#3] (#1, #2) circle (%g);}\n\n", 4e-4*gr->mark_size());
+       fwprintf(fp, L"\\begin{tikzpicture}\n");
 
        // write primitives first
        mreal wp=-1;
@@ -622,47 +629,47 @@ void MGL_EXPORT mgl_write_tex(HMGL gr, const char *fname,const char *descr)
                        switch(q.n4)    // NOTE: no thickness for marks in TeX
                        {
                                case 'P':
-                                       fprintf(fp, "\\mglp{%.4g}{%.4g}{%s}{%.4g} \\mgls{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s,x,y,cname,s);    break;
+                                       fwprintf(fp, L"\\mglp{%.4g}{%.4g}{%s}{%.4g} \\mgls{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s,x,y,cname,s);  break;
                                case 'X':
-                                       fprintf(fp, "\\mglx{%.4g}{%.4g}{%s}{%.4g} \\mgls{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s,x,y,cname,s);    break;
+                                       fwprintf(fp, L"\\mglx{%.4g}{%.4g}{%s}{%.4g} \\mgls{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s,x,y,cname,s);  break;
                                case 'C':
-                                       fprintf(fp, "\\mglc{%.4g}{%.4g}{%s}{%.4g} \\mglo{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s,x,y,cname,s);    break;
-                               case '+':       fprintf(fp, "\\mglp{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);     break;
-                               case 'x':       fprintf(fp, "\\mglx{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);     break;
-                               case 's':       fprintf(fp, "\\mgls{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);     break;
-                               case 'S':       fprintf(fp, "\\mglS{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);     break;
-                               case 'd':       fprintf(fp, "\\mgld{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);     break;
-                               case 'D':       fprintf(fp, "\\mglD{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);     break;
-                               case '^':       fprintf(fp, "\\mglt{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);     break;
-                               case 'T':       fprintf(fp, "\\mglT{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);     break;
-                               case 'v':       fprintf(fp, "\\mglv{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);     break;
-                               case 'V':       fprintf(fp, "\\mglV{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);     break;
-                               case '<':       fprintf(fp, "\\mgll{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);     break;
-                               case 'L':       fprintf(fp, "\\mglL{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);     break;
-                               case '>':       fprintf(fp, "\\mglr{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);     break;
-                               case 'R':       fprintf(fp, "\\mglR{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);     break;
-                               case 'Y':       fprintf(fp, "\\mglY{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);     break;
-                               case 'o':       fprintf(fp, "\\mglo{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);     break;
-                               case 'O':       fprintf(fp, "\\mglO{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);     break;
-                               case '*':       fprintf(fp, "\\mgla{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);     break;
-                               default:        fprintf(fp, "\\mglc{%.4g}{%.4g}{%s}\n", x,y,cname);     break;
+                                       fwprintf(fp, L"\\mglc{%.4g}{%.4g}{%s}{%.4g} \\mglo{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s,x,y,cname,s);  break;
+                               case '+':       fwprintf(fp, L"\\mglp{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);   break;
+                               case 'x':       fwprintf(fp, L"\\mglx{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);   break;
+                               case 's':       fwprintf(fp, L"\\mgls{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);   break;
+                               case 'S':       fwprintf(fp, L"\\mglS{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);   break;
+                               case 'd':       fwprintf(fp, L"\\mgld{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);   break;
+                               case 'D':       fwprintf(fp, L"\\mglD{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);   break;
+                               case '^':       fwprintf(fp, L"\\mglt{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);   break;
+                               case 'T':       fwprintf(fp, L"\\mglT{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);   break;
+                               case 'v':       fwprintf(fp, L"\\mglv{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);   break;
+                               case 'V':       fwprintf(fp, L"\\mglV{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);   break;
+                               case '<':       fwprintf(fp, L"\\mgll{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);   break;
+                               case 'L':       fwprintf(fp, L"\\mglL{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);   break;
+                               case '>':       fwprintf(fp, L"\\mglr{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);   break;
+                               case 'R':       fwprintf(fp, L"\\mglR{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);   break;
+                               case 'Y':       fwprintf(fp, L"\\mglY{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);   break;
+                               case 'o':       fwprintf(fp, L"\\mglo{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);   break;
+                               case 'O':       fwprintf(fp, L"\\mglO{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);   break;
+                               case '*':       fwprintf(fp, L"\\mgla{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s);   break;
+                               default:        fwprintf(fp, L"\\mglc{%.4g}{%.4g}{%s}\n", x,y,cname);   break;
                        }
                }
                else if(q.type==2 && cp.r[3])
                {
                        const mglPnt p2=gr->GetPnt(q.n2), p3=gr->GetPnt(q.n3);
                        if(cp.r[3]<255)
-                               fprintf(fp, "\\fill[%s, fill opacity=%.4g] (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- cycle;\n", cname,cp.r[3]/255., x,y, p2.x/100,p2.y/100, p3.x/100,p3.y/100);
+                               fwprintf(fp, L"\\fill[%s, fill opacity=%.4g] (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- cycle;\n", cname,cp.r[3]/255., x,y, p2.x/100,p2.y/100, p3.x/100,p3.y/100);
                        else
-                               fprintf(fp, "\\fill[%s, fill] (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- cycle;\n", cname, x,y, p2.x/100,p2.y/100, p3.x/100,p3.y/100);
+                               fwprintf(fp, L"\\fill[%s, fill] (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- cycle;\n", cname, x,y, p2.x/100,p2.y/100, p3.x/100,p3.y/100);
                }
                else if(q.type==3 && cp.r[3])
                {
                        const mglPnt p2=gr->GetPnt(q.n2), p3=gr->GetPnt(q.n3), p4=gr->GetPnt(q.n4);
                        if(cp.r[3]<255)
-                               fprintf(fp, "\\fill[%s, fill opacity=%.4g] (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- cycle;\n", cname,cp.r[3]/255., x,y, p2.x/100,p2.y/100, p4.x/100,p4.y/100, p3.x/100,p3.y/100);
+                               fwprintf(fp, L"\\fill[%s, fill opacity=%.4g] (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- cycle;\n", cname,cp.r[3]/255., x,y, p2.x/100,p2.y/100, p4.x/100,p4.y/100, p3.x/100,p3.y/100);
                        else
-                               fprintf(fp, "\\fill[%s, fill] (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- cycle;\n", cname, x,y, p2.x/100,p2.y/100, p4.x/100,p4.y/100, p3.x/100,p3.y/100);
+                               fwprintf(fp, L"\\fill[%s, fill] (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- cycle;\n", cname, x,y, p2.x/100,p2.y/100, p4.x/100,p4.y/100, p3.x/100,p3.y/100);
 
                }
                else if(q.type==1)      // lines
@@ -670,12 +677,18 @@ void MGL_EXPORT mgl_write_tex(HMGL gr, const char *fname,const char *descr)
                        //const char *dash[]={"", "8 8","4 4","1 3","7 4 1 4","3 2 1 2"};
                        const char *w[]={"semithick","thick","very thick","ultra thick"};
                        register int iw=int(q.w-0.5);   if(iw>3)        iw=3;
-                       if(iw<0)        fprintf(fp,"\\draw[%s] ",cname);
-                       else            fprintf(fp,"\\draw[%s,%s] ",cname,w[iw]);
+                       if(iw<0)        fwprintf(fp,L"\\draw[%s] ",cname);
+                       else            fwprintf(fp,L"\\draw[%s,%s] ",cname,w[iw]);
                        // TODO: add line dashing
                        wp = q.w>1  ? q.w:1;    st = q.n3;
-                       put_line(gr,fp,false,i,wp,cp.c,st, "(%.4g,%.4g)", " -- (%.4g,%.4g)", false, 0.01);
-                       fprintf(fp, ";\n");
+                       std::vector<long> ids = put_line(gr,i,wp,cp.c,st);
+                       for(size_t j=0;j<ids.size();j++)
+                       {
+                               const mglPnt &p = gr->GetPnt(ids[j]);
+                               register float x0 = p.x, y0 = p.y;
+                               fwprintf(fp, j==0?L"(%.4g,%.4g)":L" -- (%.4g,%.4g)",0.01*x0,y0*0.01);
+                       }
+                       fwprintf(fp, L";\n");
                }
                else if(q.type==6 && mgl_isnum(q.p))    // text
                {
@@ -689,12 +702,12 @@ void MGL_EXPORT mgl_write_tex(HMGL gr, const char *fname,const char *descr)
 //                     if(f&MGL_FONT_ITAL)     ss.append(",font=\\itshape");
 //                     if(f&MGL_FONT_BOLD)     ss.append(",font=\\bfshape");
                        if(t.text.find('\\')!=std::string::npos || t.text.find('{')!=std::string::npos || t.text.find('_')!=std::string::npos || t.text.find('^')!=std::string::npos)
-                               fprintf(fp,"\\draw[%s] (%.4g,%.4g) node[rotate=%.2g]{$%ls$};\n", ss.c_str(),x-dx,y-dy, -q.p, t.text.c_str());
+                               fwprintf(fp,L"\\draw[%s] (%.4g,%.4g) node[rotate=%.2g]{$%ls$};\n", ss.c_str(),x-dx,y-dy, -q.p, t.text.c_str());
                        else
-                               fprintf(fp,"\\draw[%s] (%.4g,%.4g) node[rotate=%.2g]{%ls};\n", ss.c_str(),x-dx,y-dy, -q.p, t.text.c_str());
+                               fwprintf(fp,L"\\draw[%s] (%.4g,%.4g) node[rotate=%.2g]{%ls};\n", ss.c_str(),x-dx,y-dy, -q.p, t.text.c_str());
                }
        }
-       fprintf(fp, "\\end{tikzpicture}\n");
+       fwprintf(fp, L"\\end{tikzpicture}\n");
        for(long i=0;i<gr->GetPrmNum();i++)
        {       mglPrim &q=gr->GetPrm(i);       if(q.type==-1)  q.type = 1;     }
        fclose(fp);
@@ -706,6 +719,7 @@ void MGL_EXPORT mgl_write_tex(HMGL gr, const char *fname,const char *descr)
        {
                fprintf(fp, "%% this file just show figure\n");
                fprintf(fp, "\\documentclass{article}\n\\usepackage{tikz}\n");
+               fprintf(fp, "\\usepackage[T2A]{fontenc}\n\\usepackage[utf8]{inputenc}\n");
                fprintf(fp, "\\begin{document}\n\\input{%s}\n\\end{document}\n",fname);
                fclose(fp);
        }
index 5c9232aa50e6e3ccd4bcefc82fbe3cda3caed2ff..9ba30f2e40a2eaa303b27696f484095e6674c085 100644 (file)
@@ -575,7 +575,7 @@ std::string mglCanvas::GetJSON()
                        n3 = p.n3;      n4 = p.n4;\r
                }\r
                if(p.type==1 && n1>n2)  {       n1=p.n2;        n2=p.n1;        }\r
-               register long ps=p.s==p.s?long(100*factor*p.s):0, pw=p.w==p.w?long(100*p.w):0, pp=p.p==p.p?long(1e5*p.p+0.5):0;\r
+               register long ps=p.s==p.s?long(100*factor*p.s):0, pw=p.w==p.w?long(100*p.w):0, pp=p.p==p.p?mgl_int(1e5*p.p):0;\r
                if(cp.r[3]==255 || p.type==0 || p.type==1 || p.type==4 || p.type==6)\r
                        buf = mgl_sprintf("[%d,%ld,%ld,%ld,%ld,%d,%ld,%ld,%ld,0,\"#%02x%02x%02x\"],\n",\r
                                p.type, n1, n2, n3, n4, p.id, ps,pw,pp, int(cp.r[0]),int(cp.r[1]),int(cp.r[2]));\r
index a0a4bb811764266d20cee722a4653868c07c9565..7ea43f8d4248581c3d7db3b78ef34b8416953fea 100644 (file)
@@ -24,6 +24,7 @@
 #include <gsl/gsl_fft_complex.h>
 #include <gsl/gsl_dht.h>
 #include <gsl/gsl_sf.h>
+#include <gsl/gsl_wavelet.h>
 #endif
 //-----------------------------------------------------------------------------
 void MGL_EXPORT mglStartThreadT(void *(*func)(void *), long n, void *a, double *b, const void *v, void **w, const long *p, const void *re, const void *im)
@@ -1292,5 +1293,81 @@ uintptr_t MGL_EXPORT mgl_data_correl_(uintptr_t *d1, uintptr_t *d2, const char *
        uintptr_t res = uintptr_t(mgl_datac_correl(_DA_(d1),_DA_(d2),s));
        delete []s;             return res;     }
 //-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
+void MGL_EXPORT mgl_data_wavelet(HMDT dat, const char *how, int k)
+{
+#if MGL_HAVE_GSL
+       gsl_wavelet *w=0;
+       if(mglchr(how,'d'))     w = gsl_wavelet_alloc(gsl_wavelet_daubechies, k);
+       else if(mglchr(how,'D'))        w = gsl_wavelet_alloc(gsl_wavelet_daubechies_centered, k);
+       else if(mglchr(how,'h'))        w = gsl_wavelet_alloc(gsl_wavelet_haar, k);
+       else if(mglchr(how,'H'))        w = gsl_wavelet_alloc(gsl_wavelet_haar_centered, k);
+       else if(mglchr(how,'b'))        w = gsl_wavelet_alloc(gsl_wavelet_bspline, k);
+       else if(mglchr(how,'B'))        w = gsl_wavelet_alloc(gsl_wavelet_bspline_centered, k);
+       if(!w)  return;
+
+       double *a;
+#if MGL_USE_DOUBLE
+       a = dat->a;
+#else
+       long nn = dat->GetNN();
+       a = new double[nn];
+#pragma omp parallel for
+       for(long i=0;i<nn;i++)  a[i] = dat->a[i];
+#endif
+       if(mglchr(how,'x'))
+#pragma omp parallel
+       {
+               long n = dat->nx;
+               gsl_wavelet_workspace *work = gsl_wavelet_workspace_alloc(n);
+               if(mglchr(how,'i'))
+#pragma omp for
+                       for(long i=0;i<dat->ny*dat->nz;i++)
+                               gsl_wavelet_transform_inverse(w, a+i*n, 1, n, work);
+               else
+#pragma omp for
+                       for(long i=0;i<dat->ny*dat->nz;i++)
+                               gsl_wavelet_transform_forward(w, a+i*n, 1, n, work);
+               gsl_wavelet_workspace_free(work);
+       }
+       if(mglchr(how,'y'))
+#pragma omp parallel
+       {
+               long n = dat->ny, s = dat->nx;
+               gsl_wavelet_workspace *work = gsl_wavelet_workspace_alloc(n);
+               if(mglchr(how,'i'))
+#pragma omp for collapse(2)
+                       for(long i=0;i<dat->nx;i++)     for(long j=0;j<dat->nz;j++)
+                               gsl_wavelet_transform_inverse(w, a+i+n*s*j, s, n, work);
+               else
+#pragma omp for collapse(2)
+                       for(long i=0;i<dat->nx;i++)     for(long j=0;j<dat->nz;j++)
+                               gsl_wavelet_transform_forward(w, a+i+n*s*j, s, n, work);
+               gsl_wavelet_workspace_free(work);
+       }
+       if(mglchr(how,'z'))
+#pragma omp parallel
+       {
+               long n = dat->nz, s = dat->nx*dat->ny;
+               gsl_wavelet_workspace *work = gsl_wavelet_workspace_alloc(n);
+               if(mglchr(how,'i'))
+#pragma omp for
+                       for(long i=0;i<dat->nx*dat->ny;i++)
+                               gsl_wavelet_transform_inverse(w, a+i, s, n, work);
+               else
+#pragma omp for
+                       for(long i=0;i<dat->nx*dat->ny;i++)
+                               gsl_wavelet_transform_forward(w, a+i, s, n, work);
+               gsl_wavelet_workspace_free(work);
+       }
+#if !MGL_USE_DOUBLE
+#pragma omp parallel for
+       for(long i=0;i<nn;i++)  dat->a[i] = a[i];
+       delete []a;
+#endif
+       gsl_wavelet_free (w);
+#endif
+}
+void MGL_EXPORT mgl_data_wavelet_(uintptr_t *d, const char *dir, int *k,int l)
+{      char *s=new char[l+1];  memcpy(s,dir,l);        s[l]=0;
+       mgl_data_wavelet(_DT_,s,*k);    delete []s;     }
 //-----------------------------------------------------------------------------
index 4a789642b31a58452c34e2bcf21b860a3c0d78a7..6a42a4bd57065950e65ff9b247ef0e7a99cc5905 100644 (file)
 #include <gsl/gsl_multifit_nlin.h>\r
 #include <gsl/gsl_blas.h>\r
 #endif\r
-mglData MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector<mglDataA*> &head);\r
+HMDT MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector<mglDataA*> &head);\r
 //-----------------------------------------------------------------------------\r
 int mglFitPnts=100;            ///< Number of output points in fitting\r
 char mglFitRes[1024];  ///< Last fitted formula\r
 mreal mglFitChi=NAN;   ///< Chi value for last fitted formula\r
+mglData mglFitCovar;   ///< Covar matrix for lat fitted formula\r
 //-----------------------------------------------------------------------------\r
 mreal MGL_EXPORT mgl_get_fit_chi()     {       return mglFitChi;       }\r
 mreal MGL_EXPORT mgl_get_fit_chi_()    {       return mglFitChi;       }\r
 //-----------------------------------------------------------------------------\r
+HCDT MGL_EXPORT mgl_get_fit_covar()    {       return &mglFitCovar;    }\r
+uintptr_t MGL_EXPORT mgl_get_fit_covar_()      {       return (uintptr_t)&mglFitCovar; }\r
+//-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_puts_fit(HMGL gr, double x, double y, double z, const char *pre, const char *font, double size)\r
 {\r
        long n = strlen(mglFitRes)+(pre?strlen(pre):0)+1;\r
@@ -77,16 +81,16 @@ int mgl_fit__f (const gsl_vector *x, void *data, gsl_vector *f)
        if(fd->x)       list.push_back(fd->x);\r
        if(fd->y)       list.push_back(fd->y);\r
        if(fd->z)       list.push_back(fd->z);\r
-       mglData res = mglFormulaCalc(fd->eq, list);\r
+       HMDT res = mglFormulaCalc(fd->eq, list);\r
 #pragma omp parallel for\r
        for(long i=0;i<fd->n;i++)\r
        {\r
                mreal aa = fd->a[i], ss = fd->s[i];\r
                if(mgl_isnum(aa) && ss==ss && ss!=0)\r
-                       gsl_vector_set (f, i, (res.a[i] - aa)/ss);\r
+                       gsl_vector_set (f, i, (res->a[i] - aa)/ss);\r
                else    gsl_vector_set (f, i, 0);\r
        }\r
-       delete []var;\r
+       delete []var;   mgl_delete_data(res);\r
        return GSL_SUCCESS;\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -100,23 +104,24 @@ int MGL_NO_EXPORT mgl_fit__df (const gsl_vector * x, void *data, gsl_matrix * J)
        if(fd->x)       list.push_back(fd->x);\r
        if(fd->y)       list.push_back(fd->y);\r
        if(fd->z)       list.push_back(fd->z);\r
-       mglData res = mglFormulaCalc(fd->eq, list);\r
+       HMDT res = mglFormulaCalc(fd->eq, list);\r
        const mreal eps = 1e-5;\r
        for(long j=0;j<fd->m;j++)\r
        {\r
                var[j].Fill(gsl_vector_get(x,j)+eps);\r
-               mglData dif = (mglFormulaCalc(fd->eq, list)-res)/eps;\r
+               HMDT dif = mglFormulaCalc(fd->eq, list);\r
                var[j].Fill(gsl_vector_get(x,j));\r
 #pragma omp parallel for\r
                for(long i=0;i<fd->n;i++)\r
                {\r
                        mreal aa = fd->a[i], ss = fd->s[i];\r
                        if(mgl_isnum(aa) && ss==ss && ss!=0)\r
-                               gsl_matrix_set (J, i, j, dif.a[i]/ss);\r
+                               gsl_matrix_set (J, i, j, (dif->a[i]-res->a[i])/(eps*ss));\r
                        else    gsl_matrix_set (J, i, j, 0);\r
                }\r
+               mgl_delete_data(dif);\r
        }\r
-       delete []var;\r
+       delete []var;   mgl_delete_data(res);\r
        return GSL_SUCCESS;\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -130,31 +135,32 @@ int MGL_NO_EXPORT mgl_fit__fdf (const gsl_vector * x, void *data, gsl_vector * f
        if(fd->x)       list.push_back(fd->x);\r
        if(fd->y)       list.push_back(fd->y);\r
        if(fd->z)       list.push_back(fd->z);\r
-       mglData res = mglFormulaCalc(fd->eq, list);\r
+       HMDT res = mglFormulaCalc(fd->eq, list);\r
 #pragma omp parallel for\r
        for(long i=0;i<fd->n;i++)\r
        {\r
                mreal aa = fd->a[i], ss = fd->s[i];\r
                if(mgl_isnum(aa) && ss==ss && ss!=0)\r
-                       gsl_vector_set (f, i, (res.a[i] - aa)/ss);\r
+                       gsl_vector_set (f, i, (res->a[i] - aa)/ss);\r
                else    gsl_vector_set (f, i, 0);\r
        }\r
        const mreal eps = 1e-5;\r
        for(long j=0;j<fd->m;j++)\r
        {\r
                var[j].Fill(gsl_vector_get(x,j)+eps);\r
-               mglData dif = (mglFormulaCalc(fd->eq, list)-res)/eps;\r
+               HMDT dif = mglFormulaCalc(fd->eq, list);\r
                var[j].Fill(gsl_vector_get(x,j));\r
 #pragma omp parallel for\r
                for(long i=0;i<fd->n;i++)\r
                {\r
                        mreal aa = fd->a[i], ss = fd->s[i];\r
                        if(mgl_isnum(aa) && ss==ss && ss!=0)\r
-                               gsl_matrix_set (J, i, j, dif.a[i]/ss);\r
+                               gsl_matrix_set (J, i, j, (dif->a[i]-res->a[i])/(eps*ss));\r
                        else    gsl_matrix_set (J, i, j, 0);\r
                }\r
+               mgl_delete_data(dif);\r
        }\r
-       delete []var;\r
+       delete []var;   mgl_delete_data(res);\r
        return GSL_SUCCESS;\r
 }\r
 #endif\r
@@ -169,7 +175,6 @@ mreal MGL_NO_EXPORT mgl_fit_base(mglFitData &fd, mreal *ini)
        double *x_init = new double[fd.m];\r
        for(i=0;i<m;i++)        x_init[i] = ini[i];\r
        // setup fitting\r
-       gsl_matrix *covar = gsl_matrix_alloc(m, m);\r
        gsl_vector_view vx = gsl_vector_view_array(x_init, m);\r
        const gsl_multifit_fdfsolver_type *T = gsl_multifit_fdfsolver_lmsder;\r
        gsl_multifit_fdfsolver *s = gsl_multifit_fdfsolver_alloc(T, n, m);\r
@@ -187,7 +192,9 @@ mreal MGL_NO_EXPORT mgl_fit_base(mglFitData &fd, mreal *ini)
                status = gsl_multifit_test_delta (s->dx, s->x, 1e-4, 1e-4 );\r
        }\r
        while ( status == GSL_CONTINUE && iter < 500 );\r
+       gsl_matrix *covar = gsl_matrix_alloc(m, m);\r
        gsl_multifit_covar (s->J, 0.0, covar );\r
+       mglFitCovar.Set(covar);\r
        mreal res = gsl_blas_dnrm2(s->f);\r
        for(i=0;i<m;i++)        ini[i] = gsl_vector_get(s->x, i);\r
        // free memory\r
@@ -289,10 +296,10 @@ void MGL_NO_EXPORT mgl_fill_fit(HMGL gr, mglData &fit, mglData &in, mglFitData &
        mglDataV x(nx,ny,nz, gr->Min.x,gr->Max.x,'x');  x.s = L"x";     list.push_back(&x);\r
        mglDataV y(nx,ny,nz, gr->Min.y,gr->Max.y,'y');  y.s = L"y";     list.push_back(&y);\r
        mglDataV z(nx,ny,nz, gr->Min.z,gr->Max.z,'z');  z.s = L"z";     list.push_back(&z);\r
-       mglData res = mglFormulaCalc(fd.eq, list);\r
+       HMDT res = mglFormulaCalc(fd.eq, list);\r
        long nn = nx*ny*nz;\r
-       memcpy(fit.a+k*nn,res.a,nn*sizeof(mreal));\r
-       delete []vv;\r
+       memcpy(fit.a+k*nn,res->a,nn*sizeof(mreal));\r
+       delete []vv;    mgl_delete_data(res);\r
 }\r
 //-----------------------------------------------------------------------------\r
 HMDT MGL_EXPORT mgl_fit_xys(HMGL gr, HCDT xx, HCDT yy, HCDT ss, const char *eq, const char *var, HMDT ini, const char *opt)\r
@@ -495,7 +502,7 @@ uintptr_t MGL_EXPORT mgl_hist_xyz_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, ui
        uintptr_t r = (uintptr_t)mgl_hist_xyz(_GR_, _DA_(x), _DA_(y), _DA_(z), _DA_(a), o);\r
        delete []o;     return r;       }\r
 //-----------------------------------------------------------------------------\r
-MGL_EXPORT_CONST const char *mgl_get_fit(HMGL )        {       return mglFitRes;       }\r
+MGL_EXPORT const char *mgl_get_fit(HMGL )      {       return mglFitRes;       }\r
 int MGL_EXPORT mgl_get_fit_(uintptr_t *gr, char *out, int len)\r
 {\r
        const char *res = mgl_get_fit(_GR_);\r
index d1b1318fd3ad059edfc8a6ebccfbce4f3199788e..78c24b345da6303a55b28017901df153adb05756 100644 (file)
@@ -29,7 +29,7 @@
 \r
 #include "mgl2/base.h"\r
 #include "mgl2/font.h"\r
-#include "def_font.cpp"\r
+#include "def_font.cc"\r
 //-----------------------------------------------------------------------------\r
 extern mglTeXsymb mgl_tex_symb[];\r
 extern long mgl_tex_num;\r
@@ -277,6 +277,7 @@ unsigned mglFont::Parse(const wchar_t *s) const
        else if(!wcscmp(s,L"textbf"))   res = MGL_FONT_BOLD;\r
        else if(!wcscmp(s,L"textit"))   res = MGL_FONT_ITAL;\r
        else if(!wcscmp(s,L"textrm"))   res = unsigned(-1);\r
+       else if(!wcscmp(s,L"T2A"))              res = unsigned(-1);\r
        else if(!wcscmp(s,L"w"))                res = MGL_FONT_WIRE;\r
        else if(!wcscmp(s,L"wire"))             res = MGL_FONT_WIRE;\r
        else if(!wcsncmp(s,L"color",5)) res = MGL_COLOR_MASK + (0xff & s[5]);\r
@@ -310,6 +311,7 @@ void mglFont::Convert(const wchar_t *str, unsigned *res) const
                                }\r
                        }\r
                }\r
+               else if(ch=='-' && str[i+1]=='-')       {       res[j++] = 0x2212;      i++;    }\r
                else if(ch=='\b'){}\r
                else if(ch<=' ' && ch!='\n')    res[j++] = ' '; // no \t at this moment :(\r
                else if(ch=='_')        res[j++] = MGL_FONT_LOWER;\r
@@ -506,15 +508,27 @@ float mglFont::Puts(const unsigned *text, float x,float y,float f,int style,floa
                        if(ss)  // draw symbol (glyph)\r
                        {\r
                                long j = Internal('!');\r
+                               float dx=0;\r
                                if(ss>' ')\r
                                {\r
                                        j = Internal(ss);\r
                                        if(j==-1)       continue;\r
-                                       if(s & MGL_FONT_ZEROW)  yy += 100*ff/fact[a];\r
+                                       if(s & MGL_FONT_ZEROW)\r
+                                       {\r
+                                               long j=1;\r
+                                               yy += 100*ff/fact[a];\r
+                                               while(str[i+j]>=unsigned(-15))  j++;\r
+                                               unsigned sn = str[i+j];\r
+                                               if(sn<unsigned(-15) && (sn&MGL_FONT_MASK)>' ')  // specially center\r
+                                               {\r
+                                                       dx = 0.75*ff*(GetWidth(a,Internal(sn&MGL_FONT_MASK))-GetWidth(a,j))/fact[a];\r
+                                                       if(dx<0)        dx=0;\r
+                                               }\r
+                                       }\r
                                        if(gr && !(style&0x10))\r
                                        {\r
-                                               if(st & MGL_FONT_WIRE)  gr->Glyph(x,yy,ff,a+4,j,ccol);\r
-                                               else                                    gr->Glyph(x,yy,ff,a,j,ccol);\r
+                                               if(st & MGL_FONT_WIRE)  gr->Glyph(x+dx,yy,ff,a+4,j,ccol);\r
+                                               else                                    gr->Glyph(x+dx,yy,ff,a,j,ccol);\r
                                        }\r
                                }\r
                                ww = ff*GetWidth(a,j)/fact[a];\r
@@ -665,6 +679,48 @@ bool mglFont::read_main(const char *fname, std::vector<short> &buf)
        return true;\r
 }\r
 //-----------------------------------------------------------------------------\r
+size_t mglFont::SaveBin(const char *fname)\r
+{\r
+       FILE *fp = fopen(fname,"wb");\r
+       if(!fp) return 0;\r
+       size_t sum=0;\r
+       fwrite(&numb,sizeof(long),1,fp);        sum += sizeof(long);\r
+       fwrite(fact,sizeof(float),4,fp);        sum += sizeof(float)*4;\r
+       fwrite(Buf,sizeof(short),numb,fp);      sum += sizeof(short)*numb;\r
+       size_t len = glyphs.size();\r
+       fwrite(&len,sizeof(size_t),1,fp);       sum += sizeof(long);\r
+       fwrite(&(glyphs[0]),sizeof(mglGlyphDescr),len,fp);      sum += sizeof(mglGlyphDescr)*len;\r
+       fclose(fp);     return sum;\r
+}\r
+//-----------------------------------------------------------------------------\r
+bool mglFont::LoadBin(const char *base, const char *path)\r
+{\r
+       Clear();        // first clear old\r
+       if(!path)       path = MGL_FONT_PATH;\r
+       char str[256], sep='/';\r
+       snprintf(str,256,"%s%c%s.vfmb",path,sep,base?base:"");  str[255]=0;\r
+       FILE *fp = fopen(str,"rb");             if(!fp) return false;\r
+       size_t s, len;\r
+       bool res = true;\r
+       s = fread(&numb,sizeof(long),1,fp);\r
+       if(s<1) res = false;\r
+       s = fread(fact,sizeof(float),4,fp);\r
+       if(s<4) res = false;\r
+       Buf = new short[numb];\r
+       s = fread(Buf,sizeof(short),numb,fp);\r
+       if(s<size_t(numb))      res = false;\r
+       s = fread(&len,sizeof(size_t),1,fp);\r
+       if(s<1) res = false;\r
+       if(res)\r
+       {\r
+               glyphs.clear(); glyphs.resize(len);\r
+               s = fread(&(glyphs[0]),sizeof(mglGlyphDescr),len,fp);\r
+               if(s<len)       res = false;\r
+       }\r
+//     if(!res)        Clear();\r
+       fclose(fp);             return res;\r
+}\r
+//-----------------------------------------------------------------------------\r
 bool mglFont::Load(const char *base, const char *path)\r
 {\r
 //     base = 0;\r
@@ -685,6 +741,8 @@ bool mglFont::Load(const char *base, const char *path)
                        for(i=strlen(buf);i>=0 && buf[i]!=sep;i--);\r
                        path = buf;             buf[i]=0;       base = buf+i+1;\r
                }\r
+               if(LoadBin(base,path))\r
+               {       delete []buf;   return true;    }\r
        }\r
        Clear();        // first clear old\r
 \r
@@ -719,12 +777,12 @@ bool mglFont::Load(const char *base, const char *path)
        // now collect data\r
        numb = norm.size()+bold.size()+ital.size()+both.size();\r
        Buf = new short[numb];\r
-       memcpy(Buf,norm.data(),norm.size()*sizeof(short));\r
+       memcpy(Buf,&norm[0],norm.size()*sizeof(short));\r
        long cur = norm.size(), len = long(bold.size());\r
        if(bold.size()>0)\r
-               memcpy(Buf+cur,bold.data(),bold.size()*sizeof(short));\r
+               memcpy(Buf+cur,&bold[0],bold.size()*sizeof(short));\r
 #pragma omp parallel for\r
-       for(long i=0;i<GetNumGlyph();i++)       if(glyphs[i].ln[1]<0)\r
+       for(long i=0;i<long(GetNumGlyph());i++) if(glyphs[i].ln[1]<0)\r
        {       glyphs[i].ln[1] = cur-1-glyphs[i].ln[1];        glyphs[i].tr[1] = cur-1-glyphs[i].tr[1];        }\r
 #pragma omp parallel for\r
        for(long i=0;i<long(ex_b.size());i++)   if(ex_b[i].ln[1]<0)\r
@@ -735,9 +793,9 @@ bool mglFont::Load(const char *base, const char *path)
        }\r
        cur += len;             len = long(ital.size());\r
        if(ital.size()>0)\r
-               memcpy(Buf+cur,ital.data(),ital.size()*sizeof(short));\r
+               memcpy(Buf+cur,&ital[0],ital.size()*sizeof(short));\r
 #pragma omp parallel for\r
-       for(long i=0;i<GetNumGlyph();i++)       if(glyphs[i].ln[2]<0)\r
+       for(long i=0;i<long(GetNumGlyph());i++) if(glyphs[i].ln[2]<0)\r
        {       glyphs[i].ln[2] = cur-1-glyphs[i].ln[2];        glyphs[i].tr[2] = cur-1-glyphs[i].tr[2];        }\r
 #pragma omp parallel for\r
        for(long i=0;i<long(ex_i.size());i++)   if(ex_i[i].ln[2]<0)\r
@@ -748,9 +806,9 @@ bool mglFont::Load(const char *base, const char *path)
        }\r
        cur += len;\r
        if(both.size()>0)\r
-               memcpy(Buf+cur,both.data(),both.size()*sizeof(short));\r
+               memcpy(Buf+cur,&both[0],both.size()*sizeof(short));\r
 #pragma omp parallel for\r
-       for(long i=0;i<GetNumGlyph();i++)       if(glyphs[i].ln[3]<0)\r
+       for(long i=0;i<long(GetNumGlyph());i++) if(glyphs[i].ln[3]<0)\r
        {       glyphs[i].ln[3] = cur-1-glyphs[i].ln[3];        glyphs[i].tr[3] = cur-1-glyphs[i].tr[3];        }\r
 #pragma omp parallel for\r
        for(long i=0;i<long(ex_bi.size());i++)  if(ex_bi[i].ln[3]<0)\r
@@ -857,6 +915,6 @@ void mglFont::Copy(mglFont *f)
        numb = f->numb; Buf = new short[numb];  memcpy(Buf, f->Buf, numb*sizeof(short));\r
        // copy symbol parameters\r
        glyphs.resize(f->glyphs.size());\r
-       memcpy(glyphs.data(),f->glyphs.data(),glyphs.size()*sizeof(mglGlyphDescr));\r
+       memcpy(&glyphs[0],&(f->glyphs)[0],glyphs.size()*sizeof(mglGlyphDescr));\r
 }\r
 //-----------------------------------------------------------------------------\r
index 0c327e07e916bf752f5a2a593b6073640057f896..abdf610d0a0fd6407c225514b2457613f20a2395 100644 (file)
@@ -21,6 +21,23 @@ mglCanvasGL::mglCanvasGL() : mglCanvas(1,1)  {       Clf();  Zoom(0,0,1,1);  }
 //-----------------------------------------------------------------------------\r
 mglCanvasGL::~mglCanvasGL(){}\r
 //-----------------------------------------------------------------------------\r
+void set_pen(unsigned style, mreal width, mreal pos)\r
+{\r
+       if(style==0)    return;\r
+       unsigned long pdef = style*0x100010001;\r
+       pdef >>= long(32*pos)%32;       // NOTE try to bypass OpenGL limitations\r
+       style = pdef & 0xffff;\r
+       width *= 20;\r
+       if(style!=0xffff)\r
+       {\r
+               glEnable(GL_LINE_STIPPLE);\r
+               glLineStipple(int(width+0.5),style);\r
+       }\r
+       else    glDisable(GL_LINE_STIPPLE);\r
+       if(width>1)     glLineWidth(width);     // NOTE bypass bug on some drivers, where width>1 must be\r
+       else            glLineWidth(1);\r
+}\r
+//-----------------------------------------------------------------------------\r
 void mglCanvasGL::Finish()\r
 {\r
 #if MGL_USE_DOUBLE\r
@@ -87,48 +104,48 @@ bool mglCanvasGL::Alpha(bool enable)
        return mglCanvas::Alpha(enable);\r
 }\r
 //-----------------------------------------------------------------------------\r
-void mglCanvasGL::AddLight(int n,mglPoint r,mglPoint d,char cc, mreal br,mreal /*ap*/)\r
+void mglCanvasGL::AddLight(int n,mglPoint r,mglPoint d,char cc, mreal br,mreal ap)\r
 {\r
        mglColor c(cc);\r
-       mglColor AmbLight = mglColor(AmbBr,AmbBr,AmbBr);\r
-       mglColor DifLight = mglColor(br,br,br);\r
-       GLenum lght[8] = {GL_LIGHT0,GL_LIGHT1,GL_LIGHT2,GL_LIGHT3,GL_LIGHT4,\r
-                       GL_LIGHT5,GL_LIGHT6,GL_LIGHT7};\r
-       float amb[4], pos[4],dif[4],dir[4];\r
+       float amb[4],dif[4],spc[4], pos[4],dir[4];\r
        bool inf = mgl_isnan(r.x);\r
        if(n<0 || n>7)  {       SetWarn(mglWarnLId,"AddLight"); return; }\r
        if(c.Valid())\r
        {\r
-               DifLight = c*br;\r
-               AmbLight = c*AmbBr;\r
+               spc[0] = br*c.r;        spc[1] = br*c.g;        spc[2] = br*c.b;\r
+               amb[0] = AmbBr*c.r;     amb[1] = AmbBr*c.g;     amb[2] = AmbBr*c.b;\r
        }\r
-       dif[0] = DifLight.r;    dif[1] = DifLight.g;\r
-       dif[2] = DifLight.b;    dif[3] = 1.;\r
-       amb[0] = AmbLight.r;    amb[1] = AmbLight.g;\r
-       amb[2] = AmbLight.b;    amb[3] = 1.;\r
+       else\r
+       {\r
+               spc[0] = spc[1] = spc[2] = br;\r
+               amb[0] = amb[1] = amb[2] = AmbBr;\r
+       }\r
+       ap = 90-180*atan(fabs(ap))/M_PI;\r
+       dif[0] = dif[1] = dif[2] = DifBr;\r
+       dif[3] = amb[3] = spc[3] = 1.;\r
        if(inf)\r
        {       pos[0] = d.x;   pos[1] = d.y;   pos[2] = d.z;   pos[3] = 0;     }\r
        else\r
        {       pos[0] = r.x;   pos[1] = r.y;   pos[2] = r.z;   pos[3] = 1;     }\r
-       dir[0] = d.x;   dir[1] = d.y;   dir[2] = d.z;\r
-       glShadeModel(GL_SMOOTH);\r
-       //glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 5.0);\r
-       //glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, pos);\r
+       dir[0] = d.x;   dir[1] = d.y;   dir[2] = d.z;   dir[3] = 0;\r
 \r
-       glLightfv(lght[n], GL_AMBIENT, amb);\r
-       glLightfv(lght[n], GL_DIFFUSE, dif);\r
-       //glLightfv(lght[n], GL_SPECULAR, spc);\r
-       glLightfv(lght[n], GL_POSITION, pos);\r
-       if(!inf)        glLightfv(lght[n], GL_SPOT_DIRECTION, dir);\r
-       glEnable(lght[n]);\r
+       glShadeModel(GL_SMOOTH);\r
+       glLightfv(GL_LIGHT0+n, GL_AMBIENT, amb);\r
+       glLightfv(GL_LIGHT0+n, GL_DIFFUSE, dif);\r
+       glLightfv(GL_LIGHT0+n, GL_SPECULAR, spc);\r
+       glLightfv(GL_LIGHT0+n, GL_POSITION, pos);\r
+       if(!inf)\r
+       {\r
+               glLightfv(GL_LIGHT0+n, GL_SPOT_DIRECTION, dir);\r
+               glLightf(GL_LIGHT0+n, GL_SPOT_CUTOFF, ap);\r
+       }\r
+       glEnable(GL_LIGHT0+n);\r
 }\r
 //-----------------------------------------------------------------------------\r
 void mglCanvasGL::Light(int n, bool enable)\r
 {\r
-       GLenum lght[8] = {GL_LIGHT0,GL_LIGHT1,GL_LIGHT2,GL_LIGHT3,GL_LIGHT4,\r
-                       GL_LIGHT5,GL_LIGHT6,GL_LIGHT7};\r
-       if(enable)      glEnable(lght[n]);\r
-       else            glDisable(lght[n]);\r
+       if(enable)      glEnable(GL_LIGHT0+n);\r
+       else            glDisable(GL_LIGHT0+n);\r
 }\r
 //-----------------------------------------------------------------------------\r
 bool mglCanvasGL::Light(bool enable)\r
@@ -144,7 +161,7 @@ void mglCanvasGL::LightScale(const mglMatrix *M)
        GLenum ll[8] = {GL_LIGHT0,GL_LIGHT1,GL_LIGHT2,GL_LIGHT3,GL_LIGHT4,\r
                        GL_LIGHT5,GL_LIGHT6,GL_LIGHT7};\r
        float pos[4]={0,0,0,0};\r
-       for(int i=0;i<8;i++)\r
+       for(int i=0;i<8;i++)    // NOTE only global light is used in OpenGL mode\r
        {\r
                pos[0] = light[i].p.x;\r
                pos[1] = light[i].p.y;\r
@@ -185,7 +202,7 @@ void mglCanvasGL::Fog(mreal d, mreal)
 void mglCanvasGL::Clf(mglColor Back)\r
 {\r
        mglCanvas::Clf(Back);\r
-       if(Back==NC)    Back = mglColor(BDef[0]/255.,BDef[1]/255.,BDef[2]/255.);\r
+       if(Back==NC)    Back.Set(BDef[0]/255.,BDef[1]/255.,BDef[2]/255.);\r
        gl_clf(Back);\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -212,19 +229,10 @@ void mglCanvasGL::gl_clf(mglColor Back)
 //     glTranslated(-0.5,-0.5,-0.5);\r
        glScaled(2,2,2);\r
        glTranslated(-0.5,-0.5,-0.5);\r
-}\r
-//-----------------------------------------------------------------------------\r
-void mglCanvasGL::set_pen(unsigned style,mreal width)\r
-{\r
-       if(style==0)    return;\r
-       if(style!=0xffff)\r
-       {\r
-               glEnable(GL_LINE_STIPPLE);\r
-               glLineStipple(int(width+0.5),style);\r
-       }\r
-       else    glDisable(GL_LINE_STIPPLE);\r
-       if(width>0)             glLineWidth(width);\r
-       else                    glLineWidth(1);\r
+       \r
+//     float dif[4]={DifBr,DifBr,DifBr,1}, spc[4]={1,1,1,1};\r
+//     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, dif);\r
+//     glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spc);\r
 }\r
 //-----------------------------------------------------------------------------\r
 /*void mglCanvasGL::EndFrame()\r
@@ -276,10 +284,7 @@ void mglCanvasGL::trig_draw(long k1, long k2, long k3)
 void mglCanvasGL::line_draw(long k1, long k2)\r
 {\r
        if(PDef==0)     return;\r
-/*     unsigned pdef = PDef*0x10001;\r
-       pdef = pdef << (int(100*pPos+0.5)%16);\r
-       set_pen(pdef&0xffff,PenWidth);*/\r
-       set_pen(PDef,PenWidth);\r
+       set_pen(PDef,PenWidth, pPos);\r
        glBegin(GL_LINES);\r
        glArrayElement(k1);     glArrayElement(k2);\r
        glEnd();\r
@@ -307,7 +312,7 @@ void mglCanvasGL::trig_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3
 void mglCanvasGL::line_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg *)\r
 {\r
        if(PDef==0)     return;\r
-       set_pen(PDef,PenWidth);\r
+       set_pen(PDef,PenWidth, pPos);\r
        glBegin(GL_LINES);\r
        glColor4f(p1.r,p1.g,p1.b,p1.a); glVertex3f(p1.x,p1.y,p1.z);\r
        glColor4f(p2.r,p2.g,p2.b,p2.a); glVertex3f(p2.x,p2.y,p2.z);\r
index 0949ef79ba6840ad471159c33b25aa48dc4b9017..7d34b410d02f57c87b360b3f775edf558d4b9466 100644 (file)
@@ -48,7 +48,7 @@ long mglParser::IsFunc(const std::wstring &name, int *na)
        {
                const mglFunc &f = func[i];
                if(f.func==name)
-               {       if(na)  *na=f.narg;     return f.pos;   }
+               {       if(na)  *na=f.narg;     return f.pos+1; }
        }
        return 0;
 }
@@ -80,9 +80,10 @@ int MGL_LOCAL_PURE mgl_cmd_cmp(const void *a, const void *b)
        return strcmp(aa->name, bb->name);
 }
 //-----------------------------------------------------------------------------
-bool mgl_check_for_name(const std::wstring &s)
+bool mglParser::CheckForName(const std::wstring &s)
 {
-       return !isalpha(s[0])||s.find_first_of(L".:()")!=std::wstring::npos;
+       return !isalpha(s[0]) || s.find_first_of(L"!@#$%%^&*()-+|,.<>:")!=std::wstring::npos || s==L"rnd" || FindNum(s.c_str());
+//     return !isalpha(s[0])||s.find_first_of(L".:()")!=std::wstring::npos;
 }
 //-----------------------------------------------------------------------------
 const mglCommand *mglParser::FindCommand(const char *com) const
@@ -120,12 +121,12 @@ int mglParser::Exec(mglGraph *gr, const wchar_t *com, long n, mglArg *a, const s
        }
        const mglCommand *rts=FindCommand(com);
        if(!rts || rts->type==6)        return 2;
-       if(rts->type == 4)
+/*     if(rts->type == 4)
        {
-               if(n<1 || mgl_check_for_name(var))      return 2;
+               if(n<1 || CheckForName(var))    return 2;
                a[0].type = 0;  a[0].d = AddVar(var.c_str());
                a[0].w = var;   k[0] = 'd';
-       }
+       }*/
        char *o=0;
        if(opt && *opt) // TODO: parse arguments of options
        {
@@ -152,6 +153,12 @@ mglParser::mglParser(bool setsize)
        AllowSetSize=setsize;   AllowFileIO=true;       AllowDllCall=true;
        Once = true;
        fval = new mglData[40];
+       mglNum *v;
+       v = new mglNum(0);      v->s = L"off";  NumList.push_back(v);
+       v = new mglNum(1);      v->s = L"on";   NumList.push_back(v);
+       v = new mglNum(NAN);    v->s = L"nan";  NumList.push_back(v);
+       v = new mglNum(M_PI);   v->s = L"pi";   NumList.push_back(v);
+       v = new mglNum(INFINITY);       v->s = L"inf";  NumList.push_back(v);
 #if MGL_HAVE_LTDL
        lt_dlinit();
 #endif
@@ -173,6 +180,12 @@ void mglParser::DeleteAll()
        for(size_t i=0;i<NumList.size();i++)
                if(NumList[i])  delete NumList[i];
        NumList.clear();
+       mglNum *v;
+       v = new mglNum(0);      v->s = L"off";  NumList.push_back(v);
+       v = new mglNum(1);      v->s = L"on";   NumList.push_back(v);
+       v = new mglNum(NAN);    v->s = L"nan";  NumList.push_back(v);
+       v = new mglNum(M_PI);   v->s = L"pi";   NumList.push_back(v);
+       v = new mglNum(INFINITY);       v->s = L"inf";  NumList.push_back(v);
        if(Cmd && Cmd!=mgls_base_cmd)
        {       delete []Cmd;   Cmd = mgls_base_cmd;    }
 #if MGL_HAVE_LTDL
@@ -194,9 +207,9 @@ int mglParser::Parse(mglGraph *gr, const char *str, long pos)
        return r;
 }
 //-----------------------------------------------------------------------------
-mglData *mglParser::AddVar(const char *str)
+mglDataA *mglParser::AddVar(const char *str)
 {
-       mglData *v=0;
+       mglDataA *v=0;
        MGL_TO_WCS(str,v = AddVar(wcs));
        return v;
 }
@@ -230,22 +243,19 @@ void mglParser::AddParam(int n, const wchar_t *str)
 //-----------------------------------------------------------------------------
 mglDataA *mglParser::FindVar(const wchar_t *name)
 {
+       if(name[0]=='!')        name = name+1;  // ignore complex prefix
        for(size_t i=0;i<DataList.size();i++)
                if(DataList[i] && DataList[i]->s==name) return DataList[i];
        return 0;
 }
 //-----------------------------------------------------------------------------
-mglData *mglParser::AddVar(const wchar_t *name)
+mglDataA *mglParser::AddVar(const wchar_t *name)
 {      // TODO add list of forbidden names (like function names)
-       for(size_t i=0;i<DataList.size();i++)
-               if(DataList[i] && DataList[i]->s==name)
-               {
-                       delete (DataList[i]);
-                       mglData *d = new mglData;       d->s = name;
-                       DataList[i] = d;        return d;
-               }
-       mglData *d = new mglData;       d->s = name;
-       DataList.push_back(d);
+       mglDataA *d=FindVar(name);
+       if(name[0]=='!' && dynamic_cast<mglDataC*>(d)==0)
+       {       d = new mglDataC;       d->s=(name+1);  DataList.push_back(d);  }
+       else if(!d)
+       {       d = new mglData;        d->s = name;    DataList.push_back(d);  }
        return d;
 }
 //-----------------------------------------------------------------------------
@@ -259,12 +269,7 @@ mglNum *mglParser::FindNum(const wchar_t *name)
 mglNum *mglParser::AddNum(const wchar_t *name)
 {
        mglNum *v = FindNum(name);
-       if(!v)
-       {
-               mglNum *n=new mglNum;   n->s = name;
-               NumList.push_back(n);
-               v = NumList[NumList.size()-1];
-       }
+       if(!v)  {       v=new mglNum;   v->s = name;    NumList.push_back(v);   }
        return v;
 }
 //-----------------------------------------------------------------------------
@@ -285,8 +290,10 @@ int MGL_LOCAL_PURE mglFindArg(const std::wstring &str)
        return 0;
 }
 //-----------------------------------------------------------------------------
+HMDT MGL_NO_EXPORT mglFormulaCalc(std::wstring string, mglParser *arg, const std::vector<mglDataA*> &head);
+HADT MGL_NO_EXPORT mglFormulaCalcC(std::wstring string, mglParser *arg, const std::vector<mglDataA*> &head);
+//-----------------------------------------------------------------------------
 // convert substrings to arguments
-mglData MGL_NO_EXPORT mglFormulaCalc(std::wstring string, mglParser *arg, const std::vector<mglDataA*> &head);
 void mglParser::FillArg(mglGraph *gr, int k, std::wstring *arg, mglArg *a)
 {
        register long n;
@@ -312,8 +319,20 @@ void mglParser::FillArg(mglGraph *gr, int k, std::wstring *arg, mglArg *a)
                                        for(;i<ll && w[i]!='\'';i++);
                                        if(i>i1)
                                        {
-                                               mglData d = mglFormulaCalc(w.substr(i1,i-i1-(w[i]=='\''?1:0)), this, DataList);
-                                               mglprintf(buf,32,L"%g",d.a[0]); a[n-1].w += buf;
+                                               if(w[i1]=='!')
+                                               {
+                                                       HADT d = mglFormulaCalcC(w.substr(i1+1,i-i1-(w[i]=='\''?1:0)), this, DataList);
+                                                       mreal di = imag(d->a[0]), dr = real(d->a[0]);
+                                                       if(di>0)        mglprintf(buf,32,L"%g+%gi",dr,di);
+                                                       else if(di<0)   mglprintf(buf,32,L"%g-%gi",dr,-di);     // TODO use \u2212 ???
+                                                       else    mglprintf(buf,32,L"%g",dr);
+                                                       a[n-1].w += buf;        delete d;
+                                               }
+                                               else
+                                               {
+                                                       HMDT d = mglFormulaCalc(w.substr(i1,i-i1-(w[i]=='\''?1:0)), this, DataList);
+                                                       mglprintf(buf,32,L"%g",d->a[0]);        a[n-1].w += buf;        delete d;
+                                               }
                                        }
                                }
                                else    a[n-1].w += w[i];
@@ -331,18 +350,41 @@ void mglParser::FillArg(mglGraph *gr, int k, std::wstring *arg, mglArg *a)
                else if((v = FindVar(arg[n].c_str()))!=0)       // try to find normal variables (for data creation)
                {       a[n-1].type=0;  a[n-1].d=v;     a[n-1].w=v->s;  }
                else if((f = FindNum(arg[n].c_str()))!=0)       // try to find normal number (for data creation)
-               {       a[n-1].type=2;  a[n-1].d=0;     a[n-1].v=f->d;  a[n-1].w = f->s;        }
+               {       a[n-1].type=2;  a[n-1].d=0;     a[n-1].v=f->d;  a[n-1].c=f->c;  a[n-1].w = f->s;        }
+               else if(arg[n][0]=='!') // complex array is asked
+               {       // parse all numbers and formulas by unified way
+                       HADT d = mglFormulaCalcC(arg[n].substr(1), this, DataList);
+                       if(d->GetNN()==1)
+                       {
+                               if(CheckForName(arg[n].substr(1)))
+                               {       a[n-1].type = 2;        a[n-1].v = d->v(0);     a[n-1].c = d->a[0];     }
+                               else
+                               {       a[n-1].type = 0;        a[n-1].d = AddVar(arg[n].c_str());      }
+                               delete d;
+                       }
+                       else
+                       {
+                               a[n-1].w = L"/*"+arg[n]+L"*/";
+                               d->temp=true;   DataList.push_back(d);
+                               a[n-1].type = 0;        a[n-1].d = d;
+                       }
+               }
                else
                {       // parse all numbers and formulas by unified way
-                       mglData d = mglFormulaCalc(arg[n], this, DataList);
-                       if(d.nx*d.ny*d.nz==1)
-                       {       a[n-1].type = 2;        a[n-1].v = d.a[0];      }
+                       HMDT d = mglFormulaCalc(arg[n], this, DataList);
+                       if(d->GetNN()==1)
+                       {
+                               if(CheckForName(arg[n]))
+                               {       a[n-1].type = 2;        a[n-1].c = a[n-1].v = d->v(0);  }
+                               else
+                               {       a[n-1].type = 0;        a[n-1].d = AddVar(arg[n].c_str());      }
+                               delete d;
+                       }
                        else
                        {
-                               mglData *u=new mglData; u->Set(d);
                                a[n-1].w = L"/*"+arg[n]+L"*/";
-                               u->temp=true;   DataList.push_back(u);
-                               a[n-1].type = 0;        a[n-1].d = u;
+                               d->temp=true;   DataList.push_back(d);
+                               a[n-1].type = 0;        a[n-1].d = d;
                        }
                }
        }
@@ -356,7 +398,7 @@ int mglParser::PreExec(mglGraph *, long k, std::wstring *arg, mglArg *a)
        {       DeleteVar(arg[1].c_str());      n=1;    }
        else if(!arg[0].compare(L"list"))       // parse command "list"
        {
-               if(k<3 || mgl_check_for_name(arg[1]))   return 2;
+               if(k<3 || CheckForName(arg[1])) return 2;
                long nx=0, ny=1,j=0,i,t=0;
                for(i=2;i<k;i++)
                {
@@ -374,54 +416,51 @@ int mglParser::PreExec(mglGraph *, long k, std::wstring *arg, mglArg *a)
                        }
                        if(ch=='|' && t==1)             {       nx = j>nx ? j:nx;       j=0;    ny++;   }
                }
-               mglData *v = AddVar(arg[1].c_str());
-               if(t==1)        nx = j>nx ? j:nx;
-               if(t==1)        // list of numeric values
+               mglDataA *vv = AddVar(arg[1].c_str());
+               mglData *v = dynamic_cast<mglData*>(vv);
+               mglDataC *vc = dynamic_cast<mglDataC*>(vv);
+               if(v)
                {
-                       v->Create(nx,ny);
-                       j=t=0;
-                       for(i=2;i<k;i++)
+                       if(t==1)        nx = j>nx ? j:nx;
+                       if(t==1)        // list of numeric values
                        {
-                               if(arg[i][0]=='|')      {       t++;    j=0;    }
-                               else
-                               {       v->a[j+nx*t] = a[i-1].v;        j++;    }
+                               v->Create(nx,ny);
+                               j=t=0;
+                               for(i=2;i<k;i++)
+                               {
+                                       if(arg[i][0]=='|')      {       t++;    j=0;    }
+                                       else
+                                       {       v->a[j+nx*t] = a[i-1].v;        j++;    }
+                               }
+                       }
+                       if(t==2)        // list of data
+                       {
+                               v->Set(a[1].d);
+                               for(long i=2;i<k;i++)   v->Join(*(a[i].d));
                        }
+                       n=1;
                }
-               if(t==2)        // list of data
+               if(vc)
                {
-                       mglData *b = dynamic_cast<mglData *>(a[1].d);
-                       if(!b)  return 1;
-                       long nn = 0;
-                       if(b->nz>1)     return 2;
-                       if(b->ny>1)
+                       if(t==1)        nx = j>nx ? j:nx;
+                       if(t==1)        // list of numeric values
                        {
-                               v->Create(b->nx, b->ny, nx);
-                               nn = b->nx*b->ny;
-                               for(i=2,j=0;i<k;i++)
+                               vc->Create(nx,ny);
+                               j=t=0;
+                               for(i=2;i<k;i++)
                                {
-                                       if(nn!=a[i-1].d->GetNx()*a[i-1].d->GetNy())     continue;
-                                       b = dynamic_cast<mglData *>(a[i-1].d);
-                                       if(b)   memcpy(v->a+j*nn,b->a,nn*(b->nz)*sizeof(mreal));
-                                       else    for(long ii=0;ii<a[i-1].d->GetNN();ii++)        v->a[ii+j*nn] = a[i-1].d->vthr(ii);
-                                       j+=a[i-1].d->GetNz();
+                                       if(arg[i][0]=='|')      {       t++;    j=0;    }
+                                       else
+                                       {       vc->a[j+nx*t] = a[i-1].c;       j++;    }
                                }
                        }
-                       else
+                       if(t==2)        // list of data
                        {
-                               v->Create(b->nx, nx);
-                               nn = b->nx;
-                               for(i=2,j=0;i<k;i++)
-                               {
-                                       if(nn!=a[i-1].d->GetNx())       continue;
-                                       b = dynamic_cast<mglData *>(a[i-1].d);
-                                       long nny = a[i-1].d->GetNy();
-                                       if(b)   memcpy(v->a+j*nn,b->a,nn*nny*sizeof(mreal));
-                                       else    for(long ii=0;ii<nn*nny;ii++)   v->a[ii+j*nn] = a[i-1].d->vthr(ii);
-                                       j+=nny;
-                               }
+                               vc->Set(a[1].d);
+                               for(long i=2;i<k;i++)   vc->Join(*(a[i].d));
                        }
+                       n=1;
                }
-               n=1;
        }
        return n;
 }
@@ -433,11 +472,12 @@ void mglParser::PutArg(std::wstring &str, bool def)
        {
                wchar_t ch = str[pos+1];
                if(ch>='0' && ch<='9')  str.replace(pos,2,par[ch-'0']);
-               if(ch>='a' && ch<='z')  str.replace(pos,2,par[ch-'a'+10]);
-               if(ch=='$')     str.replace(pos,2,L"\xffff");
+               else if(ch>='a' && ch<='z')     str.replace(pos,2,par[ch-'a'+10]);
+               else if(ch=='$')        str.replace(pos,2,L"\uffff");
+               else str.replace(pos,1,L"\uffff");
                pos = str.find('$',def?10:0);
        }
-       while((pos = str.find(L'\xffff'))<str.length()) str[pos]='$';
+       while((pos = str.find(L'\uffff'))<str.length()) str[pos]='$';
 }
 //-----------------------------------------------------------------------------
 std::wstring mgl_trim_ws(const std::wstring &str)
@@ -469,7 +509,8 @@ int mglParser::ParseDef(std::wstring &str)
                        if(s[0]=='$' && nn>=0 && nn<='z'-'a'+10)
                        {
                                res = 0;
-                               d = mglFormulaCalc(mgl_trim_ws(s.substr(2)), this, DataList).a[0];
+                               HMDT dd = mglFormulaCalc(mgl_trim_ws(s.substr(2)), this, DataList);
+                               d = dd->a[0];   delete dd;
                                char buf[32];   snprintf(buf,32,"%g",d);
                                buf[31] = 0;    AddParam(nn, buf);
                        }
@@ -481,7 +522,8 @@ int mglParser::ParseDef(std::wstring &str)
                        if(s[0]=='$' && nn>=0 && nn<='z'-'a'+10)
                        {
                                res = 0;
-                               d=mglFormulaCalc(mgl_trim_ws(s.substr(2)), this, DataList).a[0];
+                               HMDT dd = mglFormulaCalc(mgl_trim_ws(s.substr(2)), this, DataList);
+                               d=dd->a[0];     delete dd;
                                wchar_t buf[2]={0,0};   buf[0] = wchar_t(d);    AddParam(nn, buf);
                        }
                        return res+1;
@@ -583,7 +625,7 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos)
                if(!skip() && !arg[0].compare(L"stop"))
                {       Stop = true;    delete []a;     return 0;       }
                if(!arg[0].compare(L"func"))
-               {       delete []a;     return 0;       }
+               {       Stop = true;    delete []a;     return 0;       }
                n = FlowExec(gr, arg[0].c_str(),k-1,a);
                if(n)           {       delete []a;     return n-1;     }
                if(skip())      {       delete []a;     return 0;       }
@@ -598,11 +640,29 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos)
                {
                        if(k==3)
                        {
+                               DeleteVar(arg[1].c_str());      // force to delete variable with the same name
                                mglNum *v=AddNum(arg[1].c_str());
-                               v->d = mglFormulaCalc(arg[2],this, DataList).a[0];
+                               if(arg[2][0]=='!')      // complex number is added
+                               {       HADT dd = mglFormulaCalcC(arg[2].substr(1),this, DataList);
+                                       v->d=NAN;       v->c = dd->a[0];        delete dd;      }
+                               else
+                               {       HMDT dd = mglFormulaCalc(arg[2],this, DataList);
+                                       v->c = v->d = dd->a[0]; delete dd;      }
                        }
                        delete []a;     return k==3?0:1;
                }
+               if(!arg[0].compare(L"rkstep"))
+               {
+                       int res=1;
+                       if(k>2 && a[0].type==1 && a[1].type==1)
+                       {
+                               std::wstring a1 = arg[1], a2=arg[2];    res = 0;
+                               if(a1[0]=='\'') a1 = a1.substr(1,a1.length()-2);
+                               if(a2[0]=='\'') a2 = a2.substr(1,a2.length()-2);
+                               mgl_rk_step_w(this, a1.c_str(), a2.c_str(), (k>=3 && a[2].type==2)?a[2].v:1);
+                       }
+                       delete []a;     return res;
+               }
                if(!arg[0].compare(L"call"))
                {
                        n = 1;
@@ -836,7 +896,7 @@ void mglParser::Execute(mglGraph *gr, FILE *fp, bool print)
        if(gr==0 || fp==0)      return;
        std::wstring str;
        wchar_t ch;
-       while((ch=fgetwc(fp))!=WEOF)    str.push_back(ch);
+       while(!feof(fp) && size_t(ch=fgetwc(fp))!=WEOF) str.push_back(ch);
 //     while(!feof(fp))        str.push_back(fgetwc(fp));
        Execute(gr,str.c_str());
        if(print)       printf("%s\n",gr->Message());
@@ -859,13 +919,14 @@ void mglParser::Execute(mglGraph *gr, int n, const wchar_t **text)
                else if(r==2)   snprintf(buf,64,"\nWrong command in line %ld\n", i+1);
                else if(r==3)   snprintf(buf,64,"\nString too long in line %ld\n", i+1);
                else if(r==4)   snprintf(buf,64,"\nUnbalanced ' in line %ld\n", i+1);
+               else if(r==5)   snprintf(buf,64,"\nChange temporary data in line %ld\n", i+1);
                else if(gr->GetWarn()>0)        snprintf(buf,64," in line %ld\n", i+1);
                else *buf=0;
                buf[63] = 0;
                if(*buf)        gr->SetWarn(-2,buf);
                if(r>0 && r<5)  res=r;
        }
-       int code[]={mglScrArg,  mglScrCmd,      mglScrLong,     mglScrStr};
+       int code[]={mglScrArg,  mglScrCmd,      mglScrLong,     mglScrStr, mglScrTemp};
        if(res>0)       gr->SetWarn(code[res-1],"MGL Parser");
 }
 //-----------------------------------------------------------------------------
@@ -933,11 +994,11 @@ HMPR MGL_EXPORT mgl_create_parser()               {       return new mglParser;   }
 void MGL_EXPORT mgl_delete_parser(HMPR p)      {       delete p;       }
 void MGL_EXPORT mgl_parser_add_param(HMPR p, int id, const char *str)                  {       p->AddParam(id,str);    }
 void MGL_EXPORT mgl_parser_add_paramw(HMPR p, int id, const wchar_t *str)              {       p->AddParam(id,str);    }
-HMDT MGL_EXPORT mgl_parser_add_var(HMPR p, const char *name)   {       return p->AddVar(name); }
-MGL_EXPORT_PURE mglDataA *mgl_parser_find_var(HMPR p, const char *name)        {       return p->FindVar(name);}
+MGL_EXPORT mglDataA *mgl_parser_add_var(HMPR p, const char *name)      {       return p->AddVar(name); }
+MGL_EXPORT mglDataA *mgl_parser_find_var(HMPR p, const char *name)     {       return p->FindVar(name);}
 void MGL_EXPORT mgl_parser_del_var(HMPR p, const char *name)   {       p->DeleteVar(name);     }
-HMDT MGL_EXPORT mgl_parser_add_varw(HMPR p, const wchar_t *name)       {       return p->AddVar(name); }
-MGL_EXPORT_PURE mglDataA *mgl_parser_find_varw(HMPR p, const wchar_t *name)    {       return p->FindVar(name);}
+MGL_EXPORT mglDataA *mgl_parser_add_varw(HMPR p, const wchar_t *name)  {       return p->AddVar(name); }
+MGL_EXPORT mglDataA *mgl_parser_find_varw(HMPR p, const wchar_t *name) {       return p->FindVar(name);}
 void MGL_EXPORT mgl_parser_del_varw(HMPR p, const wchar_t *name)       {       p->DeleteVar(name);     }
 int MGL_EXPORT mgl_parse_line(HMGL gr, HMPR p, const char *str, int pos)
 {      return p->Parse(gr, str, pos);  }
@@ -964,9 +1025,9 @@ void MGL_EXPORT mgl_parser_add_param_(uintptr_t* p, int *id, const char *str, in
 /*===!!! NOTE !!! You must not delete obtained data arrays !!!===============*/
 uintptr_t MGL_EXPORT mgl_parser_add_var_(uintptr_t* p, const char *name, int l)
 {      char *s=new char[l+1];          memcpy(s,name,l);       s[l]=0;
-       mglData *v=_PR_->AddVar(s);     delete []s;     return uintptr_t(v);    }
+       mglDataA *v=_PR_->AddVar(s);    delete []s;     return uintptr_t(v);    }
 /*===!!! NOTE !!! You must not delete obtained data arrays !!!===============*/
-uintptr_t MGL_EXPORT_PURE mgl_parser_find_var_(uintptr_t* p, const char *name, int l)
+uintptr_t MGL_EXPORT mgl_parser_find_var_(uintptr_t* p, const char *name, int l)
 {      char *s=new char[l+1];          memcpy(s,name,l);       s[l]=0;
        mglDataA *v=_PR_->FindVar(s);   delete []s;     return uintptr_t(v);    }
 void MGL_EXPORT mgl_parser_del_var_(uintptr_t* p, const char *name, int l)
@@ -989,52 +1050,56 @@ long MGL_EXPORT mgl_use_parser(HMPR pr, int inc)
 long MGL_EXPORT mgl_use_parser_(uintptr_t *p, int *inc)
 {      _PR_->InUse+=*inc;      return _PR_->InUse;     }
 //---------------------------------------------------------------------------
-MGL_EXPORT_PURE mglDataA *mgl_parser_get_var(HMPR p, unsigned long id)
+MGL_EXPORT mglDataA *mgl_parser_get_var(HMPR p, unsigned long id)
 {      return id<p->DataList.size()?p->DataList[id]:0; }
-uintptr_t MGL_EXPORT_PURE mgl_parser_get_var_(uintptr_t* p, unsigned long *id)
+uintptr_t MGL_EXPORT mgl_parser_get_var_(uintptr_t* p, unsigned long *id)
 {      return uintptr_t(mgl_parser_get_var(_PR_,*id)); }
-long MGL_EXPORT_PURE mgl_parser_num_var(HMPR p)
+long MGL_EXPORT mgl_parser_num_var(HMPR p)
 {      return p->DataList.size();      }
-long MGL_EXPORT_PURE mgl_parser_num_var_(uintptr_t* p)
+long MGL_EXPORT mgl_parser_num_var_(uintptr_t* p)
 {      return mgl_parser_num_var(_PR_);        }
 //---------------------------------------------------------------------------
-int MGL_EXPORT_PURE mgl_parser_cmd_type(HMPR pr, const char *name)
+int MGL_EXPORT mgl_parser_cmd_type(HMPR pr, const char *name)
 {
        const mglCommand *cmd = pr->FindCommand(name);
        return cmd ? cmd->type + 1 : 0;
 }
-int MGL_EXPORT_PURE mgl_parser_cmd_type_(uintptr_t* p, const char *str, int l)
+int MGL_EXPORT mgl_parser_cmd_type_(uintptr_t* p, const char *str, int l)
 {      char *s=new char[l+1];  memcpy(s,str,l);        s[l]=0;
        l = mgl_parser_cmd_type(_PR_, s);       delete []s;     return l;       }
 //---------------------------------------------------------------------------
-MGL_EXPORT_PURE const char *mgl_parser_cmd_desc(HMPR pr, const char *name)
+MGL_EXPORT const char *mgl_parser_cmd_desc(HMPR pr, const char *name)
 {
        const mglCommand *cmd = pr->FindCommand(name);
        return cmd ? cmd->desc : 0;
 }
-MGL_EXPORT_PURE const char *mgl_parser_cmd_frmt(HMPR pr, const char *name)
+MGL_EXPORT const char *mgl_parser_cmd_frmt(HMPR pr, const char *name)
 {
        const mglCommand *cmd = pr->FindCommand(name);
        return cmd ? cmd->form : 0;
 }
 //---------------------------------------------------------------------------
-MGL_EXPORT_PURE const char *mgl_parser_cmd_name(HMPR pr, long id)
+MGL_EXPORT const char *mgl_parser_cmd_name(HMPR pr, long id)
 {      return (id<mgl_parser_cmd_num(pr) && id>=0) ? pr->Cmd[id].name:"";      }
-long MGL_EXPORT_PURE mgl_parser_cmd_num(HMPR pr)
+long MGL_EXPORT mgl_parser_cmd_num(HMPR pr)
 {      register long i=0;      while(pr->Cmd[i].name[0])       i++;    return i;       }
 //---------------------------------------------------------------------------
 HMDT MGL_EXPORT mgl_parser_calc(HMPR pr, const char *formula)
-{
-       HMDT d=0;
-       MGL_TO_WCS(formula,d = mgl_parser_calcw(pr,wcs));
-       return d;
-}
+{      HMDT d=0;       MGL_TO_WCS(formula,d = mgl_parser_calcw(pr,wcs));       return d;       }
 HMDT MGL_EXPORT mgl_parser_calcw(HMPR pr, const wchar_t *formula)
-{      mglData *d = new mglData(mglFormulaCalc(formula,pr, pr->DataList));     return d;       }
+{      return mglFormulaCalc(formula,pr, pr->DataList);        }
 uintptr_t MGL_EXPORT mgl_parser_calc_(uintptr_t *p, const char *str,int l)
 {      char *s=new char[l+1];  memcpy(s,str,l);        s[l]=0;
        uintptr_t d = (uintptr_t)mgl_parser_calc(_PR_, s);      delete []s;     return d;       }
 //---------------------------------------------------------------------------
+HADT MGL_EXPORT mgl_parser_calc_complex(HMPR pr, const char *formula)
+{      HADT d=0;       MGL_TO_WCS(formula,d = mgl_parser_calc_complexw(pr,wcs));       return d;       }
+HADT MGL_EXPORT mgl_parser_calc_complexw(HMPR pr, const wchar_t *formula)
+{      return mglFormulaCalcC(formula,pr, pr->DataList);       }
+uintptr_t MGL_EXPORT mgl_parser_calc_complex_(uintptr_t *p, const char *str,int l)
+{      char *s=new char[l+1];  memcpy(s,str,l);        s[l]=0;
+       uintptr_t d = (uintptr_t)mgl_parser_calc_complex(_PR_, s);      delete []s;     return d;       }
+//---------------------------------------------------------------------------
 void MGL_EXPORT mgl_parser_del_all(HMPR p)     {       p->DeleteAll(); }
 void MGL_EXPORT mgl_parser_del_all_(uintptr_t *p)      {       _PR_->DeleteAll();      }
 //---------------------------------------------------------------------------
@@ -1067,3 +1132,178 @@ void MGL_EXPORT mgl_parser_load_(uintptr_t *p, const char *dll_name,int l)
 {      char *s=new char[l+1];  memcpy(s,dll_name,l);   s[l]=0;
        mgl_parser_load(_PR_, s);       delete []s;     }
 //---------------------------------------------------------------------------
+struct mglRKdat
+{
+       mglDataA *v;
+       std::wstring e;
+       bool cmplx;
+       mglDataC cin,c1,c2,c3,c4, *cc;
+       mglData  din,d1,d2,d3,d4, *dd;
+       mglRKdat(mglDataA *var, std::wstring &eq):v(var), e(eq)
+       {       cmplx = dynamic_cast<mglDataC*>(var);   cc=0;   dd=0;   }
+       void allocate()
+       {
+               if(cmplx)
+               {       cc = dynamic_cast<mglDataC*>(v);        cin.Set(v);     }
+               else
+               {       dd = dynamic_cast<mglData*>(v);         din.Set(v);     }
+       }
+};
+void MGL_EXPORT mgl_rk_step_w(HMPR pr, const wchar_t *Eqs, const wchar_t *Vars, mreal dt)
+{
+       const std::wstring eqs(Eqs);
+       const std::wstring vars(Vars);
+       std::vector<mglRKdat> rkv;
+       size_t iv=0,jv=0,ie=0,je=0;
+       while(1)
+       {
+               iv = vars.find(';',jv); ie = eqs.find(';',je);
+               mglDataA *vv=mgl_parser_find_varw(pr,vars.substr(jv,iv-jv).c_str());
+               std::wstring eq = eqs.substr(je,ie-je).c_str();
+               if(vv)  rkv.push_back(mglRKdat(vv, eq ));
+               jv = iv+1;      je = ie+1;
+               if(iv==std::wstring::npos || ie==std::wstring::npos)    break;
+       }
+       for(size_t i=0;i<rkv.size();i++)        rkv[i].allocate();
+       mreal hh = dt/2;
+       for(size_t i=0;i<rkv.size();i++)
+       {
+               mglRKdat &rk = rkv[i];
+               if(rk.cmplx)    rk.c1.Move(mglFormulaCalcC(rk.e, pr, pr->DataList));
+               else    rk.d1.Move(mglFormulaCalc(rk.e, pr, pr->DataList));
+       }
+       for(size_t i=0;i<rkv.size();i++)
+       {
+               mglRKdat &rk = rkv[i];
+               if(rk.cc)
+               {
+                       long n = rk.cc->GetNN();        dual a = hh*rk.c1.a[0];
+                       if(rk.c1.GetNN()==n)
+#pragma omp parallel for
+                               for(long j=0;j<n;j++)   rk.cc->a[j] = rk.cin.a[j] + hh*rk.c1.a[j];
+                       else
+#pragma omp parallel for
+                               for(long j=0;j<n;j++)   rk.cc->a[j] = rk.cin.a[j] + a;
+               }
+               if(rk.dd)
+               {
+                       long n = rk.dd->GetNN();        mreal a = hh*rk.d1.a[0];
+                       if(rk.d1.GetNN()==n)
+#pragma omp parallel for
+                               for(long j=0;j<n;j++)   rk.dd->a[j] = rk.din.a[j] + hh*rk.d1.a[j];
+                       else
+#pragma omp parallel for
+                               for(long j=0;j<n;j++)   rk.dd->a[j] = rk.din.a[j] + a;
+               }
+       }
+
+       for(size_t i=0;i<rkv.size();i++)
+       {
+               mglRKdat &rk = rkv[i];
+               if(rk.cmplx)    rk.c2.Move(mglFormulaCalcC(rk.e, pr, pr->DataList));
+               else    rk.d2.Move(mglFormulaCalc(rk.e, pr, pr->DataList));
+       }
+       for(size_t i=0;i<rkv.size();i++)
+       {
+               mglRKdat &rk = rkv[i];
+               if(rk.cc)
+               {
+                       long n = rk.cc->GetNN();        dual a = hh*rk.c2.a[0];
+                       if(rk.c2.GetNN()==n)
+#pragma omp parallel for
+                               for(long j=0;j<n;j++)   rk.cc->a[j] = rk.cin.a[j] + hh*rk.c2.a[j];
+                       else
+#pragma omp parallel for
+                               for(long j=0;j<n;j++)   rk.cc->a[j] = rk.cin.a[j] + a;
+               }
+               if(rk.dd)
+               {
+                       long n = rk.dd->GetNN();        mreal a = hh*rk.d2.a[0];
+                       if(rk.d2.GetNN()==n)
+#pragma omp parallel for
+                               for(long j=0;j<n;j++)   rk.dd->a[j] = rk.din.a[j] + hh*rk.d2.a[j];
+                       else
+#pragma omp parallel for
+                               for(long j=0;j<n;j++)   rk.dd->a[j] = rk.din.a[j] + a;
+               }
+       }
+
+       for(size_t i=0;i<rkv.size();i++)
+       {
+               mglRKdat &rk = rkv[i];
+               if(rk.cmplx)    rk.c3.Move(mglFormulaCalcC(rk.e, pr, pr->DataList));
+               else    rk.d3.Move(mglFormulaCalc(rk.e, pr, pr->DataList));
+       }
+       for(size_t i=0;i<rkv.size();i++)
+       {
+               mglRKdat &rk = rkv[i];
+               if(rk.cc)
+               {
+                       long n = rk.cc->GetNN();        dual a = dt*rk.c3.a[0];
+                       if(rk.c3.GetNN()==n)
+#pragma omp parallel for
+                               for(long j=0;j<n;j++)   rk.cc->a[j] = rk.cin.a[j] + dt*rk.c3.a[j];
+                       else
+#pragma omp parallel for
+                               for(long j=0;j<n;j++)   rk.cc->a[j] = rk.cin.a[j] + a;
+               }
+               if(rk.dd)
+               {
+                       long n = rk.dd->GetNN();        mreal a = dt*rk.d3.a[0];
+                       if(rk.d3.GetNN()==n)
+#pragma omp parallel for
+                               for(long j=0;j<n;j++)   rk.dd->a[j] = rk.din.a[j] + dt*rk.d3.a[j];
+                       else
+#pragma omp parallel for
+                               for(long j=0;j<n;j++)   rk.dd->a[j] = rk.din.a[j] + a;
+               }
+       }
+
+       for(size_t i=0;i<rkv.size();i++)
+       {
+               mglRKdat &rk = rkv[i];
+               if(rk.cmplx)    rk.c4.Move(mglFormulaCalcC(rk.e, pr, pr->DataList));
+               else    rk.d4.Move(mglFormulaCalc(rk.e, pr, pr->DataList));
+       }
+       for(size_t i=0;i<rkv.size();i++)
+       {
+               mglRKdat &rk = rkv[i];
+               if(rk.cc)
+               {
+                       long n = rk.cc->GetNN();
+                       dual a = (rk.c1.a[0]+rk.c2.a[0]+mreal(2)*(rk.c3.a[0]+rk.c4.a[0]))*(dt/6);
+                       if(rk.c1.GetNN()==n)
+#pragma omp parallel for
+                               for(long j=0;j<n;j++)   rk.cc->a[j] = rk.cin.a[j] + (rk.c1.a[j]+rk.c2.a[j]+mreal(2)*(rk.c3.a[j]+rk.c4.a[j]))*(dt/6);
+                       else
+#pragma omp parallel for
+                               for(long j=0;j<n;j++)   rk.cc->a[j] = rk.cin.a[j] + a;
+               }
+               if(rk.dd)
+               {
+                       long n = rk.dd->GetNN();
+                       mreal a = (rk.d1.a[0]+rk.d2.a[0]+2*(rk.d3.a[0]+rk.d4.a[0]))*(dt/6);
+                       if(rk.d1.GetNN()==n)
+#pragma omp parallel for
+                               for(long j=0;j<n;j++)   rk.dd->a[j] = rk.din.a[j] + (rk.d1.a[j]+rk.d2.a[j]+2*(rk.d3.a[j]+rk.d4.a[j]))*(dt/6);
+                       else
+#pragma omp parallel for
+                               for(long j=0;j<n;j++)   rk.dd->a[j] = rk.din.a[j] + a;
+               }
+       }
+}
+void MGL_EXPORT mgl_rk_step(HMPR pr, const char *Eqs, const char *Vars, mreal dt)
+{
+       if(Eqs && *Eqs && Vars && *Vars)
+       {
+               size_t s=mbstowcs(0,Eqs,0), w=mbstowcs(0,Vars,0);
+               wchar_t *eqs=new wchar_t[s+1];  mbstowcs(eqs,Eqs ,s);   eqs[s]=0;
+               wchar_t *wcs=new wchar_t[s+1];  mbstowcs(wcs,Vars,s);   wcs[w]=0;
+               mgl_rk_step_w(pr,eqs,wcs,dt);   delete []wcs;   delete []eqs;
+       }
+}
+void MGL_EXPORT mgl_rk_step_(uintptr_t *p, const char *eqs, const char *vars, double *dt,int l,int m)
+{      char *e=new char[l+1];  memcpy(e,eqs,l);        e[l]=0;
+       char *s=new char[m+1];  memcpy(s,vars,m);       s[m]=0;
+       mgl_rk_step(_PR_,e,s,*dt);      delete []e;     delete []s;     }
+//---------------------------------------------------------------------------
index a1dd08840d8db0b26d665f42cff6c64d1e992a42..079dee0fe9feecae3d6ff778575fd6d556f38bc3 100644 (file)
@@ -23,8 +23,7 @@
 #include "mgl2/thread.h"\r
 #include "mgl2/base.h"\r
 const double GAMMA=0.1;        ///< value for damping\r
-mglData MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector<mglDataA*> &head);\r
-mglDataC MGL_NO_EXPORT mglFormulaCalcC(const char *str, const std::vector<mglDataA*> &head);\r
+HADT MGL_NO_EXPORT mglFormulaCalcC(const char *str, const std::vector<mglDataA*> &head);\r
 //-----------------------------------------------------------------------------\r
 struct mgl_pde_ham\r
 {\r
@@ -51,34 +50,38 @@ void MGL_NO_EXPORT mgl_pde_hprep(const mgl_pde_ham *f)
 \r
        x.Fill(f->xx,f->xx+f->dx*(nx-1),'x');   p.Freq(0,'x');\r
        y.Fill(f->yy,f->yy+f->dy*(ny-1),'y');   q.Freq(0,'y');\r
-       mglDataC res = mglFormulaCalcC(f->eqs, list);\r
+       HADT res = mglFormulaCalcC(f->eqs, list);\r
 #pragma omp parallel for\r
-       for(long i=0;i<nx*ny;i++)       f->hxy[i] = res.a[i]*dd;\r
+       for(long i=0;i<nx*ny;i++)       f->hxy[i] = res->a[i]*dd;\r
+       delete res;\r
        if(ny>2)\r
        {\r
                x.Fill(f->xs);  p.Freq(f->dp,'x');\r
                res = mglFormulaCalcC(f->eqs, list);\r
 #pragma omp parallel for\r
-               for(long i=0;i<nx*ny;i++)       f->huy[i] = res.a[i]*dd;\r
+               for(long i=0;i<nx*ny;i++)       f->huy[i] = res->a[i]*dd;\r
+               delete res;\r
        }\r
        x.Fill(f->xs);  p.Freq(f->dp,'x');\r
        y.Fill(f->ys);  q.Freq(f->dq,'y');\r
        res = mglFormulaCalcC(f->eqs, list);\r
 #pragma omp parallel for\r
-       for(long i=0;i<nx*ny;i++)       f->huv[i] = res.a[i]*dd;\r
+       for(long i=0;i<nx*ny;i++)       f->huv[i] = res->a[i]*dd;\r
+       delete res;\r
        if(ny>2)\r
        {\r
                x.Fill(f->xx,f->xx+f->dx*(nx-1),'x');   p.Freq(0,'x');\r
                res = mglFormulaCalcC(f->eqs, list);\r
 #pragma omp parallel for\r
-               for(long i=0;i<nx*ny;i++)       f->hxv[i] = res.a[i]*dd;\r
+               for(long i=0;i<nx*ny;i++)       f->hxv[i] = res->a[i]*dd;\r
+               delete res;\r
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
 // Solve equation dx/dz = func(p,q,x,y,z,|u|)[u] where p=d/dx, q=d/dy. At this moment simplified form of ham is supported: ham = f(p,q,z) + g(x,y,z,'u'), where variable 'u'=|u| (for allowing solve nonlinear problems). You may specify imaginary part like ham = p^2 + i*x*(x>0) but only if dependence on variable 'i' is linear (i.e. ham = hre+i*him).\r
 HADT MGL_EXPORT mgl_pde_solve_c(HMGL gr, const char *ham, HCDT ini_re, HCDT ini_im, mreal dz, mreal k0, const char *opt)\r
 {\r
-       gr->SaveState(opt);\r
+       mreal gamma = gr->SaveState(opt);       if(mgl_isnan(gamma))    gamma = GAMMA;\r
        mglPoint Min=gr->Min, Max=gr->Max;\r
        long nx=ini_re->GetNx(), ny=ini_re->GetNy(), nz = long((Max.z-Min.z)/dz)+1;\r
        if(nx<2 || nz<2 || Max.x==Min.x)                        // Too small data\r
@@ -106,10 +109,10 @@ HADT MGL_EXPORT mgl_pde_solve_c(HMGL gr, const char *ham, HCDT ini_re, HCDT ini_
        for(long j=0;j<2*ny;j++)        for(long i=0;i<2*nx;i++)        // step 1\r
        {\r
                register long i0 = i+2*nx*j;\r
-               if(i<nx/2)              dmp[i0] += GAMMA*mgl_ipow((nx/2-i)/(nx/2.),2);\r
-               if(i>3*nx/2)    dmp[i0] += GAMMA*mgl_ipow((i-3*nx/2-1)/(nx/2.),2);\r
-               if(j<ny/2)              dmp[i0] += GAMMA*mgl_ipow((ny/2-j)/(ny/2.),2);\r
-               if(j>3*ny/2)    dmp[i0] += GAMMA*mgl_ipow((j-3*ny/2-1)/(ny/2.),2);\r
+               if(i<nx/2)              dmp[i0] += gamma*mgl_ipow((nx/2-i)/(nx/2.),2);\r
+               if(i>3*nx/2)    dmp[i0] += gamma*mgl_ipow((i-3*nx/2-1)/(nx/2.),2);\r
+               if(j<ny/2)              dmp[i0] += gamma*mgl_ipow((ny/2-j)/(ny/2.),2);\r
+               if(j>3*ny/2)    dmp[i0] += gamma*mgl_ipow((j-3*ny/2-1)/(ny/2.),2);\r
        }\r
        mreal dx = (Max.x-Min.x)/(nx-1), dy = ny>1?(Max.y-Min.y)/(ny-1):0;\r
        mreal dp = M_PI/(Max.x-Min.x)/k0, dq = M_PI/(Max.y-Min.y)/k0;\r
index 9e94096d2ee1257501c0eb0a5515d58bc2b22c21..3a753ed98dba00dfa6ca9126c8180be4da15538a 100644 (file)
@@ -31,10 +31,21 @@ inline mreal get_pfact(float pf, float Depth)
 void mglCanvas::SetSize(int w,int h,bool clf)\r
 {\r
        if(w<=0 || h<=0)        {       SetWarn(mglWarnSize,"SetSize"); return; }\r
+       if(Width==w || Height==h)\r
+       {\r
+               InPlot(0,1,0,1,false);\r
+               if(clf || (Quality&4))  Clf();\r
+               return;\r
+       }\r
+\r
        double dx = double(w)/Width, dy = double(h)/Height, dz = sqrt(double(w*h))/Depth;\r
        Width = w;      Height = h;     Depth = long(sqrt(double(w*h)));\r
        long s = long(w)*long(h);\r
-#pragma omp critical(rgb)\r
+#if MGL_HAVE_PTHREAD\r
+       pthread_mutex_lock(&mutexClf);\r
+#elif MGL_HAVE_OMP\r
+       omp_set_lock(&lockClf);\r
+#endif\r
        if(G)   {       delete []G;     delete []C;     delete []Z;     delete []G4;delete []GB;delete []OI;    G=0;    }\r
        G = new unsigned char[s*3];\r
        G4= new unsigned char[s*4];\r
@@ -44,10 +55,22 @@ void mglCanvas::SetSize(int w,int h,bool clf)
        OI= new int[s];\r
 #pragma omp parallel for\r
        for(long i=0;i<s;i++)   memcpy(GB+4*i,BDef,4);\r
+#if MGL_HAVE_PTHREAD\r
+       pthread_mutex_unlock(&mutexClf);\r
+#elif MGL_HAVE_OMP\r
+       omp_unset_lock(&lockClf);\r
+#endif\r
+\r
        InPlot(0,1,0,1,false);\r
        if(clf || (Quality&4))  Clf();\r
        else    // NOTE: no scaling for text (a bit complicated)\r
        {\r
+#if MGL_HAVE_PTHREAD\r
+               pthread_mutex_lock(&mutexPnt);\r
+               pthread_mutex_lock(&mutexClf);\r
+#elif MGL_HAVE_OMP\r
+               omp_set_lock(&lockClf);\r
+#endif\r
                long n = long(Pnt.size());\r
 #pragma omp parallel for\r
                for(long i=0;i<n;i++)\r
@@ -58,6 +81,8 @@ void mglCanvas::SetSize(int w,int h,bool clf)
                        if(mgl_isnum(q.w))\r
                        {       q.u*=dx;        q.v*=dy;        q.w*=dz;        }\r
                }\r
+               for(size_t i=0;i<Sub.size();i++)\r
+               {       mglBlock &q = Sub[i];   q.n1*=dx;       q.n2*=dx;       q.n3*=dy;       q.n4*=dy;       }\r
                for(size_t k=0;k<DrwDat.size();k++)     // scale frames too\r
                {\r
                        mglStack<mglPnt>  &pnt = DrwDat[k].Pnt;\r
@@ -71,7 +96,16 @@ void mglCanvas::SetSize(int w,int h,bool clf)
                                if(mgl_isnum(q.w))\r
                                {       q.u*=dx;        q.v*=dy;        q.w*=dz;        }\r
                        }\r
+                       std::vector<mglBlock>  &sub = DrwDat[k].Sub;\r
+                       for(size_t i=0;i<sub.size();i++)\r
+                       {       mglBlock &q = sub[i];   q.n1*=dx;       q.n2*=dx;       q.n3*=dy;       q.n4*=dy;       }\r
                }\r
+#if MGL_HAVE_PTHREAD\r
+               pthread_mutex_unlock(&mutexClf);\r
+               pthread_mutex_unlock(&mutexPnt);\r
+#elif MGL_HAVE_OMP\r
+               omp_unset_lock(&lockClf);\r
+#endif\r
                ClfZB();        Finish();\r
        }\r
 }\r
@@ -125,19 +159,19 @@ bool mglCanvas::ScalePoint(const mglMatrix *M, mglPoint &p, mglPoint &n, bool us
 long mglCanvas::ProjScale(int nf, long id, bool text)\r
 {\r
        const mglPnt &pi = Pnt[id];\r
-       mglPoint pp = mglPoint(pi.x,pi.y,pi.z), nn = mglPoint(pi.u,pi.v,pi.w), p, n;\r
+       mglPoint pp(pi.x,pi.y,pi.z), nn(pi.u,pi.v,pi.w), p, n;\r
        if(mgl_isnan(pp.x))     return -1;\r
        mreal w=B1.b[0]/2, h=B1.b[4]/2, d=B1.b[8]/2, xx=B1.x-w/2, yy=B1.y-h/2;\r
-       if(!pi.sub)\r
+       if(pi.sub>=0)\r
        {\r
-               mglPoint q = RestorePnt(pp)/(2*B.pf);\r
-               mglPoint u = RestorePnt(nn,true);       u.Normalize();\r
+               mglPoint q(RestorePnt(pp)/(2*B.pf));\r
+               mglPoint u(RestorePnt(nn,true));        u.Normalize();\r
                if(nf==0)\r
                {       p.x = xx + q.x*w;       p.y = yy + q.y*h;       p.z = B1.z + q.z*d;     n = u;  }\r
                else if(nf==1)\r
-               {       p.x = xx + q.x*w;       p.y = yy+h + q.z*h;     p.z = B1.z - q.y*d;     n = mglPoint(u.x,u.z,-u.y);     }\r
+               {       p.x = xx + q.x*w;       p.y = yy+h + q.z*h;     p.z = B1.z - q.y*d;     n.Set(u.x,u.z,-u.y);    }\r
                else if(nf==2)\r
-               {       p.x = xx+w + q.z*w;     p.y = yy + q.y*h;       p.z = B1.z - q.x*d;     n = mglPoint(u.z,u.y,-u.x);     }\r
+               {       p.x = xx+w + q.z*w;     p.y = yy + q.y*h;       p.z = B1.z - q.x*d;     n.Set(u.z,u.y,-u.x);    }\r
                else\r
                {\r
                        const mreal *b=B.b;     n = nn;\r
@@ -155,15 +189,18 @@ long mglCanvas::ProjScale(int nf, long id, bool text)
        return CopyProj(id,p,text?n:nn,pi.sub);\r
 }\r
 //-----------------------------------------------------------------------------\r
+void mglCanvas::LightScale(const mglMatrix *M, mglLight &ls)\r
+{\r
+       ls.p=ls.d;      ls.q=ls.r;\r
+       ScalePoint(M,ls.q,ls.p,false);\r
+       ls.p /= ls.p.norm();\r
+}\r
+//-----------------------------------------------------------------------------\r
 void mglCanvas::LightScale(const mglMatrix *M)\r
 {\r
-       for(long i=0;i<10;i++)\r
-       {\r
-               if(!light[i].n) continue;\r
-               light[i].p=light[i].d;  light[i].q=light[i].r;\r
-               ScalePoint(M,light[i].q,light[i].p,false);\r
-               light[i].p /= light[i].p.norm();\r
-       }\r
+       for(long i=0;i<10;i++)  if(light[i].n)  LightScale(M,light[i]);\r
+       for(size_t j=0;j<Sub.size();j++)\r
+               for(long i=0;i<10;i++)  if(light[i].n)  LightScale(&(Sub[j].B),Sub[j].light[i]);\r
 }\r
 //-----------------------------------------------------------------------------\r
 // NOTE: Perspective is not fully supported now !!! Also it use LAST InPlot parameters!!!\r
@@ -352,7 +389,7 @@ void mglCanvas::pxl_transform(long id, long n, const void *)
        for(long i=id;i<n;i+=mglNumThr)\r
        {\r
                mglPnt &p=Pnt[i];\r
-               if(!p.sub)\r
+               if(p.sub>=0)\r
                {\r
                        register float x = p.xx-Width/2., y = p.yy-Height/2., z = p.zz-Depth/2.;\r
                        p.x = b[0]*x + b[1]*y + b[2]*z + dx;\r
@@ -495,12 +532,12 @@ void mglCanvas::pxl_primdr(long id, long , const void *)
                                register long n1=p.n1, n2=p.n2, n3=p.n3, n4=p.n4;\r
                                switch(p.type)\r
                                {\r
-                               case 0: mark_draw(Pnt[n1],n4,p.s,&d);   break;\r
+                               case 3: fast_draw(Pnt[n1],Pnt[n4],&d);  fast_draw(Pnt[n2],Pnt[n3],&d);  break;\r
                                case 1: fast_draw(Pnt[n1],Pnt[n2],&d);  break;\r
+                               case 4: glyph_draw(p,&d);       break;\r
+                               case 0: mark_draw(Pnt[n1],n4,p.s,&d);   break;\r
                                case 2: fast_draw(Pnt[n1],Pnt[n2],&d);  fast_draw(Pnt[n1],Pnt[n3],&d);\r
                                                fast_draw(Pnt[n2],Pnt[n3],&d);  break;\r
-                               case 3: fast_draw(Pnt[n1],Pnt[n4],&d);  fast_draw(Pnt[n2],Pnt[n3],&d);  break;\r
-                               case 4: glyph_draw(p,&d);       break;\r
                                }\r
                        }\r
                }\r
@@ -522,12 +559,12 @@ void mglCanvas::pxl_primdr(long id, long , const void *)
                                register long n1=p.n1, n2=p.n2, n3=p.n3, n4=p.n4;\r
                                switch(p.type)\r
                                {\r
-                               case 0: mark_draw(Pnt[n1],n4,p.s,&d);   break;\r
-                               case 1: line_draw(Pnt[n1],Pnt[n2],&d);  break;\r
-                               case 2: trig_draw(Pnt[n1],Pnt[n2],Pnt[n3],true,&d);     break;\r
                                case 3: trig_draw(Pnt[n1],Pnt[n2],Pnt[n4],true,&d);\r
                                                trig_draw(Pnt[n1],Pnt[n3],Pnt[n4],true,&d);     break;\r
+                               case 1: line_draw(Pnt[n1],Pnt[n2],&d);  break;\r
                                case 4: glyph_draw(p,&d);       break;\r
+                               case 0: mark_draw(Pnt[n1],n4,p.s,&d);   break;\r
+                               case 2: trig_draw(Pnt[n1],Pnt[n2],Pnt[n3],true,&d);     break;\r
                                }\r
                        }\r
                }\r
@@ -549,11 +586,11 @@ void mglCanvas::pxl_primdr(long id, long , const void *)
                                register long n1=p.n1, n2=p.n2, n3=p.n3, n4=p.n4;\r
                                switch(p.type)\r
                                {\r
-                               case 0: mark_draw(Pnt[n1],n4,p.s,&d);   break;\r
-                               case 1: line_draw(Pnt[n1],Pnt[n2],&d);  break;\r
-                               case 2: trig_draw(Pnt[n1],Pnt[n2],Pnt[n3],true,&d);     break;\r
                                case 3: quad_draw(Pnt[n1],Pnt[n2],Pnt[n3],Pnt[n4],&d);  break;\r
+                               case 1: line_draw(Pnt[n1],Pnt[n2],&d);  break;\r
                                case 4: glyph_draw(p,&d);       break;\r
+                               case 0: mark_draw(Pnt[n1],n4,p.s,&d);   break;\r
+                               case 2: trig_draw(Pnt[n1],Pnt[n2],Pnt[n3],true,&d);     break;\r
                                }\r
                        }\r
                }\r
@@ -599,7 +636,7 @@ void mglCanvas::pxl_dotsdr(long id, long n, const void *)
        {\r
                unsigned char r[4]={0,0,0,255};\r
                const mglPnt &p=Pnt[i];\r
-               if(p.sub)       continue;\r
+               if(p.sub<0)     continue;\r
                register float x = p.xx-Width/2., y = p.yy-Height/2., z = p.zz-Depth/2.,xx,yy,zz;\r
                xx = b[0]*x + b[1]*y + b[2]*z + dx;\r
                yy = b[3]*x + b[4]*y + b[5]*z + dy;\r
@@ -677,7 +714,7 @@ void mglCanvas::Clf(mglColor Back)
 {\r
        Fog(0); PDef = 0xffff;  pPos = 0;\r
        ClearFrame();\r
-       if((Flag&3)==2) Back = mglColor(0,0,0,0);\r
+       if((Flag&3)==2) Back.Set(0,0,0,0);\r
        if(Back!=NC)    FillBackground(Back);\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -788,8 +825,11 @@ unsigned char* mglCanvas::col2int(const mglPnt &p,unsigned char *r, int obj_id)
 {\r
 //     if(!r)  return r;       // NOTE r must be provided!\r
        if(p.a<=0)      {       memset(r,0,4);  return r;       }\r
-       register float b0=0,b1=0,b2=0, ar,ag,ab;\r
-       ar = ag = ab = AmbBr;\r
+       register float b0=0,b1=0,b2=0, ar,ag,ab,dif;\r
+       size_t nl = p.sub>=0?p.sub:1-p.sub;\r
+       bool glob = !get(MGL_LOCAL_LIGHT);\r
+       ar = ag = ab = glob?AmbBr:Sub[nl].AmbBr;\r
+       dif = glob?DifBr:Sub[nl].DifBr;\r
 \r
        if(mgl_isnum(p.u+p.v+p.w))\r
        {\r
@@ -797,7 +837,7 @@ unsigned char* mglCanvas::col2int(const mglPnt &p,unsigned char *r, int obj_id)
                register long i;\r
                for(i=0;i<10;i++)\r
                {\r
-                       const mglLight &ll=light[i];\r
+                       const mglLight &ll=glob?light[i]:Sub[nl].light[i];\r
                        if(!ll.n)       continue;\r
                        if(mgl_isnan(ll.q.x))           // source at infinity\r
                        {\r
@@ -818,7 +858,7 @@ unsigned char* mglCanvas::col2int(const mglPnt &p,unsigned char *r, int obj_id)
                                d1 = ll.q.y-p.y;\r
                                d2 = ll.q.z-p.z;\r
                                nn = 1+(d0*ll.p.x+d1*ll.p.y+d2*ll.p.z)/sqrt(d0*d0+d1*d1+d2*d2+1e-6);\r
-                               float bb = exp(-3*ll.a*nn);     nn = bb*DifBr*2;\r
+                               float bb = exp(-3*ll.a*nn);     nn = bb*dif*2;\r
                                ar += nn*ll.c.r;\r
                                ag += nn*ll.c.g;\r
                                ab += nn*ll.c.b;\r
@@ -921,10 +961,10 @@ void mglCanvas::quad_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3,
        unsigned char r[4];\r
        long y1,x1,y2,x2;\r
        float dd,dsx,dsy;\r
-       mglPnt d1=p2-p1, d2=p3-p1, d3=p4+p1-p2-p3, p;\r
+       mglPnt d1(p2-p1), d2(p3-p1), d3(p4+p1-p2-p3);\r
 \r
-       if((d1.x==0 && d1.y==0) || (d2.x==0 && d2.y==0))\r
-       {       trig_draw(p1,p2,p4,true,d);     trig_draw(p1,p3,p4,true,d);     return; }\r
+       if(d1.x==0 && d1.y==0)  {       trig_draw(p1,p3,p4,true,d);     return; }\r
+       if(d2.x==0 && d2.y==0)  {       trig_draw(p1,p2,p4,true,d);     return; }\r
 \r
        x1 = long(mgl_min(mgl_min(p1.x,p2.x), mgl_min(p3.x,p4.x)));     // bounding box\r
        y1 = long(mgl_min(mgl_min(p1.y,p2.y), mgl_min(p3.y,p4.y)));\r
@@ -938,9 +978,9 @@ void mglCanvas::quad_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3,
        dsx =-4*(d2.y*d3.x - d2.x*d3.y)*d1.y;\r
        dsy = 4*(d2.y*d3.x - d2.x*d3.y)*d1.x;\r
 \r
-       mglPoint n1 = mglPoint(p2.x-p1.x,p2.y-p1.y,p2.z-p1.z)^mglPoint(p3.x-p1.x,p3.y-p1.y,p3.z-p1.z);\r
-       mglPoint n2 = mglPoint(p2.x-p4.x,p2.y-p4.y,p2.z-p4.z)^mglPoint(p3.x-p4.x,p3.y-p4.y,p3.z-p4.z);\r
-       mglPoint nr = (n1+n2)*0.5;\r
+       mglPoint n1(mglPoint(p2.x-p1.x,p2.y-p1.y,p2.z-p1.z)^mglPoint(p3.x-p1.x,p3.y-p1.y,p3.z-p1.z));\r
+       mglPoint n2(mglPoint(p2.x-p4.x,p2.y-p4.y,p2.z-p4.z)^mglPoint(p3.x-p4.x,p3.y-p4.y,p3.z-p4.z));\r
+       mglPoint nr((n1.x+n2.x)*0.5,(n1.y+n2.y)*0.5,(n1.z+n2.z)*0.5);\r
 \r
        float x0 = p1.x, y0 = p1.y;\r
        int oi = d->ObjId, ang=d->angle;\r
@@ -967,7 +1007,7 @@ void mglCanvas::quad_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3,
                                        u = 2.f*(d2.y*xx - d2.x*yy)/qu; v = 2.f*(d1.x*yy - d1.y*xx)/qv;\r
                                        if(u*(1.f-u)<0.f || v*(1.f-v)<0.f)      continue;       // second root bad\r
                                }\r
-                               p = p1+d1*u+d2*v+d3*(u*v);\r
+                               mglPnt p(p1+d1*u+d2*v+d3*(u*v));\r
                                if(mgl_isnan(p.u) && mgl_isnum(p.v))\r
                                {       p.u = nr.x;     p.v = nr.y;     p.w = nr.z;     }\r
                                pnt_plot(i,j,p.z,col2int(p,r,oi),oi);\r
@@ -979,7 +1019,7 @@ void mglCanvas::quad_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3,
 void mglCanvas::quad_pix(long i, long j, const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, const mglPnt &p4, const mglDrawReg *d)\r
 {\r
        if(!visible(i,j,d->m, d->PenWidth,d->angle))    return;\r
-       mglPnt d1=p2-p1, d2=p3-p1, d3=p4+p1-p2-p3;\r
+       mglPnt d1(p2-p1), d2(p3-p1), d3(p4+p1-p2-p3);\r
        register float dd = d1.x*d2.y-d1.y*d2.x;\r
        register float dsx =-4*(d2.y*d3.x - d2.x*d3.y)*d1.y;\r
        register float dsy = 4*(d2.y*d3.x - d2.x*d3.y)*d1.x;\r
@@ -1006,11 +1046,11 @@ void mglCanvas::quad_pix(long i, long j, const mglPnt &p1, const mglPnt &p2, con
                }\r
                if(u*(1.f-u)<0.f || v*(1.f-v)<0.f)      return; // second root bad\r
        }\r
-       mglPnt p = p1+d1*u+d2*v+d3*(u*v);\r
+       mglPnt p(p1+d1*u+d2*v+d3*(u*v));\r
        if(mgl_isnan(p.u) && mgl_isnum(p.v))\r
        {\r
-               mglPoint n1 = mglPoint(p2.x-p1.x,p2.y-p1.y,p2.z-p1.z)^mglPoint(p3.x-p1.x,p3.y-p1.y,p3.z-p1.z);\r
-               mglPoint n2 = mglPoint(p2.x-p4.x,p2.y-p4.y,p2.z-p4.z)^mglPoint(p3.x-p4.x,p3.y-p4.y,p3.z-p4.z);\r
+               mglPoint n1(mglPoint(p2.x-p1.x,p2.y-p1.y,p2.z-p1.z)^mglPoint(p3.x-p1.x,p3.y-p1.y,p3.z-p1.z));\r
+               mglPoint n2(mglPoint(p2.x-p4.x,p2.y-p4.y,p2.z-p4.z)^mglPoint(p3.x-p4.x,p3.y-p4.y,p3.z-p4.z));\r
                p.u = (n1.x+n2.x)*0.5;\r
                p.v = (n1.y+n2.y)*0.5;\r
                p.w = (n1.z+n2.z)*0.5;\r
@@ -1029,7 +1069,7 @@ void mglCanvas::trig_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3,
        unsigned char r[4];\r
        long y1,x1,y2,x2;\r
        float dxu,dxv,dyu,dyv;\r
-       mglPnt d1=p2-p1, d2=p3-p1, p;\r
+       mglPnt d1(p2-p1), d2(p3-p1), p;\r
 \r
        dxu = d2.x*d1.y - d1.x*d2.y;\r
        if(fabs(dxu)<1e-5)      return;         // points lies on the same line\r
@@ -1044,7 +1084,7 @@ void mglCanvas::trig_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3,
        y1=y1>d->y1?y1:d->y1;   y2=y2<d->y2?y2:d->y2;\r
 //     if(x1>x2 || y1>y2)      return;\r
        // default normale\r
-       mglPoint nr = mglPoint(p2.x-p1.x,p2.y-p1.y,p2.z-p1.z)^mglPoint(p3.x-p1.x,p3.y-p1.y,p3.z-p1.z);\r
+       mglPoint nr(mglPoint(p2.x-p1.x,p2.y-p1.y,p2.z-p1.z)^mglPoint(p3.x-p1.x,p3.y-p1.y,p3.z-p1.z));\r
        float x0 = p1.x, y0 = p1.y;\r
        float dz = Width>2 ? 1 : 1e-5*Width;    // provide additional height to be well visible on the surfaces\r
        if(anorm)       dz=0;\r
@@ -1084,16 +1124,16 @@ void mglCanvas::trig_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3,
 void mglCanvas::trig_pix(long i, long j, const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, bool anorm, const mglDrawReg *d)\r
 {\r
        if(!visible(i,j,d->m, d->PenWidth,d->angle))    return;\r
-       mglPnt d1=p2-p1, d2=p3-p1;\r
+       mglPnt d1(p2-p1), d2(p3-p1);\r
        register float dd = d2.x*d1.y - d1.x*d2.y;\r
        if(fabs(dd)<1e-5)       return;         // points lies on the same line\r
        register float dyv =-d1.x/dd, dxv = d1.y/dd, dyu = d2.x/dd, dxu =-d2.y/dd;\r
        register float xx = (i-p1.x), yy = (j-p1.y);\r
        register float u = dxu*xx+dyu*yy, v = dxv*xx+dyv*yy;\r
        if(u<0 || v<0 || u+v>1) return;\r
-       mglPnt p = p1+d1*u+d2*v;\r
+       mglPnt p(p1+d1*u+d2*v);\r
        if(mgl_isnan(p.u) && mgl_isnum(p.v) && anorm)\r
-       {       mglPoint nr = mglPoint(p2.x-p1.x,p2.y-p1.y,p2.z-p1.z)^mglPoint(p3.x-p1.x,p3.y-p1.y,p3.z-p1.z);\r
+       {       mglPoint nr(mglPoint(p2.x-p1.x,p2.y-p1.y,p2.z-p1.z)^mglPoint(p3.x-p1.x,p3.y-p1.y,p3.z-p1.z));\r
                p.u = nr.x;     p.v = nr.y;     p.w = nr.z;     }\r
        unsigned char r[4];\r
        pnt_plot(i,j,p.z,col2int(p,r,d->ObjId),d->ObjId);\r
@@ -1112,7 +1152,7 @@ void mglCanvas::line_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg *
        int oi = dr->ObjId;\r
 \r
        if(oi==HighId)  {       pw *= 2;        dpw=2;  }\r
-       mglPnt d=p2-p1, p;\r
+       mglPnt d(p2-p1), p;\r
        bool hor = fabs(d.x)>fabs(d.y);\r
 \r
        x1 = long(p1.x<p2.x?p1.x:p2.x); y1 = long(p1.y<p2.y?p1.y:p2.y); // bounding box\r
@@ -1181,7 +1221,7 @@ void mglCanvas::pnt_fast(long x,long y,mreal z,const unsigned char ci[4], int ob
 void mglCanvas::fast_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg *dr)\r
 {\r
        if(p1.x==p2.x && p1.y==p2.y) return;\r
-       mglPnt d=p2-p1;\r
+       mglPnt d(p2-p1);\r
        int oi = dr->ObjId;\r
        unsigned char r[4];     col2int(p1,r,oi);\r
        long y1,x1,y2,x2;\r
@@ -1212,7 +1252,7 @@ void mglCanvas::fast_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg *
 void mglCanvas::line_pix(long i, long j, const mglPnt &p1, const mglPnt &p2, const mglDrawReg *dr)\r
 {\r
        register float xx = (i-p1.x), yy = (j-p1.y);\r
-       mglPnt d=p2-p1;\r
+       mglPnt d(p2-p1);\r
        register float dd = hypot(d.x, d.y);\r
        register float dxv = d.y/dd, dyv =-d.x/dd, dxu = d.x/dd, dyu = d.y/dd;\r
        register float u = dxu*xx+dyu*yy, v = dxv*xx+dyv*yy;    v = v*v;\r
@@ -1221,7 +1261,7 @@ void mglCanvas::line_pix(long i, long j, const mglPnt &p1, const mglPnt &p2, con
        register float pw=dr->PenWidth, dpw=3;\r
        if(dr->ObjId==HighId)   {       pw *= 2;        dpw=2;  }\r
        if(v>pw*pw || !(dr->PDef & ( 1L<<long(fmod(dr->pPos+u/pw/1.5, 16)) ) )) return;\r
-       mglPnt p = p1+d*(u/dd);\r
+       mglPnt p(p1+d*(u/dd));\r
        unsigned char r[4];\r
        col2int(p,r,dr->ObjId);\r
        r[3] = v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2));\r
@@ -1797,7 +1837,7 @@ void mglCanvas::mark_pix(long i, long j, const mglPnt &q, char type, mreal size,
 float mglCanvas::GetGlyphPhi(const mglPnt &q, float phi)\r
 {\r
        float x,y,z,ll;\r
-       if(q.sub)\r
+       if(q.sub<0)\r
        {       x = q.u;        y = q.v;        z = q.w;        }\r
        else\r
        {\r
@@ -1830,7 +1870,7 @@ void mglCanvas::glyph_draw(const mglPrim &P, mglDrawReg *d)
        mglPnt p=Pnt[P.n1];\r
        // NOTE check this later for mglInPlot\r
        mreal fact = get_persp(Bp.pf,p.z,Depth);\r
-       mreal pf=(p.sub<0?1:sqrt((Bp.b[0]*Bp.b[0]+Bp.b[1]*Bp.b[1]+Bp.b[3]*Bp.b[3]+Bp.b[4]*Bp.b[4])/2))*fact, f = P.p*pf;\r
+       mreal pf=p.sub<0?1:sqrt((Bp.b[0]*Bp.b[0]+Bp.b[1]*Bp.b[1]+Bp.b[3]*Bp.b[3]+Bp.b[4]*Bp.b[4])/2)*fact, f = P.p*pf;\r
 \r
        mglMatrix M;\r
        M.b[0] = M.b[4] = M.b[8] = P.s;\r
@@ -1859,11 +1899,11 @@ void mglCanvas::glyph_fill(const mglMatrix *M, const mglPnt &pp, mreal f, const
        for(long ik=0;ik<g.nt;ik++)\r
        {\r
                register long ii = 6*ik;        mglPoint p;\r
-               p = mglPoint(f*g.trig[ii]+pp.u,f*g.trig[ii+1]+pp.v,0);\r
+               p.Set(f*g.trig[ii]+pp.u,f*g.trig[ii+1]+pp.v,0);\r
                PostScale(M,p); q0.x = p.x;     q0.y = p.y;     q0.z = p.z;\r
-               ii+=2;  p = mglPoint(f*g.trig[ii]+pp.u,f*g.trig[ii+1]+pp.v,0);\r
+               ii+=2;  p.Set(f*g.trig[ii]+pp.u,f*g.trig[ii+1]+pp.v,0);\r
                PostScale(M,p); q1.x = p.x;     q1.y = p.y;     q1.z = p.z;\r
-               ii+=2;  p = mglPoint(f*g.trig[ii]+pp.u,f*g.trig[ii+1]+pp.v,0);\r
+               ii+=2;  p.Set(f*g.trig[ii]+pp.u,f*g.trig[ii+1]+pp.v,0);\r
                PostScale(M,p); q2.x = p.x;     q2.y = p.y;     q2.z = p.z;\r
                trig_draw(q0,q1,q2,false,d);\r
        }\r
@@ -1882,13 +1922,13 @@ void mglCanvas::glyph_wire(const mglMatrix *M, const mglPnt &pp, mreal f, const
                {       il = ik+1;      continue;       }\r
                else if(ik==g.nl-1 || (g.line[ii+2]==0x3fff && g.line[ii+3]==0x3fff))\r
                {       // enclose the circle. May be in future this block should be commented\r
-                       p1 = mglPoint(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0); ii=2*il;\r
-                       p2 = mglPoint(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0);\r
+                       p1.Set(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0);        ii=2*il;\r
+                       p2.Set(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0);\r
                }\r
                else\r
                {       // normal line\r
-                       p1 = mglPoint(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0); ii+=2;\r
-                       p2 = mglPoint(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0);\r
+                       p1.Set(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0);        ii+=2;\r
+                       p2.Set(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0);\r
                }\r
                PostScale(M,p1);        PostScale(M,p2);\r
                q0.x = p1.x;    q0.y = p1.y;    q0.z = p1.z;\r
@@ -1904,10 +1944,10 @@ void mglCanvas::glyph_line(const mglMatrix *M, const mglPnt &pp, mreal f, bool s
        mglPoint p1,p2,p3,p4;\r
 \r
        mreal dy = 0.004;\r
-       p1 = mglPoint(pp.u,pp.v-dy,0);  PostScale(M,p1);\r
-       p2 = mglPoint(pp.u,pp.v+dy,0);  PostScale(M,p2);\r
-       p3 = mglPoint(fabs(f)+pp.u,pp.v+dy,0);  PostScale(M,p3);\r
-       p4 = mglPoint(fabs(f)+pp.u,pp.v-dy,0);  PostScale(M,p4);\r
+       p1.Set(pp.u,pp.v-dy,0); PostScale(M,p1);\r
+       p2.Set(pp.u,pp.v+dy,0); PostScale(M,p2);\r
+       p3.Set(fabs(f)+pp.u,pp.v+dy,0); PostScale(M,p3);\r
+       p4.Set(fabs(f)+pp.u,pp.v-dy,0); PostScale(M,p4);\r
 \r
        q0.x = p1.x;    q0.y = p1.y;    q0.z = p1.z;\r
        q1.x = p2.x;    q1.y = p2.y;    q1.z = p2.z;\r
@@ -1958,11 +1998,11 @@ void mglCanvas::glyph_fpix(long i, long j, const mglMatrix *M, const mglPnt &pp,
        for(long ik=0;ik<g.nt;ik++)\r
        {\r
                register long ii = 6*ik;        mglPoint p;\r
-               p = mglPoint(f*g.trig[ii]+pp.u,f*g.trig[ii+1]+pp.v,0);\r
+               p.Set(f*g.trig[ii]+pp.u,f*g.trig[ii+1]+pp.v,0);\r
                PostScale(M,p); q0.x = p.x;     q0.y = p.y;     q0.z = p.z;\r
-               ii+=2;  p = mglPoint(f*g.trig[ii]+pp.u,f*g.trig[ii+1]+pp.v,0);\r
+               ii+=2;  p.Set(f*g.trig[ii]+pp.u,f*g.trig[ii+1]+pp.v,0);\r
                PostScale(M,p); q1.x = p.x;     q1.y = p.y;     q1.z = p.z;\r
-               ii+=2;  p = mglPoint(f*g.trig[ii]+pp.u,f*g.trig[ii+1]+pp.v,0);\r
+               ii+=2;  p.Set(f*g.trig[ii]+pp.u,f*g.trig[ii+1]+pp.v,0);\r
                PostScale(M,p); q2.x = p.x;     q2.y = p.y;     q2.z = p.z;\r
                trig_pix(i,j,q0,q1,q2,false,d);\r
        }\r
@@ -1981,13 +2021,13 @@ void mglCanvas::glyph_wpix(long i, long j, const mglMatrix *M, const mglPnt &pp,
                {       il = ik+1;      continue;       }\r
                else if(ik==g.nl-1 || (g.line[ii+2]==0x3fff && g.line[ii+3]==0x3fff))\r
                {       // enclose the circle. May be in future this block should be commented\r
-                       p1 = mglPoint(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0); ii=2*il;\r
-                       p2 = mglPoint(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0);\r
+                       p1.Set(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0);        ii=2*il;\r
+                       p2.Set(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0);\r
                }\r
                else\r
                {       // normal line\r
-                       p1 = mglPoint(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0); ii+=2;\r
-                       p2 = mglPoint(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0);\r
+                       p1.Set(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0);        ii+=2;\r
+                       p2.Set(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0);\r
                }\r
                PostScale(M,p1);        PostScale(M,p2);\r
                q0.x = p1.x;    q0.y = p1.y;    q0.z = p1.z;\r
@@ -2003,10 +2043,10 @@ void mglCanvas::glyph_lpix(long i, long j, const mglMatrix *M, const mglPnt &pp,
        mglPoint p1,p2,p3,p4;\r
 \r
        mreal dy = 0.004;\r
-       p1 = mglPoint(pp.u,pp.v-dy,0);  PostScale(M,p1);\r
-       p2 = mglPoint(pp.u,pp.v+dy,0);  PostScale(M,p2);\r
-       p3 = mglPoint(fabs(f)+pp.u,pp.v+dy,0);  PostScale(M,p3);\r
-       p4 = mglPoint(fabs(f)+pp.u,pp.v-dy,0);  PostScale(M,p4);\r
+       p1.Set(pp.u,pp.v-dy,0); PostScale(M,p1);\r
+       p2.Set(pp.u,pp.v+dy,0); PostScale(M,p2);\r
+       p3.Set(fabs(f)+pp.u,pp.v+dy,0); PostScale(M,p3);\r
+       p4.Set(fabs(f)+pp.u,pp.v-dy,0); PostScale(M,p4);\r
 \r
        q0.x = p1.x;    q0.y = p1.y;    q0.z = p1.z;\r
        q1.x = p2.x;    q1.y = p2.y;    q1.z = p2.z;\r
@@ -2035,7 +2075,7 @@ void mglCanvas::arrow_draw(long n1, long n2, char st, float ll)
        const mglPnt &p1=Pnt[n1], &p2=Pnt[n2];\r
        mglPnt q=p1;    //q.u=q.v=q.w=0;\r
 \r
-       mglPoint kl=mglPoint(p1.x-p2.x,p1.y-p2.y,p1.z-p2.z), kt, p0=mglPoint(p1.x,p1.y,p1.z), p;\r
+       mglPoint kl(p1.x-p2.x,p1.y-p2.y,p1.z-p2.z), kt, p0(p1.x,p1.y,p1.z), p;\r
        mreal d = hypot(kl.x,kl.y);\r
        if(d==0)        return;\r
        kl /= d;        kt = !kl;\r
@@ -2089,7 +2129,7 @@ void mglCanvas::arrow_plot_3d(long n1, long n2, char st, float ll)
        const mglPnt &p1=Pnt[n1], &p2=Pnt[n2];\r
        mglPnt q=p1;    //q.u=q.v=q.w=0;\r
 \r
-       mglPoint kl=mglPoint(p1.x-p2.x,p1.y-p2.y,p1.z-p2.z), kt, kz, p0=mglPoint(p1.x,p1.y,p1.z), p;\r
+       mglPoint kl(p1.x-p2.x,p1.y-p2.y,p1.z-p2.z), kt, kz, p0(p1.x,p1.y,p1.z), p;\r
        if(kl.norm()==0)        return;\r
        kl.Normalize(); kt = !kl;       kz = kl^kt;\r
        kl *= ll;       kt *= ll;       kz *= ll;\r
index 0df5b3ec21c235a24928cdc181b2cfd496f76c98..c0c6787dc6533b7127d433c1b2d98de73671dbd4 100644 (file)
@@ -326,7 +326,7 @@ void MGL_EXPORT mgl_plot_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c
                for(long i=0;i<n;i++)\r
                {\r
                        if(i>0) {       n2=n1;  p2 = p1;        t2=t1;  }\r
-                       p1 = mglPoint(x->v(i,mx), y->v(i,my), z->v(i,mz));\r
+                       p1.Set(x->v(i,mx), y->v(i,my), z->v(i,mz));\r
                        mreal c = sh ? gr->NextColor(pal,i):gr->CDef;\r
                        n1 = gr->AddPnt(p1,c);  t1 = n1>=0;\r
                        if(mk && t1)    gr->mark_plot(n1,mk);\r
@@ -418,7 +418,7 @@ void MGL_EXPORT mgl_tens_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char
                for(i=0;i<n;i++)\r
                {\r
                        if(i>0) {       n2=n1;  p2=p1;  t2=t1;  }\r
-                       p1 = mglPoint(x->v(i,mx), y->v(i,my), z->v(i,mz), c->v(i,mc));\r
+                       p1.Set(x->v(i,mx), y->v(i,my), z->v(i,mz), c->v(i,mc));\r
                        n1 = gr->AddPnt(p1,gr->GetC(ss,p1.c));  t1 = n1>=0;\r
                        if(mk && t1)    gr->mark_plot(n1,mk);\r
                        if(t1 && t2)\r
@@ -509,15 +509,15 @@ void MGL_EXPORT mgl_area_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c
                if(gr->GetNumPal(pal)==2*m && !sh)      c2 = gr->NextColor(pal);\r
                long mx = j<x->GetNy() ? j:0, my = j<y->GetNy() ? j:0, mz = j<z->GetNy() ? j:0;\r
 \r
-               nn = mglPoint(-y->dvx(0,my),x->dvx(0,mx));\r
-               mglPoint p = mglPoint(x->v(0,mx),y->v(0,my),z->v(0,mz));\r
+               nn.Set(-y->dvx(0,my),x->dvx(0,mx));\r
+               mglPoint p(x->v(0,mx),y->v(0,my),z->v(0,mz));\r
                long n1 = gr->AddPnt(p,c1,nn,-1,11);    p.z = z0;\r
                long n2 = gr->AddPnt(p,c2,nn,-1,11);\r
                for(long i=1;i<n;i++)\r
                {\r
                        long n3=n1, n4=n2;\r
-                       nn = mglPoint(-y->dvx(i,my),x->dvx(i,mx));\r
-                       p = mglPoint(x->v(i,mx),y->v(i,my),z->v(i,mz));\r
+                       nn.Set(-y->dvx(i,my),x->dvx(i,mx));\r
+                       p.Set(x->v(i,mx),y->v(i,my),z->v(i,mz));\r
                        if(sh)  c2=c1=gr->NextColor(pal,i);\r
                        n1 = gr->AddPnt(p,c1,nn,-1,11); p.z = z0;       n2 = gr->AddPnt(p,c2,nn,-1,11);\r
                        if(wire)\r
@@ -541,7 +541,7 @@ void MGL_EXPORT mgl_area_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char
        mreal zm = gr->AdjustZMin();\r
        mreal y0=gr->GetOrgY('x');\r
        mreal c1,c2;\r
-       mglPoint nn=mglPoint(0,0,1);\r
+       mglPoint nn(0,0,1);\r
        bool sh = mglchr(pen,'!');\r
        bool wire = mglchr(pen,'#');\r
 \r
@@ -555,13 +555,13 @@ void MGL_EXPORT mgl_area_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char
                long mx = j<x->GetNy() ? j:0, my = j<y->GetNy() ? j:0;\r
                mreal z0 = zm + (m-1-j)*(gr->Max.z-zm)/m;\r
 \r
-               mglPoint p = mglPoint(x->v(0,mx),y->v(0,my),z0);\r
+               mglPoint p(x->v(0,mx),y->v(0,my),z0);\r
                long n1 = gr->AddPnt(p,c1,nn,-1,11);    p.y = y0;\r
                long n2 = gr->AddPnt(p,c2,nn,-1,11);\r
                for(long i=1;i<n;i++)\r
                {\r
                        long n3=n1, n4=n2;\r
-                       p = mglPoint(x->v(i,mx),y->v(i,my),z0);\r
+                       p.Set(x->v(i,mx),y->v(i,my),z0);\r
                        if(sh)  c2=c1=gr->NextColor(pal,i);\r
                        n1 = gr->AddPnt(p,c1,nn,-1,11); p.y = y0;       n2 = gr->AddPnt(p,c2,nn,-1,11);\r
                        if(wire)\r
@@ -616,7 +616,7 @@ void MGL_EXPORT mgl_region_3d(HMGL gr, HCDT x1, HCDT y1, HCDT z1, HCDT x2, HCDT
        gr->SaveState(opt);\r
        static int cgid=1;      gr->StartGroup("Region",cgid++);\r
        mreal c1,c2;\r
-       mglPoint nn=mglPoint(0,0,1);\r
+       mglPoint nn(0,0,1);\r
        mreal zm = gr->AdjustZMin();\r
 //     bool inside = (mglchr(pen,'i'));        // NOTE: check if 'i' is free (used here for inside flag)\r
        bool sh = mglchr(pen,'!');\r
@@ -654,7 +654,7 @@ void MGL_EXPORT mgl_region_xy(HMGL gr, HCDT x, HCDT y1, HCDT y2, const char *pen
        gr->SaveState(opt);\r
        static int cgid=1;      gr->StartGroup("Region",cgid++);\r
        mreal c1,c2;\r
-       mglPoint nn=mglPoint(0,0,1);\r
+       mglPoint nn(0,0,1);\r
        mreal zm = gr->AdjustZMin();\r
        bool inside = (mglchr(pen,'i'));        // NOTE: check if 'i' is free (used here for inside flag)\r
        bool sh = mglchr(pen,'!');\r
@@ -734,7 +734,7 @@ void MGL_EXPORT mgl_step_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c
                for(long i=1;i<n;i++)\r
                {\r
                        long n2 = n1;   // horizontal\r
-                       p = mglPoint(x->v(i,mx), y->v(i,my), z->v(i-1,mz));\r
+                       p.Set(x->v(i,mx), y->v(i,my), z->v(i-1,mz));\r
                        mreal c = sh ? gr->NextColor(pal,i):gr->CDef;\r
                        n1 = gr->AddPnt(p,c);   gr->line_plot(n1,n2);\r
                        if(i==1)        gr->arrow_plot(n2,n1,gr->Arrow1);\r
@@ -772,7 +772,7 @@ void MGL_EXPORT mgl_step_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char
                for(long i=1;i<n;i++)\r
                {\r
                        long n2 = n1;   // horizontal\r
-                       p = mglPoint(x->v(i,mx), y->v(i-1,my), zVal);\r
+                       p.Set(x->v(i,mx), y->v(i-1,my), zVal);\r
                        mreal c = sh ? gr->NextColor(pal,i):gr->CDef;\r
                        n1 = gr->AddPnt(p,c);   gr->line_plot(n1,n2);\r
                        if(i==1)        gr->arrow_plot(n2,n1,gr->Arrow1);\r
@@ -946,7 +946,7 @@ void MGL_EXPORT mgl_bars_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c
                        if(fall)        {       z0 = zp;        zz += z0;       zp = zz;        }\r
 \r
                        mreal c = vv<0 ? c1 : c2;\r
-                       mglPoint nn = mglPoint(-y->dvx(i,my),x->dvx(i,mx));\r
+                       mglPoint nn(-y->dvx(i,my),x->dvx(i,mx));\r
                        long n1 = gr->AddPnt(mglPoint(x1,y1,zz),c,nn);\r
                        long n2 = gr->AddPnt(mglPoint(x1,y1,z0),c,nn);\r
                        long n3 = gr->AddPnt(mglPoint(x2,y2,z0),c,nn);\r
@@ -1662,9 +1662,9 @@ void MGL_EXPORT mgl_tube_xyzr(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const cha
                long mz = j<z->GetNy() ? j:0, mr = j<r->GetNy() ? j:0;\r
                for(long i=0;i<n;i++)\r
                {\r
-                       l = mglPoint(x->dvx(i,mx),y->dvx(i,my),z->dvx(i,mz));\r
+                       l.Set(x->dvx(i,mx),y->dvx(i,my),z->dvx(i,mz));\r
                        t = !l;         t.Normalize();  u = t^l;        u.Normalize();\r
-                       q = mglPoint(x->v(i,mx),y->v(i,my),z->v(i,mz));\r
+                       q.Set(x->v(i,mx),y->v(i,my),z->v(i,mz));\r
                        mreal rr=r->v(i,mr), dr=r->dvx(i,mr);\r
                        mreal c = sh ? gr->NextColor(pal,i):gr->CDef;\r
                        for(long k=0;k<num;k++)\r
@@ -1774,7 +1774,7 @@ void MGL_EXPORT mgl_tape_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c
        if(rr==0 || mgl_isnan(rr))      rr = mgl_norm(gr->Max-gr->Min)*gr->BarWidth/25;\r
        m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy();  m = z->GetNy() > m ? z->GetNy() : m;\r
        gr->SetPenPal(pen,&pal);        gr->Reserve(4*n*m);\r
-       mglPoint p1,p2,q1,q2,l,nn,qn=mglPoint(NAN,NAN);\r
+       mglPoint p1,p2,q1,q2,l,nn,qn(NAN,NAN);\r
        long n1=-1,n2=-1,n3=-1,n4=-1, m1=-1,m2=-1,m3=-1,m4=-1;\r
        bool sh = mglchr(pen,'!'), xo = mglchr(pen,'x'), zo = mglchr(pen,'z'), wire = mglchr(pen,'#');\r
        if(!xo && !zo)  xo = zo = true;\r
@@ -1787,10 +1787,10 @@ void MGL_EXPORT mgl_tape_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c
                if(gr->GetNumPal(pal)==2*m && !sh)      c2 = gr->NextColor(pal);\r
                long mx = j<x->GetNy() ? j:0, my = j<y->GetNy() ? j:0, mz = j<z->GetNy() ? j:0;\r
                // initial values for normales\r
-               p2 = mglPoint(x->v(0,mx), y->v(0,my), z->v(0,mz));\r
-               l = mglPoint(x->v(1,mx), y->v(1,my), z->v(1,mz)) - p2;  l /= mgl_norm(l);\r
-               q1 = mglPoint(-l.y,l.x,0);      ll = mgl_norm(q1);\r
-               if(ll)  q1 /= ll;       else    q1 = mglPoint(0,1,0);\r
+               p2.Set(x->v(0,mx), y->v(0,my), z->v(0,mz));\r
+               l.Set(x->v(1,mx)-p2.x, y->v(1,my)-p2.y, z->v(1,mz)-p2.z);       l /= mgl_norm(l);\r
+               q1.Set(-l.y,l.x,0);     ll = mgl_norm(q1);\r
+               if(ll)  q1 /= ll;       else    q1.Set(0,1,0);\r
                q2 = (q1^l);\r
                if(p2>gr->Min && p2<gr->Max)\r
                {\r
@@ -1801,7 +1801,7 @@ void MGL_EXPORT mgl_tape_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c
                register long i;\r
                for(i=1;i<n;i++)\r
                {\r
-                       p1 = p2;        p2 = mglPoint(x->v(i,mx), y->v(i,my), z->v(i,mz));\r
+                       p1 = p2;        p2.Set(x->v(i,mx), y->v(i,my), z->v(i,mz));\r
                        l = p2-p1;              l /= mgl_norm(l);\r
                        q1 -= l*(l*q1); q1/= mgl_norm(q1);      q2 = (q1^l);\r
                        m1 = n1;        m2 = n2;        m3 = n3;        m4 = n4;\r
index ac4679fc7b0a57cd884b4e1684018da1cf98fcca..8d5c1f23453494546d67c6d202824e8429d99060 100644 (file)
@@ -57,7 +57,7 @@ void MGL_EXPORT mgl_line(HMGL gr, double x1, double y1, double z1, double x2, do
 {\r
        static int cgid=1;      gr->StartGroup("Line",cgid++);\r
        if(mgl_isnan(z1) || mgl_isnan(z2))      z1=z2=2*gr->Max.z-gr->Min.z;\r
-       mglPoint p1(x1,y1,z1), p2(x2,y2,z2), p=p1,nn=mglPoint(NAN);\r
+       mglPoint p1(x1,y1,z1), p2(x2,y2,z2), p=p1,nn(NAN);\r
        gr->SetPenPal(pen);\r
        n = (n<2) ? 2 : n;\r
 \r
@@ -83,7 +83,7 @@ void MGL_EXPORT mgl_curve(HMGL gr, double x1, double y1, double z1, double dx1,
 {\r
        static int cgid=1;      gr->StartGroup("Curve",cgid++);\r
        if(mgl_isnan(z1) || mgl_isnan(z2))      z1=z2=2*gr->Max.z-gr->Min.z;\r
-       mglPoint p1(x1,y1,z1), p2(x2,y2,z2), d1(dx1,dy1,dz1), d2(dx2,dy2,dz2), a,b,p=p1,nn=mglPoint(NAN);\r
+       mglPoint p1(x1,y1,z1), p2(x2,y2,z2), d1(dx1,dy1,dz1), d2(dx2,dy2,dz2), a,b,p=p1,nn(NAN);\r
        a = 3*(p2-p1)-d2-2*d1;  b = d1+d2-2*(p2-p1);\r
        n = (n<2) ? 2 : n;\r
        gr->SetPenPal(pen);\r
@@ -112,7 +112,7 @@ void MGL_EXPORT mgl_error_box(HMGL gr, double x, double y, double z, double ex,
 {\r
        static int cgid=1;      gr->StartGroup("ErBox",cgid++);\r
        char mk=gr->SetPenPal(pen);\r
-       mglPoint p(x,y,z), q,nn=mglPoint(NAN);\r
+       mglPoint p(x,y,z), q,nn(NAN);\r
        gr->Reserve(7);\r
        long k1,k2;\r
        q = p;  q.x += ex;      k1 = gr->AddPnt(q,gr->CDef,nn,0,3);\r
@@ -411,7 +411,7 @@ void MGL_EXPORT mgl_arc_ext(HMGL gr, double x0, double y0, double z0, double xr,
        mreal c=gr->NextColor(pal);\r
        gr->Reserve(n+2);\r
        if(mgl_isnan(z0) || mgl_isnan(z1))      z0=z1=2*gr->Max.z-gr->Min.z;\r
-       mglPoint p0(x0,y0,z0), p1(x1,y1,z1), d=p1-p0, u=mglPoint(xr,yr,zr)^d, p,qq;\r
+       mglPoint p0(x0,y0,z0), p1(x1,y1,z1), d=p1-p0, u(mglPoint(xr,yr,zr)^d), p,qq;\r
        if(u.norm()==0) return; // wrong vector orientation\r
        u = (d.norm()/u.norm())*u;\r
        gr->AddActive(gr->AddPnt(p0,gr->CDef,qq,-1,3),0);\r
@@ -461,8 +461,8 @@ void MGL_EXPORT mgl_ellipse(HMGL gr, double x1, double y1, double z1, double x2,
        if(mgl_isnan(z1) || mgl_isnan(z2))      z1=z2=2*gr->Max.z-gr->Min.z;\r
        mglPoint p1(x1,y1,z1), p2(x2,y2,z2), v=p2-p1;\r
        d = v.norm();\r
-       if(d==0)        v = mglPoint(1);        else    v /= d;\r
-       mglPoint u=mglPoint(0,0,1)^v, q=u^v, p, s=(p1+p2)/2.;\r
+       if(d==0)        v.Set(1);       else    v /= d;\r
+       mglPoint u(mglPoint(0,0,1)^v), q(u^v), p, s=(p1+p2)/2.;\r
        u *= r;         v *= sqrt(d*d/4+r*r);\r
        // central point first\r
        n0 = gr->AddPnt(p1,c,q,-1,11);  gr->AddActive(n0);\r
@@ -533,7 +533,7 @@ void MGL_EXPORT mgl_sphere_(uintptr_t* gr, mreal *x, mreal *y, mreal *z, mreal *
 void MGL_EXPORT mgl_drop(HMGL gr, mglPoint p, mglPoint q, double r, double c, double sh, double a)\r
 {\r
        mglPoint p1,p2,pp,qq;\r
-       if(q.norm()==0) {       q = mglPoint(1,0,0);    sh=0;   }\r
+       if(q.norm()==0) {       q.Set(1,0,0);   sh=0;   }\r
        q.Normalize();  p1 = !q;        p2 = q^p1;      r /= 2;\r
 \r
        static int cgid=1;      gr->StartGroup("Drop",cgid++);\r
@@ -614,7 +614,7 @@ void MGL_EXPORT mgl_dew_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char
                        register mreal dy = j<m-1 ? (GetY(y,i,j+1,k).x-yy) : (yy-GetY(y,i,j-1,k).x);\r
                        dx *= tx;       dy *= ty;\r
 \r
-                       mglPoint q = mglPoint(ax->v(i,j,k),ay->v(i,j,k));       dd = q.norm();\r
+                       mglPoint q(ax->v(i,j,k),ay->v(i,j,k));  dd = q.norm();\r
                        if(inv) q = -q;\r
                        mgl_drop(gr,mglPoint(xx, yy, zVal),q,(dx<dy?dx:dy)/2,gr->GetC(ss,dd*xm,false),dd*xm,1);\r
                }\r
@@ -714,7 +714,7 @@ void MGL_EXPORT mgl_textmarkw_xyzr(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, cons
                long mz = j<z->GetNy() ? j:0, mr = j<r->GetNy() ? j:0;\r
                for(long i=0;i<n;i++)\r
                {\r
-                       p = mglPoint(x->v(i,mx), y->v(i,my), z->v(i,mz));\r
+                       p.Set(x->v(i,mx), y->v(i,my), z->v(i,mz));\r
                        register long k = gr->AddPnt(p,-1,q);\r
                        gr->text_plot(k, text, fnt, -0.5*fabs(r->v(i,mr)));\r
                }\r
index 3734b42ab3e645f95c011d80468b2f01f555fd24..288569d5549163ffbd30104dc16a05fd22481488 100644 (file)
@@ -66,21 +66,20 @@ void MGL_NO_EXPORT mgl_surf_plot(mglBase *gr, long *pos, long n, long m)
 //     Plot by formulas series\r
 //\r
 //-----------------------------------------------------------------------------\r
-mglData MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector<mglDataA*> &head);\r
+HMDT MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector<mglDataA*> &head);\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_fsurf(HMGL gr, const char *eqZ, const char *sch, const char *opt)\r
 {      // NOTE Strong function variation analysis can be added here\r
        if(eqZ==0 || eqZ[0]==0) return;         // nothing to plot\r
        mreal r = gr->SaveState(opt);\r
        long n = (mgl_isnan(r) || r<=0) ? 100:long(r+0.5);\r
-       mglData z(n,n),res;\r
+       mglData z(n,n);\r
        mglDataV x(n,n,1, gr->Min.x,gr->Max.x,'x');     x.s=L"x";\r
        mglDataV y(n,n,1, gr->Min.y,gr->Max.y,'y');     y.s=L"y";\r
        mglDataV t(n,n);        t.s=L"#$mgl";\r
        std::vector<mglDataA*> list;\r
        list.push_back(&x);     list.push_back(&y);     list.push_back(&t);\r
-       res.Set(mglFormulaCalc(eqZ,list));\r
-       if(res.nx==1 && res.ny==1)      z = res.a[0];   else    z = res;\r
+       z.Move(mglFormulaCalc(eqZ,list));\r
        mgl_surf(gr, &z, sch,0);\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -89,18 +88,15 @@ void MGL_EXPORT mgl_fsurf_xyz(HMGL gr, const char *eqX, const char *eqY, const c
        if(eqZ==0 || eqZ[0]==0) return;         // nothing to plot\r
        mreal r = gr->SaveState(opt);\r
        long n = (mgl_isnan(r) || r<=0) ? 100:long(r+0.5);\r
-       mglData z(n,n), x(n,n), y(n,n), res;\r
+       mglData z(n,n), x(n,n), y(n,n);\r
        mglDataV u(n,n,1, 0,1,'x');     u.s=L"u";\r
        mglDataV v(n,n,1, 0,1,'y');     v.s=L"v";\r
        mglDataV t(n,n);        t.s=L"#$mgl";\r
        std::vector<mglDataA*> list;\r
        list.push_back(&u);     list.push_back(&v);     list.push_back(&t);\r
-       res.Set(mglFormulaCalc(eqX,list));\r
-       if(res.nx==1 && res.ny==1)      x = res.a[0];   else    x = res;\r
-       res.Set(mglFormulaCalc(eqY,list));\r
-       if(res.nx==1 && res.ny==1)      y = res.a[0];   else    y = res;\r
-       res.Set(mglFormulaCalc(eqZ,list));\r
-       if(res.nx==1 && res.ny==1)      z = res.a[0];   else    z = res;\r
+       x.Move(mglFormulaCalc(eqX,list));\r
+       y.Move(mglFormulaCalc(eqY,list));\r
+       z.Move(mglFormulaCalc(eqZ,list));\r
        mgl_surf_xy(gr,&x,&y,&z,sch,0);\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -267,29 +263,31 @@ void MGL_EXPORT mgl_grid_(uintptr_t *gr, uintptr_t *a,const char *sch, const cha
 //     Surf series\r
 //\r
 //-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_surf_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt)\r
+void MGL_NO_EXPORT mgl_surf_gen(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, HCDT a, const char *sch)\r
 {\r
        long n=z->GetNx(),m=z->GetNy();\r
-       if(mgl_check_dim2(gr,x,y,z,0,"Surf"))   return;\r
-\r
-       gr->SaveState(opt);\r
-       static int cgid=1;      gr->StartGroup("Surf",cgid++);\r
        long ss = gr->AddTexture(sch);\r
        long *pos = new long[n*m];\r
        bool wire = (mglchr(sch,'#'));\r
        gr->Reserve((n+1)*(m+1)*z->GetNz()*(wire?2:1));\r
 \r
-       mglPoint p,q,s,xx,yy;\r
+       mglPoint q,s,xx,yy;\r
        for(long k=0;k<z->GetNz();k++)\r
        {\r
                if(gr->NeedStop())      break;\r
-               for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
+               if(a)   for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
                {\r
                        xx = GetX(x,i,j,k);             yy = GetY(y,i,j,k);\r
-                       p = mglPoint(xx.x, yy.x, z->v(i,j,k));\r
-                       q = mglPoint(xx.y, yy.y, z->dvx(i,j,k));\r
-                       s = mglPoint(xx.z, yy.z, z->dvy(i,j,k));\r
-                       pos[i+n*j] = gr->AddPnt(p,gr->GetC(ss,p.z),q^s);\r
+                       q.Set(xx.y, yy.y, z->dvx(i,j,k));\r
+                       s.Set(xx.z, yy.z, z->dvy(i,j,k));\r
+                       pos[i+n*j] = gr->AddPnt(mglPoint(xx.x, yy.x, z->v(i,j,k)), gr->GetC(ss,c->v(i,j,k)), q^s, gr->GetA(a->v(i,j,k)));\r
+               }\r
+               else    for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
+               {\r
+                       xx = GetX(x,i,j,k);             yy = GetY(y,i,j,k);\r
+                       q.Set(xx.y, yy.y, z->dvx(i,j,k));\r
+                       s.Set(xx.z, yy.z, z->dvy(i,j,k));\r
+                       pos[i+n*j] = gr->AddPnt(mglPoint(xx.x, yy.x, z->v(i,j,k)), gr->GetC(ss,c->v(i,j,k)), q^s);\r
                }\r
                if(sch && mglchr(sch,'.'))\r
                        for(long i=0;i<n*m;i++) gr->mark_plot(pos[i],'.');\r
@@ -304,6 +302,14 @@ void MGL_EXPORT mgl_surf_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co
        delete []pos;   gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_surf_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt)\r
+{\r
+       if(mgl_check_dim2(gr,x,y,z,0,"Surf"))   return;\r
+       gr->SaveState(opt);\r
+       static int cgid=1;      gr->StartGroup("Surf",cgid++);\r
+       mgl_surf_gen(gr, x, y, z, z, 0, sch);\r
+}\r
+//-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_surf(HMGL gr, HCDT z, const char *sch, const char *opt)\r
 {\r
        gr->SaveState(opt);\r
@@ -324,6 +330,100 @@ void MGL_EXPORT mgl_surf_(uintptr_t *gr, uintptr_t *a, const char *sch, const ch
        mgl_surf(_GR_, _DA_(a), s, o);  delete []o;     delete []s;     }\r
 //-----------------------------------------------------------------------------\r
 //\r
+//     SurfCA series\r
+//\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_surfca_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, HCDT a, const char *sch, const char *opt)\r
+{\r
+       if(mgl_check_dim2(gr,x,y,z,c,"SurfCA")) return;\r
+       if(mgl_check_dim2(gr,x,y,z,a,"SurfCA")) return;\r
+       gr->SaveState(opt);\r
+       static int cgid=1;      gr->StartGroup("SurfCA",cgid++);\r
+       mgl_surf_gen(gr, x, y, z, c, a, sch);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_surfca(HMGL gr, HCDT z, HCDT c, HCDT a, const char *sch, const char *opt)\r
+{\r
+       gr->SaveState(opt);\r
+       mglDataV x(z->GetNx()), y(z->GetNy());\r
+       x.Fill(gr->Min.x,gr->Max.x);\r
+       y.Fill(gr->Min.y,gr->Max.y);\r
+       mgl_surfca_xy(gr,&x,&y,z,c,a,sch,0);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_surfca_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, uintptr_t *a, const char *sch, const char *opt,int l,int lo)\r
+{      char *s=new char[l+1];  memcpy(s,sch,l);        s[l]=0;\r
+       char *o=new char[lo+1];         memcpy(o,opt,lo);       o[lo]=0;\r
+       mgl_surfca_xy(_GR_, _DA_(x), _DA_(y), _DA_(z), _DA_(c), _DA_(a), s, o); delete []o;     delete []s;     }\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_surfca_(uintptr_t *gr, uintptr_t *z, uintptr_t *c, uintptr_t *a, const char *sch, const char *opt,int l,int lo)\r
+{      char *s=new char[l+1];  memcpy(s,sch,l);        s[l]=0;\r
+       char *o=new char[lo+1];         memcpy(o,opt,lo);       o[lo]=0;\r
+       mgl_surfca(_GR_, _DA_(z), _DA_(c), _DA_(a), s, o);      delete []o;     delete []s;     }\r
+//-----------------------------------------------------------------------------\r
+//\r
+//     SurfC series\r
+//\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_surfc_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt)\r
+{\r
+       if(mgl_check_dim2(gr,x,y,z,c,"SurfC"))  return;\r
+       gr->SaveState(opt);\r
+       static int cgid=1;      gr->StartGroup("SurfC",cgid++);\r
+       mgl_surf_gen(gr, x, y, z, c, 0, sch);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_surfc(HMGL gr, HCDT z, HCDT c, const char *sch, const char *opt)\r
+{\r
+       gr->SaveState(opt);\r
+       mglDataV x(z->GetNx()), y(z->GetNy());\r
+       x.Fill(gr->Min.x,gr->Max.x);\r
+       y.Fill(gr->Min.y,gr->Max.y);\r
+       mgl_surfc_xy(gr,&x,&y,z,c,sch,0);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_surfc_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, const char *opt,int l,int lo)\r
+{      char *s=new char[l+1];  memcpy(s,sch,l);        s[l]=0;\r
+       char *o=new char[lo+1];         memcpy(o,opt,lo);       o[lo]=0;\r
+       mgl_surfc_xy(_GR_, _DA_(x), _DA_(y), _DA_(z), _DA_(a), s, o);   delete []o;     delete []s;     }\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_surfc_(uintptr_t *gr, uintptr_t *z, uintptr_t *a, const char *sch, const char *opt,int l,int lo)\r
+{      char *s=new char[l+1];  memcpy(s,sch,l);        s[l]=0;\r
+       char *o=new char[lo+1];         memcpy(o,opt,lo);       o[lo]=0;\r
+       mgl_surfc(_GR_, _DA_(z), _DA_(a), s, o);        delete []o;     delete []s;     }\r
+//-----------------------------------------------------------------------------\r
+//\r
+//     SurfA series\r
+//\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_surfa_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt)\r
+{\r
+       if(mgl_check_dim2(gr,x,y,z,c,"SurfA"))  return;\r
+       gr->SaveState(opt);\r
+       static int cgid=1;      gr->StartGroup("SurfA",cgid++);\r
+       mgl_surf_gen(gr, x, y, z, z, c, sch);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_surfa(HMGL gr, HCDT z, HCDT c, const char *sch, const char *opt)\r
+{\r
+       gr->SaveState(opt);\r
+       mglDataV x(z->GetNx()), y(z->GetNy());\r
+       x.Fill(gr->Min.x,gr->Max.x);\r
+       y.Fill(gr->Min.y,gr->Max.y);\r
+       mgl_surfa_xy(gr,&x,&y,z,c,sch,0);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_surfa_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, const char *opt,int l,int lo)\r
+{      char *s=new char[l+1];  memcpy(s,sch,l);        s[l]=0;\r
+       char *o=new char[lo+1];         memcpy(o,opt,lo);       o[lo]=0;\r
+       mgl_surfa_xy(_GR_, _DA_(x), _DA_(y), _DA_(z), _DA_(a), s, o);   delete []o;     delete []s;     }\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_surfa_(uintptr_t *gr, uintptr_t *z, uintptr_t *a, const char *sch, const char *opt,int l,int lo)\r
+{      char *s=new char[l+1];  memcpy(s,sch,l);        s[l]=0;\r
+       char *o=new char[lo+1];         memcpy(o,opt,lo);       o[lo]=0;\r
+       mgl_surfa(_GR_, _DA_(z), _DA_(a), s, o);        delete []o;     delete []s;     }\r
+//-----------------------------------------------------------------------------\r
+//\r
 //     Belt series\r
 //\r
 //-----------------------------------------------------------------------------\r
@@ -349,11 +449,11 @@ void MGL_EXPORT mgl_belt_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co
                        for(long j=0;j<m;j++)\r
                        {\r
                                xx = GetX(x,i,j,k);             yy = GetY(y,i,j,k);\r
-                               p1 = mglPoint(xx.x, yy.x, z->v(i,j,k));\r
-                               s = mglPoint(xx.z, yy.z, z->dvy(i,j,k));\r
-                               q = mglPoint(xx.y, yy.y, 0);    s = q^s;\r
+                               p1.Set(xx.x, yy.x, z->v(i,j,k));\r
+                               s.Set(xx.z, yy.z, z->dvy(i,j,k));\r
+                               q.Set(xx.y, yy.y, 0);   s = q^s;\r
                                register mreal c = gr->GetC(ss,p1.z);\r
-                               p2 = mglPoint(GetX(x,i+dx,j,k).x,GetY(y,i+dx,j,k).x,p1.z);\r
+                               p2.Set(GetX(x,i+dx,j,k).x,GetY(y,i+dx,j,k).x,p1.z);\r
                                pos[2*j] = gr->AddPnt(p1,c,s);\r
                                pos[2*j+1]=gr->AddPnt(p2,c,s);\r
                        }\r
@@ -364,11 +464,11 @@ void MGL_EXPORT mgl_belt_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co
                        for(long i=0;i<n;i++)   // ñîçäàåì ìàññèâ òî÷åê\r
                        {\r
                                xx = GetX(x,i,j,k);             yy = GetY(y,i,j,k);\r
-                               p1 = mglPoint(xx.x, yy.x, z->v(i,j,k));\r
-                               q = mglPoint(xx.y, yy.y, z->dvx(i,j,k));\r
-                               s = mglPoint(xx.z, yy.z, 0);    s = q^s;\r
+                               p1.Set(xx.x, yy.x, z->v(i,j,k));\r
+                               q.Set(xx.y, yy.y, z->dvx(i,j,k));\r
+                               s.Set(xx.z, yy.z, 0);   s = q^s;\r
                                register mreal c = gr->GetC(ss,p1.z);\r
-                               p2 = mglPoint(GetX(x,i,j+dy,k).x,GetY(y,i,j+dy,k).x,p1.z);\r
+                               p2.Set(GetX(x,i,j+dy,k).x,GetY(y,i,j+dy,k).x,p1.z);\r
                                pos[2*i] = gr->AddPnt(p1,c,s);\r
                                pos[2*i+1]=gr->AddPnt(p2,c,s);\r
                        }\r
@@ -401,54 +501,26 @@ void MGL_EXPORT mgl_belt_(uintptr_t *gr, uintptr_t *a, const char *sch, const ch
 //     Dens series\r
 //\r
 //-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_dens_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt)\r
+void MGL_EXPORT mgl_dens_xy(HMGL gr, HCDT x, HCDT y, HCDT c, const char *sch, const char *opt)\r
 {\r
-       long n=z->GetNx(),m=z->GetNy();\r
-       if(mgl_check_dim2(gr,x,y,z,0,"Dens"))   return;\r
-\r
+       if(mgl_check_dim2(gr,x,y,c,0,"Dens"))   return;\r
        gr->SaveState(opt);\r
        static int cgid=1;      gr->StartGroup("Dens",cgid++);\r
        mreal   zVal = gr->Min.z;\r
 \r
-       long ss = gr->AddTexture(sch);\r
-       long *pos = new long[n*m];\r
-       bool wire = (mglchr(sch,'#'));\r
-       gr->Reserve((n+1)*(m+1)*z->GetNz()*(wire?2:1));\r
-\r
-       mglPoint p,s=mglPoint(0,0,1);\r
-       mreal zz, c;\r
-       for(long k=0;k<z->GetNz();k++)\r
-       {\r
-               if(gr->NeedStop())      break;\r
-               if(z->GetNz()>1)\r
-                       zVal = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(k)/(z->GetNz()-1);\r
-               for(long j=0;j<m;j++)   for(long i=0;i<n;i++)   // ñîçäàåì ìàññèâ òî÷åê\r
-               {\r
-                       p = mglPoint(GetX(x,i,j,k).x, GetY(y,i,j,k).x, zVal);\r
-                       zz = z->v(i,j,k);       c = gr->GetC(ss,zz);\r
-                       if(mgl_isnan(zz))       p.x = NAN;\r
-                       pos[i+n*j] = gr->AddPnt(p,c,s);\r
-               }\r
-               if(sch && mglchr(sch,'.'))\r
-                       for(long i=0;i<n*m;i++) gr->mark_plot(pos[i],'.');\r
-               else    mgl_surf_plot(gr,pos,n,m);\r
-               if(wire)\r
-               {\r
-                       gr->SetPenPal("k-");\r
-                       for(long i=0;i<n*m;i++) pos[i] = gr->CopyNtoC(pos[i],gr->CDef);\r
-                       mgl_mesh_plot(gr,pos,n,m,3);\r
-               }\r
-       }\r
-       delete []pos;   gr->EndGroup();\r
+       mglDataV z(c->GetNx(),c->GetNy(),c->GetNz());\r
+       if(z.GetNz()>1) z.Fill(gr->Min.z,gr->Max.z,'z');\r
+       else    z.Fill(zVal);\r
+       mgl_surf_gen(gr, x, y, &z, c, 0, sch);\r
 }\r
 //-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_dens(HMGL gr, HCDT z, const char *sch, const char *opt)\r
+void MGL_EXPORT mgl_dens(HMGL gr, HCDT c, const char *sch, const char *opt)\r
 {\r
        gr->SaveState(opt);\r
-       mglDataV x(z->GetNx()), y(z->GetNy());\r
+       mglDataV x(c->GetNx()), y(c->GetNy());\r
        x.Fill(gr->Min.x, gr->Max.x);\r
        y.Fill(gr->Min.y, gr->Max.y);\r
-       mgl_dens_xy(gr,&x,&y,z,sch,0);\r
+       mgl_dens_xy(gr,&x,&y,c,sch,0);\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_dens_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *a, const char *sch, const char *opt,int l,int lo)\r
@@ -482,126 +554,6 @@ void MGL_EXPORT mgl_stfa_(uintptr_t *gr, uintptr_t *re, uintptr_t *im, int *dn,
        mgl_stfa(_GR_,_DA_(re), _DA_(im), *dn, s, o);   delete []o;     delete []s;     }\r
 //-----------------------------------------------------------------------------\r
 //\r
-//     SurfC series\r
-//\r
-//-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_surfc_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt)\r
-{\r
-       long n=z->GetNx(),m=z->GetNy();\r
-       if(mgl_check_dim2(gr,x,y,z,c,"SurfC"))  return;\r
-\r
-       gr->SaveState(opt);\r
-       static int cgid=1;      gr->StartGroup("SurfC",cgid++);\r
-       long ss = gr->AddTexture(sch);\r
-       long *pos = new long[n*m];\r
-       bool wire = (mglchr(sch,'#'));\r
-       gr->Reserve((n+1)*(m+1)*z->GetNz()*(wire?2:1));\r
-\r
-       mglPoint p,q,s,xx,yy;\r
-       for(long k=0;k<z->GetNz();k++)\r
-       {\r
-               if(gr->NeedStop())      break;\r
-               for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
-               {\r
-                       xx = GetX(x,i,j,k);             yy = GetY(y,i,j,k);\r
-                       p = mglPoint(xx.x, yy.x, z->v(i,j,k));\r
-                       q = mglPoint(xx.y, yy.y, z->dvx(i,j,k));\r
-                       s = mglPoint(xx.z, yy.z, z->dvy(i,j,k));\r
-                       pos[i+n*j] = gr->AddPnt(p,gr->GetC(ss,c->v(i,j,k)),q^s);\r
-               }\r
-               if(sch && mglchr(sch,'.'))\r
-                       for(long i=0;i<n*m;i++) gr->mark_plot(pos[i],'.');\r
-               else    mgl_surf_plot(gr,pos,n,m);\r
-               if(wire)\r
-               {\r
-                       gr->SetPenPal("k-");\r
-                       for(long i=0;i<n*m;i++) pos[i] = gr->CopyNtoC(pos[i],gr->CDef);\r
-                       mgl_mesh_plot(gr,pos,n,m,3);\r
-               }\r
-       }\r
-       delete []pos;   gr->EndGroup();\r
-}\r
-//-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_surfc(HMGL gr, HCDT z, HCDT c, const char *sch, const char *opt)\r
-{\r
-       gr->SaveState(opt);\r
-       mglDataV x(z->GetNx()), y(z->GetNy());\r
-       x.Fill(gr->Min.x,gr->Max.x);\r
-       y.Fill(gr->Min.y,gr->Max.y);\r
-       mgl_surfc_xy(gr,&x,&y,z,c,sch,0);\r
-}\r
-//-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_surfc_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, const char *opt,int l,int lo)\r
-{      char *s=new char[l+1];  memcpy(s,sch,l);        s[l]=0;\r
-       char *o=new char[lo+1];         memcpy(o,opt,lo);       o[lo]=0;\r
-       mgl_surfc_xy(_GR_, _DA_(x), _DA_(y), _DA_(z), _DA_(a), s, o);   delete []o;     delete []s;     }\r
-//-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_surfc_(uintptr_t *gr, uintptr_t *z, uintptr_t *a, const char *sch, const char *opt,int l,int lo)\r
-{      char *s=new char[l+1];  memcpy(s,sch,l);        s[l]=0;\r
-       char *o=new char[lo+1];         memcpy(o,opt,lo);       o[lo]=0;\r
-       mgl_surfc(_GR_, _DA_(z), _DA_(a), s, o);        delete []o;     delete []s;     }\r
-//-----------------------------------------------------------------------------\r
-//\r
-//     SurfA series\r
-//\r
-//-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_surfa_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt)\r
-{\r
-       long k,n=z->GetNx(),m=z->GetNy();\r
-       if(mgl_check_dim2(gr,x,y,z,c,"SurfA"))  return;\r
-\r
-       gr->SaveState(opt);\r
-       static int cgid=1;      gr->StartGroup("SurfA",cgid++);\r
-       long ss = gr->AddTexture(sch);\r
-       long *pos = new long[n*m];\r
-       bool wire = (mglchr(sch,'#'));\r
-       gr->Reserve((n+1)*(m+1)*z->GetNz()*(wire?2:1));\r
-\r
-       mglPoint p,q,s,xx,yy;\r
-       for(k=0;k<z->GetNz();k++)\r
-       {\r
-               if(gr->NeedStop())      break;\r
-               for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
-               {\r
-                       xx = GetX(x,i,j,k);             yy = GetY(y,i,j,k);\r
-                       mreal vv = z->v(i,j,k); p = mglPoint(xx.x, yy.x, vv);\r
-                       q = mglPoint(xx.y, yy.y, z->dvx(i,j,k));\r
-                       s = mglPoint(xx.z, yy.z, z->dvy(i,j,k));\r
-                       pos[i+n*j] = gr->AddPnt(p,gr->GetC(ss,vv),q^s,gr->GetA(c->v(i,j,k)));\r
-               }\r
-               if(sch && mglchr(sch,'.'))\r
-                       for(long i=0;i<n*m;i++) gr->mark_plot(pos[i],'.');\r
-               else    mgl_surf_plot(gr,pos,n,m);\r
-               if(wire)\r
-               {\r
-                       gr->SetPenPal("k-");\r
-                       for(long i=0;i<n*m;i++) pos[i] = gr->CopyNtoC(pos[i],gr->CDef);\r
-                       mgl_mesh_plot(gr,pos,n,m,3);\r
-               }\r
-       }\r
-       delete []pos;   gr->EndGroup();\r
-}\r
-//-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_surfa(HMGL gr, HCDT z, HCDT c, const char *sch, const char *opt)\r
-{\r
-       gr->SaveState(opt);\r
-       mglDataV x(z->GetNx()), y(z->GetNy());\r
-       x.Fill(gr->Min.x,gr->Max.x);\r
-       y.Fill(gr->Min.y,gr->Max.y);\r
-       mgl_surfa_xy(gr,&x,&y,z,c,sch,0);\r
-}\r
-//-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_surfa_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, const char *opt,int l,int lo)\r
-{      char *s=new char[l+1];  memcpy(s,sch,l);        s[l]=0;\r
-       char *o=new char[lo+1];         memcpy(o,opt,lo);       o[lo]=0;\r
-       mgl_surfa_xy(_GR_, _DA_(x), _DA_(y), _DA_(z), _DA_(a), s, o);   delete []o;     delete []s;     }\r
-//-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_surfa_(uintptr_t *gr, uintptr_t *z, uintptr_t *a, const char *sch, const char *opt,int l,int lo)\r
-{      char *s=new char[l+1];  memcpy(s,sch,l);        s[l]=0;\r
-       char *o=new char[lo+1];         memcpy(o,opt,lo);       o[lo]=0;\r
-       mgl_surfa(_GR_, _DA_(z), _DA_(a), s, o);        delete []o;     delete []s;     }\r
-//-----------------------------------------------------------------------------\r
-//\r
 //     Boxs series\r
 //\r
 //-----------------------------------------------------------------------------\r
@@ -638,12 +590,12 @@ void MGL_EXPORT mgl_boxs_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co
                        y3 = i<lx-dx && j<ly-dy ? GetY(y,i+dx,j+dy,k).x:NAN;\r
                        z1 = i<n-dx?z->v(i+dx,j,k):NAN;\r
                        z2 = j<m-dy?z->v(i,j+dy,k):NAN;\r
-                       q = mglPoint(xx.y,yy.y,0);\r
-                       s = mglPoint(xx.z,yy.z,0);\r
-                       p1 = mglPoint(xx.x,yy.x,zz);    k1 = gr->AddPnt(p1,c,t);\r
-                       p2 = mglPoint(x1,y1,zz);                k2 = gr->AddPnt(p2,c,t);\r
-                       p3 = mglPoint(x2,y2,zz);                k3 = gr->AddPnt(p3,c,t);\r
-                       p4 = mglPoint(x3,y3,zz);                k4 = gr->AddPnt(p4,c,t);\r
+                       q.Set(xx.y,yy.y,0);\r
+                       s.Set(xx.z,yy.z,0);\r
+                       p1.Set(xx.x,yy.x,zz);   k1 = gr->AddPnt(p1,c,t);\r
+                       p2.Set(x1,y1,zz);               k2 = gr->AddPnt(p2,c,t);\r
+                       p3.Set(x2,y2,zz);               k3 = gr->AddPnt(p3,c,t);\r
+                       p4.Set(x3,y3,zz);               k4 = gr->AddPnt(p4,c,t);\r
                        if(wire)\r
                        {\r
                                gr->line_plot(k1,k2);   gr->line_plot(k1,k3);\r
@@ -653,10 +605,10 @@ void MGL_EXPORT mgl_boxs_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co
 \r
                        if(full)\r
                        {\r
-                               p1 = mglPoint(xx.x,yy.x,z0);    k5 = gr->AddPnt(p1,c,t);\r
-                               p2 = mglPoint(x1,y1,z0);                k6 = gr->AddPnt(p2,c,t);\r
-                               p3 = mglPoint(x2,y2,z0);                k7 = gr->AddPnt(p3,c,t);\r
-                               p4 = mglPoint(x3,y3,z0);                k8 = gr->AddPnt(p4,c,t);\r
+                               p1.Set(xx.x,yy.x,z0);   k5 = gr->AddPnt(p1,c,t);\r
+                               p2.Set(x1,y1,z0);               k6 = gr->AddPnt(p2,c,t);\r
+                               p3.Set(x2,y2,z0);               k7 = gr->AddPnt(p3,c,t);\r
+                               p4.Set(x3,y3,z0);               k8 = gr->AddPnt(p4,c,t);\r
                                if(wire)\r
                                {\r
                                        gr->line_plot(k5,k6);   gr->line_plot(k5,k7);\r
@@ -673,13 +625,13 @@ void MGL_EXPORT mgl_boxs_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co
                        }\r
                        else\r
                        {\r
-                               p3 = mglPoint(x1,y1,z1);                k5 = gr->AddPnt(p3,c,wire?t:q);\r
-                               p4 = mglPoint(x3,y3,z1);                k6 = gr->AddPnt(p4,c,wire?t:q);\r
+                               p3.Set(x1,y1,z1);               k5 = gr->AddPnt(p3,c,wire?t:q);\r
+                               p4.Set(x3,y3,z1);               k6 = gr->AddPnt(p4,c,wire?t:q);\r
                                if(wire)\r
                                {       gr->line_plot(k2,k5);   gr->line_plot(k6,k5);   gr->line_plot(k6,k4);   }\r
                                else    gr->quad_plot(k2,k4,k5,k6);\r
-                               p3 = mglPoint(x2,y2,z2);                k7 = gr->AddPnt(p3,c,wire?t:s);\r
-                               p4 = mglPoint(x3,y3,z2);                k8 = gr->AddPnt(p4,c,wire?t:s);\r
+                               p3.Set(x2,y2,z2);               k7 = gr->AddPnt(p3,c,wire?t:s);\r
+                               p4.Set(x3,y3,z2);               k8 = gr->AddPnt(p4,c,wire?t:s);\r
                                if(wire)\r
                                {       gr->line_plot(k3,k7);   gr->line_plot(k4,k8);   gr->line_plot(k7,k8);   }\r
                                else    gr->quad_plot(k3,k4,k7,k8);\r
@@ -725,7 +677,7 @@ void MGL_EXPORT mgl_tile_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co
        long ss = gr->AddTexture(sch);\r
        gr->Reserve(4*n*m*z->GetNz());\r
 \r
-       mglPoint s=mglPoint(0,0,1);\r
+       mglPoint s(0,0,1);\r
        for(long k=0;k<z->GetNz();k++)\r
        {\r
                if(gr->NeedStop())      break;\r
@@ -785,7 +737,7 @@ void MGL_EXPORT mgl_tiles_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT s, const char
        long cc = gr->AddTexture(sch);\r
        gr->Reserve(4*n*m*z->GetNz());\r
 \r
-       mglPoint t=mglPoint(0,0,1);\r
+       mglPoint t(0,0,1);\r
        mreal x1,x2,x3,x4,y1,y2,y3,y4;\r
        for(long k=0;k<z->GetNz();k++)\r
        {\r
@@ -850,7 +802,7 @@ void MGL_EXPORT mgl_map_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char
        long ss = gr->AddTexture(mgl_have_color(sch)?sch:"rgb",2);\r
        long s = nboth ?1:n;\r
 \r
-       mglPoint t=mglPoint(NAN);\r
+       mglPoint t(NAN);\r
        long *pos = new long[n*m];\r
        gr->Reserve(n*m);\r
 \r
diff --git a/src/tex_table.cc b/src/tex_table.cc
new file mode 100644 (file)
index 0000000..6f277e6
--- /dev/null
@@ -0,0 +1,1951 @@
+/***************************************************************************
+ * tex_table.cpp is part of Math Graphic Library
+ * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU Library General Public License as       *
+ *   published by the Free Software Foundation; either version 3 of the    *
+ *   License, or (at your option) any later version.                       *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU Library General Public     *
+ *   License along with this program; if not, write to the                 *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+#include "mgl2/font.h"
+
+/// Table of LaTeX symbols and its UTF8 codes. This array MUST BE sorted!!!
+MGL_EXPORT long mgl_tex_num=1924;
+MGL_EXPORT mglTeXsymb mgl_tex_symb[] = {
+       {0x23, L"#"},
+       {0x25, L"%"},
+       {0x26, L"&"},
+       {0xc5, L"AA"},
+       {0xc6, L"AE"},
+       {0x2370, L"APLboxquestion"},
+       {0x2353, L"APLboxupcaret"},
+       {0x2340, L"APLnotbackslash"},
+       {0x233f, L"APLnotslash"},
+       {0x391, L"Alpha"},
+       {0x26, L"And"},
+       {0x212b, L"Angstrom"},
+       {0x2ae7, L"Barv"},
+       {0x2102, L"BbbC"},
+       {0x213e, L"BbbGamma"},
+       {0x210d, L"BbbH"},
+       {0x2115, L"BbbN"},
+       {0x2119, L"BbbP"},
+       {0x213f, L"BbbPi"},
+       {0x211a, L"BbbQ"},
+       {0x211d, L"BbbR"},
+       {0x2124, L"BbbZ"},
+       {0x213d, L"Bbbgamma"},
+       {0x213c, L"Bbbpi"},
+       {0x2140, L"Bbbsum"},
+       {0x392, L"Beta"},
+       {0x224e, L"Bumpeq"},
+       {0x410, L"CYRA"},
+       {0x411, L"CYRB"},
+       {0x426, L"CYRC"},
+       {0x427, L"CYRCH"},
+       {0x414, L"CYRD"},
+       {0x415, L"CYRE"},
+       {0x42d, L"CYREREV"},
+       {0x42b, L"CYRERY"},
+       {0x424, L"CYRF"},
+       {0x413, L"CYRG"},
+       {0x425, L"CYRH"},
+       {0x42a, L"CYRHRDSN"},
+       {0x418, L"CYRI"},
+       {0x419, L"CYRISHRT"},
+       {0x41a, L"CYRK"},
+       {0x41b, L"CYRL"},
+       {0x41c, L"CYRM"},
+       {0x41d, L"CYRN"},
+       {0x41e, L"CYRO"},
+       {0x41f, L"CYRP"},
+       {0x420, L"CYRR"},
+       {0x421, L"CYRS"},
+       {0x42c, L"CYRSFTSN"},
+       {0x428, L"CYRSH"},
+       {0x429, L"CYRSHCH"},
+       {0x422, L"CYRT"},
+       {0x423, L"CYRU"},
+       {0x412, L"CYRV"},
+       {0x42f, L"CYRYA"},
+       {0x401, L"CYRYO"},
+       {0x42e, L"CYRYU"},
+       {0x417, L"CYRZ"},
+       {0x416, L"CYRZH"},
+       {0x22d2, L"Cap"},
+       {0x3a7, L"Chi"},
+       {0x2237, L"Colon"},
+       {0x2a74, L"Coloneq"},
+       {0x22d3, L"Cup"},
+       {0x27f1, L"DDownarrow"},
+       {0xd0, L"DH"},
+       {0x110, L"DJ"},
+       {0x2ae5, L"DashV"},
+       {0x27da, L"DashVDash"},
+       {0x2ae4, L"Dashv"},
+       {0x290b, L"Ddownarrow"},
+       {0x394, L"Delta"},
+       {0x3dc, L"Digamma"},
+       {0x2251, L"Doteq"},
+       {0x21d3, L"Downarrow"},
+       {0x395, L"Epsilon"},
+       {0x2263, L"Equiv"},
+       {0x397, L"Eta"},
+       {0x2107, L"Eulerconst"},
+       {0x203c, L"Exclam"},
+       {0x2132, L"Finv"},
+       {0x2141, L"Game"},
+       {0x393, L"Gamma"},
+       {0x2aa2, L"Gt"},
+       {0x26a5, L"Hermaphrodite"},
+       {0x2111, L"Im"},
+       {0x399, L"Iota"},
+       {0x39a, L"Kappa"},
+       {0x3de, L"Koppa"},
+       {0x141, L"L"},
+       {0x2b45, L"LLeftarrow"},
+       {0x39b, L"Lambda"},
+       {0x27ec, L"Lbrbrak"},
+       {0x21b2, L"Ldsh"},
+       {0x21d0, L"Leftarrow"},
+       {0x21d4, L"Leftrightarrow"},
+       {0x21da, L"Lleftarrow"},
+       {0x27f8, L"Longleftarrow"},
+       {0x27fa, L"Longleftrightarrow"},
+       {0x27fd, L"Longmapsfrom"},
+       {0x27fe, L"Longmapsto"},
+       {0x27f9, L"Longrightarrow"},
+       {0x2995, L"Lparengtr"},
+       {0x21b0, L"Lsh"},
+       {0x2aa1, L"Lt"},
+       {0x29da, L"Lvzigzag"},
+       {0x2906, L"Mapsfrom"},
+       {0x2907, L"Mapsto"},
+       {0x39c, L"Mu"},
+       {0x14a, L"NG"},
+       {0x21d7, L"Nearrow"},
+       {0x2aec, L"Not"},
+       {0x39d, L"Nu"},
+       {0x21d6, L"Nwarrow"},
+       {0xd8, L"O"},
+       {0x152, L"OE"},
+       {0x1a0, L"Ohorn"},
+       {0x3a9, L"Omega"},
+       {0x39f, L"Omicron"},
+       {0x2a37, L"Otimes"},
+       {0xb6, L"P"},
+       {0x3a6, L"Phi"},
+       {0x3a0, L"Pi"},
+       {0x210e, L"Planckconst"},
+       {0x2abb, L"Prec"},
+       {0x214a, L"PropertyLine"},
+       {0x3a8, L"Psi"},
+       {0x220e, L"QED"},
+       {0x2047, L"Question"},
+       {0x2b46, L"RRightarrow"},
+       {0x27ed, L"Rbrbrak"},
+       {0x21b3, L"Rdsh"},
+       {0x211c, L"Re"},
+       {0x3a1, L"Rho"},
+       {0x21d2, L"Rightarrow"},
+       {0x2996, L"Rparenless"},
+       {0x21db, L"Rrightarrow"},
+       {0x21b1, L"Rsh"},
+       {0x29db, L"Rvzigzag"},
+       {0xa7, L"S"},
+       {0x2abc, L"Sc"},
+       {0x21d8, L"Searrow"},
+       {0x3a3, L"Sigma"},
+       {0x2a4e, L"Sqcap"},
+       {0x2a4f, L"Sqcup"},
+       {0x3da, L"Stigma"},
+       {0x22d0, L"Subset"},
+       {0x22d1, L"Supset"},
+       {0x21d9, L"Swarrow"},
+       {0xde, L"TH"},
+       {0x3a4, L"Tau"},
+       {0x398, L"Theta"},
+       {0x27f0, L"UUparrow"},
+       {0x1af, L"Uhorn"},
+       {0x21d1, L"Uparrow"},
+       {0x21d5, L"Updownarrow"},
+       {0x290a, L"Uuparrow"},
+       {0x22ab, L"VDash"},
+       {0x2aeb, L"Vbar"},
+       {0x22a9, L"Vdash"},
+       {0x2a54, L"Vee"},
+       {0x2016, L"Vert"},
+       {0x22aa, L"Vvdash"},
+       {0x2980, L"Vvert"},
+       {0x2a53, L"Wedge"},
+       {0x2612, L"XBox"},
+       {0x39e, L"Xi"},
+       {0x2144, L"Yup"},
+       {0x1b5, L"Zbar"},
+       {0x396, L"Zeta"},
+       {0x5e, L"^"},
+       {0xe5, L"aa"},
+       {0x223e, L"ac"},
+       {0x23e6, L"accurrent"},
+       {0x267e, L"acidfree"},
+       {0x2940, L"acwcirclearrow"},
+       {0x27f2, L"acwgapcirclearrow"},
+       {0x2939, L"acwleftarcarrow"},
+       {0x21ba, L"acwopencirclearrow"},
+       {0x293a, L"acwoverarcarrow"},
+       {0x293b, L"acwundercurvearrow"},
+       {0x22f0, L"adots"},
+       {0xe6, L"ae"},
+       {0x2135, L"aleph"},
+       {0x3b1, L"alpha"},
+//     {0x2210, L"amalg"},
+       {0x2a3f, L"amalg"},
+       {0x299f, L"angdnr"},
+       {0x2220, L"angle"},
+       {0x299e, L"angles"},
+       {0x29a4, L"angleubar"},
+       {0x2248, L"approx"},
+       {0x224a, L"approxeq"},
+       {0x2a70, L"approxeqq"},
+       {0x224b, L"approxident"},
+       {0x2258, L"arceq"},
+       {0x2648, L"aries"},
+       {0x22a6, L"assert"},
+       {0x2217, L"ast"},
+       {0x2a6e, L"asteq"},
+       {0x2609, L"astrosun"},
+       {0x224d, L"asymp"},
+       {0x2a11, L"awint"},
+       {0x2aed, L"bNot"},
+       {0x224c, L"backcong"},
+       {0x2036, L"backdprime"},
+       {0x3f6, L"backepsilon"},
+       {0x2035, L"backprime"},
+       {0x223d, L"backsim"},
+       {0x22cd, L"backsimeq"},
+       {0x5c, L"backslash"},
+       {0x2037, L"backtrprime"},
+       {0x22ff, L"bagmember"},
+       {0x2aea, L"barV"},
+       {0x2a43, L"barcap"},
+       {0x2a42, L"barcup"},
+       {0x2961, L"bardownharpoonleft"},
+       {0x295d, L"bardownharpoonright"},
+       {0x21e4, L"barleftarrow"},
+       {0x21b9, L"barleftarrowrightarrowbar"},
+       {0x2956, L"barleftharpoondown"},
+       {0x2952, L"barleftharpoonup"},
+       {0x21b8, L"barovernorthwestarrow"},
+       {0x2920, L"barrightarrowdiamond"},
+       {0x295f, L"barrightharpoondown"},
+       {0x295b, L"barrightharpoonup"},
+       {0x2912, L"baruparrow"},
+       {0x2958, L"barupharpoonleft"},
+       {0x2954, L"barupharpoonright"},
+       {0x22bd, L"barvee"},
+       {0x22bc, L"barwedge"},
+       {0x23b6, L"bbrktbrk"},
+       {0x2550, L"bdHrule"},
+       {0x2551, L"bdVrule"},
+       {0x256c, L"bdbVbH"},
+       {0x256b, L"bdbVbh"},
+       {0x2563, L"bdbVlH"},
+       {0x2562, L"bdbVlh"},
+       {0x2560, L"bdbVrH"},
+       {0x255f, L"bdbVrh"},
+       {0x256a, L"bdbvbH"},
+       {0x253c, L"bdbvbh"},
+       {0x2561, L"bdbvlH"},
+       {0x2524, L"bdbvlh"},
+       {0x255e, L"bdbvrH"},
+       {0x251c, L"bdbvrh"},
+       {0x2566, L"bddVbH"},
+       {0x2565, L"bddVbh"},
+       {0x2557, L"bddVlH"},
+       {0x2556, L"bddVlh"},
+       {0x2554, L"bddVrH"},
+       {0x2553, L"bddVrh"},
+       {0x2564, L"bddvbH"},
+       {0x252c, L"bddvbh"},
+       {0x2555, L"bddvlH"},
+       {0x2510, L"bddvlh"},
+       {0x2552, L"bddvrH"},
+       {0x250c, L"bddvrh"},
+       {0x2500, L"bdhrule"},
+       {0x2571, L"bdnesw"},
+       {0x2572, L"bdnwse"},
+       {0x2508, L"bdquadhdash"},
+       {0x250a, L"bdquadvdash"},
+       {0x2506, L"bdtriplevdash"},
+       {0x2569, L"bduVbH"},
+       {0x2568, L"bduVbh"},
+       {0x255d, L"bduVlH"},
+       {0x255c, L"bduVlh"},
+       {0x255a, L"bduVrH"},
+       {0x2559, L"bduVrh"},
+       {0x2567, L"bduvbH"},
+       {0x2534, L"bduvbh"},
+       {0x255b, L"bduvlH"},
+       {0x2518, L"bduvlh"},
+       {0x2558, L"bduvrH"},
+       {0x2514, L"bduvrh"},
+       {0x2502, L"bdvrule"},
+       {0x2235, L"because"},
+       {0x23e3, L"benzenr"},
+       {0x3b2, L"beta"},
+       {0x2136, L"beth"},
+       {0x226c, L"between"},
+       {0x25bc, L"bigblacktriangledown"},
+       {0x25b2, L"bigblacktriangleup"},
+       {0x27d8, L"bigbot"},
+       {0x22c2, L"bigcap"},
+       {0x22c3, L"bigcup"},
+       {0x2a57, L"bigslopedvee"},
+       {0x2a58, L"bigslopedwedge"},
+       {0x2605, L"bigstar"},
+       {0x27d9, L"bigtop"},
+       {0x25bd, L"bigtriangledown"},
+       {0x25b3, L"bigtriangleup"},
+       {0x22c1, L"bigvee"},
+       {0x22c0, L"bigwedge"},
+       {0x2606, L"bigwhitestar"},
+       {0x29ed, L"blackcircledownarrow"},
+       {0x2688, L"blackcircledrightdot"},
+       {0x2791, L"blackcircledsanseight"},
+       {0x278e, L"blackcircledsansfive"},
+       {0x278d, L"blackcircledsansfour"},
+       {0x2792, L"blackcircledsansnine"},
+       {0x278a, L"blackcircledsansone"},
+       {0x2790, L"blackcircledsansseven"},
+       {0x278f, L"blackcircledsanssix"},
+       {0x2793, L"blackcircledsansten"},
+       {0x278c, L"blackcircledsansthree"},
+       {0x278b, L"blackcircledsanstwo"},
+       {0x2689, L"blackcircledtwodots"},
+       {0x25d5, L"blackcircleulquadwhite"},
+       {0x29ea, L"blackdiamonddownarrow"},
+       {0x29d7, L"blackhourglass"},
+       {0x25c8, L"blackinwhitediamond"},
+       {0x25a3, L"blackinwhitesquare"},
+       {0x25d6, L"blacklefthalfcircle"},
+       {0x25c4, L"blackpointerleft"},
+       {0x25ba, L"blackpointerright"},
+       {0x25d7, L"blackrighthalfcircle"},
+       {0x263b, L"blacksmiley"},
+       {0x25b4, L"blacktriangle"},
+       {0x25be, L"blacktriangledown"},
+       {0x25c0, L"blacktriangleleft"},
+       {0x25b6, L"blacktriangleright"},
+       {0x2b2c, L"blkhorzoval"},
+       {0x2b2e, L"blkvertoval"},
+       {0x2588, L"blockfull"},
+       {0x2592, L"blockhalfshaded"},
+       {0x258c, L"blocklefthalf"},
+       {0x2584, L"blocklowhalf"},
+       {0x2591, L"blockqtrshaded"},
+       {0x2590, L"blockrighthalf"},
+       {0x2593, L"blockthreeqtrshaded"},
+       {0x2580, L"blockuphalf"},
+       {0x22a5, L"bot"},
+       {0x25e1, L"botsemicircle"},
+       {0x22c8, L"bowtie"},
+       {0x25fb, L"box"},
+       {0x29c6, L"boxast"},
+       {0x25eb, L"boxbar"},
+       {0x29c8, L"boxbox"},
+       {0x29c5, L"boxbslash"},
+       {0x29c7, L"boxcircle"},
+       {0x29c4, L"boxdiag"},
+       {0x22a1, L"boxdot"},
+       {0x229f, L"boxminus"},
+       {0x29c9, L"boxonbox"},
+       {0x229e, L"boxplus"},
+       {0x22a0, L"boxtimes"},
+       {0x2b41, L"bsimilarleftarrow"},
+       {0x2b47, L"bsimilarrightarrow"},
+       {0x27c8, L"bsolhsub"},
+       {0x2a32, L"btimes"},
+       {0x2219, L"bullet"},
+       {0x25ce, L"bullseye"},
+       {0x224f, L"bumpeq"},
+       {0x2aae, L"bumpeqq"},
+       {0x212c, L"calB"},
+       {0x2130, L"calE"},
+       {0x2131, L"calF"},
+       {0x210b, L"calH"},
+       {0x2110, L"calI"},
+       {0x2112, L"calL"},
+       {0x2133, L"calM"},
+       {0x211b, L"calR"},
+       {0x2229, L"cap"},
+       {0x2a40, L"capdot"},
+       {0x2a44, L"capwedge"},
+       {0x2038, L"caretinsert"},
+       {0x23ce, L"carreturn"},
+       {0x21b5, L"carriagereturn"},
+       {0x293f, L"ccwundercurvearrow"},
+       {0x22c5, L"cdot"},
+       {0xb7, L"cdotp"},
+       {0x22ef, L"cdots"},
+       {0x2ba, L"cdprime"},
+       {0x2713, L"checkmark"},
+       {0x3c7, L"chi"},
+       {0x29c3, L"cirE"},
+       {0x27df, L"cirbot"},
+       {0x2218, L"circ"},
+       {0x2257, L"circeq"},
+       {0x2a10, L"circfint"},
+       {0x25d2, L"circlebottomhalfblack"},
+       {0x24b6, L"circledA"},
+       {0x24b7, L"circledB"},
+       {0x24b8, L"circledC"},
+       {0x24b9, L"circledD"},
+       {0x24ba, L"circledE"},
+       {0x24bb, L"circledF"},
+       {0x24bc, L"circledG"},
+       {0x24bd, L"circledH"},
+       {0x24be, L"circledI"},
+       {0x24bf, L"circledJ"},
+       {0x24c0, L"circledK"},
+       {0x24c1, L"circledL"},
+       {0x24c2, L"circledM"},
+       {0x24c3, L"circledN"},
+       {0x24c4, L"circledO"},
+       {0x24c5, L"circledP"},
+       {0x24c6, L"circledQ"},
+       {0x24c7, L"circledR"},
+       {0x24c8, L"circledS"},
+       {0x24c9, L"circledT"},
+       {0x24ca, L"circledU"},
+       {0x24cb, L"circledV"},
+       {0x24cc, L"circledW"},
+       {0x24cd, L"circledX"},
+       {0x24ce, L"circledY"},
+       {0x24cf, L"circledZ"},
+       {0x24d0, L"circleda"},
+       {0x229b, L"circledast"},
+       {0x24d1, L"circledb"},
+       {0x29bf, L"circledbullet"},
+       {0x24d2, L"circledc"},
+       {0x229a, L"circledcirc"},
+       {0x24d3, L"circledd"},
+       {0x229d, L"circleddash"},
+       {0x24d4, L"circlede"},
+       {0x2467, L"circledeight"},
+       {0x229c, L"circledequal"},
+       {0x24d5, L"circledf"},
+       {0x2464, L"circledfive"},
+       {0x2463, L"circledfour"},
+       {0x24d6, L"circledg"},
+       {0x24d7, L"circledh"},
+       {0x24d8, L"circledi"},
+       {0x24d9, L"circledj"},
+       {0x24da, L"circledk"},
+       {0x24db, L"circledl"},
+       {0x24dc, L"circledm"},
+       {0x24dd, L"circledn"},
+       {0x2468, L"circlednine"},
+       {0x24de, L"circledo"},
+       {0x2460, L"circledone"},
+       {0x29ec, L"circledownarrow"},
+       {0x24df, L"circledp"},
+       {0x29b7, L"circledparallel"},
+       {0x24e0, L"circledq"},
+       {0x24e1, L"circledr"},
+       {0x2686, L"circledrightdot"},
+       {0x24e2, L"circleds"},
+       {0x2787, L"circledsanseight"},
+       {0x2784, L"circledsansfive"},
+       {0x2783, L"circledsansfour"},
+       {0x2788, L"circledsansnine"},
+       {0x2780, L"circledsansone"},
+       {0x2786, L"circledsansseven"},
+       {0x2785, L"circledsanssix"},
+       {0x2789, L"circledsansten"},
+       {0x2782, L"circledsansthree"},
+       {0x2781, L"circledsanstwo"},
+       {0x2466, L"circledseven"},
+       {0x2465, L"circledsix"},
+       {0x272a, L"circledstar"},
+       {0x24e3, L"circledt"},
+       {0x2462, L"circledthree"},
+       {0x2461, L"circledtwo"},
+       {0x2687, L"circledtwodots"},
+       {0x24e4, L"circledu"},
+       {0x24e5, L"circledv"},
+       {0x29b6, L"circledvert"},
+       {0x24e6, L"circledw"},
+       {0x29be, L"circledwhitebullet"},
+       {0x24e7, L"circledx"},
+       {0x24e8, L"circledy"},
+       {0x24e9, L"circledz"},
+       {0x24ea, L"circledzero"},
+       {0x29b5, L"circlehbar"},
+       {0x25d0, L"circlelefthalfblack"},
+       {0x25f5, L"circlellquad"},
+       {0x25f6, L"circlelrquad"},
+       {0x2b30, L"circleonleftarrow"},
+       {0x21f4, L"circleonrightarrow"},
+       {0x25d1, L"circlerighthalfblack"},
+       {0x25d3, L"circletophalfblack"},
+       {0x25f4, L"circleulquad"},
+       {0x25f7, L"circleurquad"},
+       {0x25d4, L"circleurquadblack"},
+       {0x25cd, L"circlevertfill"},
+       {0x2aef, L"cirmid"},
+       {0x29c2, L"cirscir"},
+       {0x2329, L"clangle"},
+       {0x2a4d, L"closedvarcap"},
+       {0x2a4c, L"closedvarcup"},
+       {0x2a50, L"closedvarcupsmashprod"},
+       {0x2050, L"closure"},
+       {0x2318, L"cloverleaf"},
+       {0x2663, L"clubsuit"},
+       {0x3a, L"colon"},
+       {0x2236, L"colon"},
+       {0x2254, L"coloneq"},
+       {0x2a29, L"commaminus"},
+       {0x2201, L"complement"},
+       {0x27e1, L"concavediamond"},
+       {0x27e2, L"concavediamondtickleft"},
+       {0x27e3, L"concavediamondtickright"},
+       {0x2245, L"cong"},
+       {0x2a6d, L"congdot"},
+       {0x2332, L"conictaper"},
+       {0x260c, L"conjunction"},
+       {0x2210, L"coprod"},
+       {0x2b9, L"cprime"},
+       {0x232a, L"crangle"},
+       {0x2acf, L"csub"},
+       {0x2ad1, L"csube"},
+       {0x2ad0, L"csup"},
+       {0x2ad2, L"csupe"},
+       {0x221b, L"cuberoot"},
+       {0x222a, L"cup"},
+       {0x228d, L"cupdot"},
+       {0x228c, L"cupleftarrow"},
+       {0x2a45, L"cupvee"},
+       {0x22de, L"curlyeqprec"},
+       {0x22df, L"curlyeqsucc"},
+       {0x22ce, L"curlyvee"},
+       {0x22cf, L"curlywedge"},
+       {0x21b6, L"curvearrowleft"},
+       {0x293d, L"curvearrowleftplus"},
+       {0x21b7, L"curvearrowright"},
+       {0x293c, L"curvearrowrightminus"},
+       {0x2941, L"cwcirclearrow"},
+       {0x27f3, L"cwgapcirclearrow"},
+       {0x21bb, L"cwopencirclearrow"},
+       {0x2938, L"cwrightarcarrow"},
+       {0x293e, L"cwundercurvearrow"},
+       {0x232d, L"cylcty"},
+       {0x430, L"cyra"},
+       {0x431, L"cyrb"},
+       {0x446, L"cyrc"},
+       {0x447, L"cyrch"},
+       {0x434, L"cyrd"},
+       {0x435, L"cyre"},
+       {0x44d, L"cyrerev"},
+       {0x44b, L"cyrery"},
+       {0x444, L"cyrf"},
+       {0x433, L"cyrg"},
+       {0x445, L"cyrh"},
+       {0x44a, L"cyrhrdsn"},
+       {0x438, L"cyri"},
+       {0x439, L"cyrishrt"},
+       {0x43a, L"cyrk"},
+       {0x43b, L"cyrl"},
+       {0x43c, L"cyrm"},
+       {0x43d, L"cyrn"},
+       {0x43e, L"cyro"},
+       {0x43f, L"cyrp"},
+       {0x440, L"cyrr"},
+       {0x441, L"cyrs"},
+       {0x44c, L"cyrsftsn"},
+       {0x448, L"cyrsh"},
+       {0x449, L"cyrshch"},
+       {0x442, L"cyrt"},
+       {0x443, L"cyru"},
+       {0x432, L"cyrv"},
+       {0x44f, L"cyrya"},
+       {0x451, L"cyryo"},
+       {0x44e, L"cyryu"},
+       {0x437, L"cyrz"},
+       {0x436, L"cyrzh"},
+       {0x2020, L"dag"},
+       {0x2020, L"dagger"},
+       {0x2138, L"daleth"},
+       {0x2621, L"danger"},
+       {0x2ae3, L"dashV"},
+       {0x27db, L"dashVdash"},
+       {0x2239, L"dashcolon"},
+       {0x296b, L"dashleftharpoondown"},
+       {0x296d, L"dashrightharpoondown"},
+       {0x22a3, L"dashv"},
+       {0x290f, L"dbkarow"},
+       {0x2021, L"ddag"},
+       {0x2021, L"ddagger"},
+       {0x22f1, L"ddots"},
+       {0x2a77, L"ddotseq"},
+       {0xb0, L"degree"},
+       {0x3b4, L"delta"},
+       {0xf0, L"dh"},
+       {0x2300, L"diameter"},
+       {0x25c7, L"diamond"},
+       {0x2b19, L"diamondbotblack"},
+       {0x27d0, L"diamondcdot"},
+       {0x291d, L"diamondleftarrow"},
+       {0x291f, L"diamondleftarrowbar"},
+       {0x2b16, L"diamondleftblack"},
+       {0x2b17, L"diamondrightblack"},
+       {0x2662, L"diamondsuit"},
+       {0x2b18, L"diamondtopblack"},
+       {0x2680, L"dicei"},
+       {0x2681, L"diceii"},
+       {0x2682, L"diceiii"},
+       {0x2683, L"diceiv"},
+       {0x2684, L"dicev"},
+       {0x2685, L"dicevi"},
+       {0x3dd, L"digamma"},
+       {0x273d, L"dingasterisk"},
+       {0x2393, L"dircurrent"},
+       {0x22f2, L"disin"},
+       {0xf7, L"div"},
+       {0x22c7, L"divideontimes"},
+       {0x111, L"dj"},
+       {0x230d, L"dlcrop"},
+       {0x2250, L"doteq"},
+       {0x2a67, L"dotequiv"},
+       {0x2238, L"dotminus"},
+       {0x2214, L"dotplus"},
+       {0x2026, L"dots"},
+       {0x2a6a, L"dotsim"},
+       {0x223a, L"dotsminusdots"},
+       {0x25cc, L"dottedcircle"},
+       {0x2b1a, L"dottedsquare"},
+       {0x2a30, L"dottimes"},
+       {0x2a62, L"doublebarvee"},
+       {0x2a5e, L"doublebarwedge"},
+       {0x29fa, L"doubleplus"},
+       {0x2193, L"downarrow"},
+       {0x2913, L"downarrowbar"},
+       {0x2908, L"downarrowbarred"},
+       {0x21e3, L"downdasharrow"},
+       {0x21ca, L"downdownarrows"},
+       {0x297f, L"downfishtail"},
+       {0x21c3, L"downharpoonleft"},
+       {0x2959, L"downharpoonleftbar"},
+       {0x21c2, L"downharpoonright"},
+       {0x2955, L"downharpoonrightbar"},
+       {0x2965, L"downharpoonsleftright"},
+       {0x2935, L"downrightcurvedarrow"},
+       {0x29e8, L"downtriangleleftblack"},
+       {0x29e9, L"downtrianglerightblack"},
+       {0x21f5, L"downuparrows"},
+       {0x296f, L"downupharpoonsleftright"},
+       {0x21e9, L"downwhitearrow"},
+       {0x21af, L"downzigzagarrow"},
+       {0x2033, L"dprime"},
+       {0x279b, L"draftingarrow"},
+       {0x2910, L"drbkarow"},
+       {0x230c, L"drcrop"},
+       {0x29f6, L"dsol"},
+       {0x2a64, L"dsub"},
+       {0x29df, L"dualmap"},
+       {0x2641, L"earth"},
+       {0x2a98, L"egsdot"},
+       {0x266a, L"eighthnote"},
+       {0x23e7, L"elinters"},
+       {0x2113, L"ell"},
+       {0x2a97, L"elsdot"},
+       {0x2014, L"emdash"},
+       {0x2205, L"emptyset"},
+       {0x29b3, L"emptysetoarr"},
+       {0x29b4, L"emptysetoarrl"},
+       {0x29b1, L"emptysetobar"},
+       {0x29b2, L"emptysetocirc"},
+       {0x2013, L"endash"},
+       {0x2025, L"enleadertwodots"},
+       {0x2709, L"envelope"},
+       {0x29e3, L"eparsl"},
+       {0x3f5, L"epsilon"},
+       {0x2256, L"eqcirc"},
+       {0x2255, L"eqcolon"},
+       {0x225d, L"eqdef"},
+       {0x2a66, L"eqdot"},
+       {0x2a75, L"eqeq"},
+       {0x2a76, L"eqeqeq"},
+       {0x22dd, L"eqgtr"},
+       {0x22dc, L"eqless"},
+       {0x2a9a, L"eqqgtr"},
+       {0x2a99, L"eqqless"},
+       {0x2a71, L"eqqplus"},
+       {0x2a73, L"eqqsim"},
+       {0x2a9c, L"eqqslantgtr"},
+       {0x2a9b, L"eqqslantless"},
+       {0x2242, L"eqsim"},
+       {0x2a96, L"eqslantgtr"},
+       {0x2a95, L"eqslantless"},
+       {0x2b40, L"equalleftarrow"},
+       {0x22d5, L"equalparallel"},
+       {0x2971, L"equalrightarrow"},
+       {0x2261, L"equiv"},
+       {0x2a78, L"equivDD"},
+       {0x2a68, L"equivVert"},
+       {0x2a69, L"equivVvert"},
+       {0x29e5, L"eqvparsl"},
+       {0x29f3, L"errbarblackcircle"},
+       {0x29f1, L"errbarblackdiamond"},
+       {0x29ef, L"errbarblacksquare"},
+       {0x29f2, L"errbarcircle"},
+       {0x29f0, L"errbardiamond"},
+       {0x29ee, L"errbarsquare"},
+       {0x3b7, L"eta"},
+       {0x20ac, L"euro"},
+       {0x2203, L"exists"},
+       {0x2252, L"fallingdotseq"},
+       {0x29d3, L"fbowtie"},
+       {0x2a3e, L"fcmp"},
+       {0x292f, L"fdiagovnearrow"},
+       {0x292c, L"fdiagovrdiag"},
+       {0x2640, L"female"},
+       {0x2012, L"figdash"},
+       {0x2a0f, L"fint"},
+       {0x25c9, L"fisheye"},
+       {0x266d, L"flat"},
+       {0x23e5, L"fltns"},
+       {0x2200, L"forall"},
+       {0x2adc, L"forks"},
+       {0x2add, L"forksnot"},
+       {0x2ad9, L"forkv"},
+       {0x221c, L"fourthroot"},
+       {0x2999, L"fourvdots"},
+       {0x215d, L"fracfiveeighths"},
+       {0x215a, L"fracfivesixths"},
+       {0x2158, L"fracfourfifths"},
+       {0x215b, L"fraconeeighth"},
+       {0x2155, L"fraconefifth"},
+       {0x2159, L"fraconesixth"},
+       {0x2153, L"fraconethird"},
+       {0x215e, L"fracseveneights"},
+       {0x2044, L"fracslash"},
+       {0x215c, L"fracthreeeighths"},
+       {0x2157, L"fracthreefifths"},
+       {0x2156, L"fractwofifths"},
+       {0x2154, L"fractwothirds"},
+       {0x212d, L"frakC"},
+       {0x210c, L"frakH"},
+       {0x2128, L"frakZ"},
+       {0x2322, L"frown"},
+       {0x2639, L"frownie"},
+       {0x27d7, L"fullouterjoin"},
+       {0x3b3, L"gamma"},
+       {0x2265, L"ge"},
+       {0x2265, L"geq"},
+       {0x2267, L"geqq"},
+       {0x2a7e, L"geqslant"},
+       {0x2aa9, L"gescc"},
+       {0x2a80, L"gesdot"},
+       {0x2a82, L"gesdoto"},
+       {0x2a84, L"gesdotol"},
+       {0x2a94, L"gesles"},
+       {0x2190, L"gets"},
+       {0x226b, L"gg"},
+       {0x22d9, L"ggg"},
+       {0x2af8, L"gggnest"},
+       {0x2137, L"gimel"},
+       {0x2a92, L"glE"},
+       {0x2aa5, L"gla"},
+       {0x29e6, L"gleichstark"},
+       {0x2aa4, L"glj"},
+       {0x2a8a, L"gnapprox"},
+       {0x2a88, L"gneq"},
+       {0x2269, L"gneqq"},
+       {0x22e7, L"gnsim"},
+       {0x3e, L"greater"},
+       {0x2a8e, L"gsime"},
+       {0x2a90, L"gsiml"},
+       {0x2aa7, L"gtcc"},
+       {0x2a7a, L"gtcir"},
+       {0x29a0, L"gtlpar"},
+       {0x2a7c, L"gtquest"},
+       {0x2a86, L"gtrapprox"},
+       {0x2978, L"gtrarr"},
+       {0x22d7, L"gtrdot"},
+       {0x22db, L"gtreqless"},
+       {0x2a8c, L"gtreqqless"},
+       {0x2277, L"gtrless"},
+       {0x2273, L"gtrsim"},
+       {0xab, L"guillemotleft"},
+       {0xbb, L"guillemotright"},
+       {0x2039, L"guilsinglleft"},
+       {0x203a, L"guilsinglright"},
+       {0x23af, L"harrowextender"},
+       {0x2a6f, L"hatapprox"},
+       {0x210f, L"hbar"},
+       {0x2661, L"heartsuit"},
+       {0x22b9, L"hermitmatrix"},
+       {0x2394, L"hexagon"},
+       {0x2b23, L"hexagonblack"},
+       {0x306e, L"hiraganano"},
+       {0x2924, L"hknearrow"},
+       {0x2923, L"hknwarrow"},
+       {0x2925, L"hksearow"},
+       {0x2926, L"hkswarow"},
+       {0x21a9, L"hookleftarrow"},
+       {0x21aa, L"hookrightarrow"},
+       {0x2015, L"horizbar"},
+       {0x29d6, L"hourglass"},
+       {0x2302, L"house"},
+       {0x25ad, L"hrectangle"},
+       {0x25ac, L"hrectangleblack"},
+       {0x210f, L"hslash"},
+       {0x2043, L"hyphenbullet"},
+       {0x3030, L"hzigzag"},
+       {0x2a0c, L"iiiint"},
+       {0x222d, L"iiint"},
+       {0x29dc, L"iinfin"},
+       {0x222c, L"iint"},
+       {0x22b7, L"imageof"},
+       {0x2208, L"in"},
+       {0x2105, L"incare"},
+       {0x2206, L"increment"},
+       {0x221e, L"infty"},
+       {0x222b, L"int"},
+       {0x2a0e, L"intBar"},
+       {0x2a0d, L"intbar"},
+       {0x2321, L"intbottom"},
+       {0x2a19, L"intcap"},
+       {0x2231, L"intclockwise"},
+       {0x2a1a, L"intcup"},
+       {0x22ba, L"intercal"},
+       {0x2af4, L"interleave"},
+       {0x23ae, L"intextender"},
+       {0x2a17, L"intlharhk"},
+       {0x2a3c, L"intprod"},
+       {0x2a3d, L"intprodr"},
+       {0x2320, L"inttop"},
+       {0x2a18, L"intx"},
+       {0x25d8, L"inversebullet"},
+       {0x25d9, L"inversewhitecircle"},
+       {0x2310, L"invnot"},
+       {0x25db, L"invwhitelowerhalfcircle"},
+       {0x25da, L"invwhiteupperhalfcircle"},
+       {0x3b9, L"iota"},
+       {0x2e0, L"ipasupgamma"},
+       {0x2e1, L"ipasupl"},
+       {0x2e4, L"ipasuprerglotstpp"},
+       {0x2e2, L"ipasups"},
+       {0x2e3, L"ipasupx"},
+       {0x2ed, L"ipaunaspirated"},
+       {0x2ec, L"ipavoicing"},
+       {0x22f9, L"isinE"},
+       {0x22f5, L"isindot"},
+       {0x22f7, L"isinobar"},
+       {0x22f4, L"isins"},
+       {0x22f8, L"isinvb"},
+       {0x2145, L"itBbbD"},
+       {0x2146, L"itBbbd"},
+       {0x2147, L"itBbbe"},
+       {0x2148, L"itBbbi"},
+       {0x2149, L"itBbbj"},
+       {0x2643, L"jupiter"},
+       {0x3ba, L"kappa"},
+       {0x223b, L"kernelcontraction"},
+       {0x3df, L"koppa"},
+       {0x142, L"l"},
+       {0x27ea, L"lAngle"},
+       {0x2983, L"lBrace"},
+       {0x27e6, L"lBrack"},
+       {0x2985, L"lParen"},
+       {0x3bb, L"lambda"},
+       {0x19b, L"lambdabar"},
+       {0x27e8, L"langle"},
+       {0x2991, L"langledot"},
+       {0x29e0, L"laplac"},
+       {0x2bd, L"lasp"},
+       {0x2aab, L"lat"},
+       {0x2aad, L"late"},
+       {0x27c5, L"lbag"},
+       {0x2997, L"lblkbrbrak"},
+       {0x7b, L"lbrace"},
+       {0x23a9, L"lbracelend"},
+       {0x23a8, L"lbracemid"},
+       {0x23a7, L"lbraceuend"},
+       {0x5b, L"lbrack"},
+       {0x23a2, L"lbrackextender"},
+       {0x23a3, L"lbracklend"},
+       {0x298f, L"lbracklltick"},
+       {0x298b, L"lbrackubar"},
+       {0x23a1, L"lbrackuend"},
+       {0x298d, L"lbrackultick"},
+       {0x2772, L"lbrbrak"},
+       {0x2308, L"lceil"},
+       {0x29fc, L"lcurvyangle"},
+       {0x21e0, L"ldasharrhead"},
+       {0x2264, L"le"},
+       {0x219d, L"leadsto"},
+       {0x2190, L"leftarrow"},
+       {0x2b4a, L"leftarrowapprox"},
+       {0x2b42, L"leftarrowbackapprox"},
+       {0x2b4b, L"leftarrowbsimilar"},
+       {0x2977, L"leftarrowless"},
+       {0x2b32, L"leftarrowonoplus"},
+       {0x2946, L"leftarrowplus"},
+       {0x2943, L"leftarrowshortrightarrow"},
+       {0x2973, L"leftarrowsimilar"},
+       {0x297a, L"leftarrowsubset"},
+       {0x21a2, L"leftarrowtail"},
+       {0x21fd, L"leftarrowtriangle"},
+       {0x2b3e, L"leftarrowx"},
+       {0x290c, L"leftbkarrow"},
+       {0x2b3f, L"leftcurvedarrow"},
+       {0x21e0, L"leftdasharrow"},
+       {0x21e1, L"leftdasharrowhead"},
+       {0x290e, L"leftdbkarrow"},
+       {0x291b, L"leftdbltail"},
+       {0x2b38, L"leftdotarrow"},
+       {0x2936, L"leftdowncurvedarrow"},
+       {0x297c, L"leftfishtail"},
+       {0x21bd, L"leftharpoondown"},
+       {0x295e, L"leftharpoondownbar"},
+       {0x2962, L"leftharpoonsupdown"},
+       {0x21bc, L"leftharpoonup"},
+       {0x295a, L"leftharpoonupbar"},
+       {0x296a, L"leftharpoonupdash"},
+       {0x21c7, L"leftleftarrows"},
+       {0x263e, L"leftmoon"},
+       {0x27d5, L"leftouterjoin"},
+       {0x2194, L"leftrightarrow"},
+       {0x2948, L"leftrightarrowcircle"},
+       {0x21c6, L"leftrightarrows"},
+       {0x21ff, L"leftrightarrowtriangle"},
+       {0x2950, L"leftrightharpoondowndown"},
+       {0x294b, L"leftrightharpoondownup"},
+       {0x21cb, L"leftrightharpoons"},
+       {0x2967, L"leftrightharpoonsdown"},
+       {0x2966, L"leftrightharpoonsup"},
+       {0x294a, L"leftrightharpoonupdown"},
+       {0x294e, L"leftrightharpoonupup"},
+       {0x21ad, L"leftrightsquigarrow"},
+       {0x219c, L"leftsquigarrow"},
+       {0x21dc, L"leftsquigarrow"},
+       {0x2919, L"lefttail"},
+       {0x2b31, L"leftthreearrows"},
+       {0x22cb, L"leftthreetimes"},
+       {0x21e6, L"leftwhitearrow"},
+       {0x2264, L"leq"},
+       {0x2266, L"leqq"},
+       {0x2af9, L"leqqslant"},
+       {0x2afa, L"leqqslant"},
+       {0x2a7d, L"leqslant"},
+       {0x2aa8, L"lescc"},
+       {0x2a7f, L"lesdot"},
+       {0x2a81, L"lesdoto"},
+       {0x2a83, L"lesdotor"},
+       {0x2a93, L"lesges"},
+       {0x3c, L"less"},
+       {0x2a85, L"lessapprox"},
+       {0x22d6, L"lessdot"},
+       {0x22da, L"lesseqgtr"},
+       {0x2a8b, L"lesseqqgtr"},
+       {0x2276, L"lessgtr"},
+       {0x2272, L"lesssim"},
+       {0x29d1, L"lfbowtie"},
+       {0x230a, L"lfloor"},
+       {0x29d4, L"lftimes"},
+       {0x2a91, L"lgE"},
+       {0x2b24, L"lgblkcircle"},
+       {0x2b1b, L"lgblksquare"},
+       {0x25ef, L"lgwhtcircle"},
+       {0x2b1c, L"lgwhtsquare"},
+       {0x22b2, L"lhd"},
+       {0x21b4, L"linefeed"},
+       {0x226a, L"ll"},
+       {0x2989, L"llangle"},
+       {0x25df, L"llarc"},
+       {0x25e3, L"llblacktriangle"},
+       {0x231e, L"llcorner"},
+       {0x22d8, L"lll"},
+       {0x2af7, L"lllnest"},
+       {0x2987, L"llparenthesis"},
+       {0x25fa, L"lltriangle"},
+       {0x23b0, L"lmoustache"},
+       {0x2a89, L"lnapprox"},
+       {0x2a87, L"lneq"},
+       {0x2268, L"lneqq"},
+       {0x22e6, L"lnsim"},
+       {0x27de, L"longdashv"},
+       {0x27cc, L"longdivision"},
+       {0x27f5, L"longleftarrow"},
+       {0x27f7, L"longleftrightarrow"},
+       {0x2b33, L"longleftsquigarrow"},
+       {0x27fb, L"longmapsfrom"},
+       {0x27fc, L"longmapsto"},
+       {0x27f6, L"longrightarrow"},
+       {0x27ff, L"longrightsquigarrow"},
+       {0x21ab, L"looparrowleft"},
+       {0x21ac, L"looparrowright"},
+       {0x2a1c, L"lowint"},
+       {0x25ca, L"lozenge"},
+       {0x27e0, L"lozengeminus"},
+       {0x239c, L"lparenextender"},
+       {0x239d, L"lparenlend"},
+       {0x2993, L"lparenless"},
+       {0x239b, L"lparenuend"},
+       {0x2018, L"lq"},
+       {0x25de, L"lrarc"},
+       {0x25e2, L"lrblacktriangle"},
+       {0x231f, L"lrcorner"},
+       {0x25ff, L"lrtriangle"},
+       {0x29e1, L"lrtriangleeq"},
+       {0x2a8d, L"lsime"},
+       {0x2a8f, L"lsimg"},
+       {0x2acd, L"lsqhook"},
+       {0x2aa6, L"ltcc"},
+       {0x2a79, L"ltcir"},
+       {0x22c9, L"ltimes"},
+       {0x2976, L"ltlarr"},
+       {0x2a7b, L"ltquest"},
+       {0x29cf, L"ltrivb"},
+       {0x23b8, L"lvboxline"},
+       {0x29d8, L"lvzigzag"},
+       {0x2642, L"male"},
+       {0x2720, L"maltese"},
+       {0x21a7, L"mapsdown"},
+       {0x21a4, L"mapsfrom"},
+       {0x21a6, L"mapsto"},
+       {0x21a5, L"mapsup"},
+       {0x2b25, L"mdblkdiamond"},
+       {0x2b27, L"mdblklozenge"},
+       {0x26ab, L"mdblkrcl"},
+       {0x25fc, L"mdblksquare"},
+       {0x25cf, L"mdlgblkcircle"},
+       {0x25c6, L"mdlgblkdiamond"},
+       {0x29eb, L"mdlgblklozenge"},
+       {0x25a0, L"mdlgblksquare"},
+       {0x25cb, L"mdlgwhtcircle"},
+       {0x25c7, L"mdlgwhtdiamond"},
+       {0x25a1, L"mdlgwhtsquare"},
+       {0x2981, L"mdsmblkcircle"},
+       {0x25fe, L"mdsmblksquare"},
+       {0x26ac, L"mdsmwhtcircl"},
+       {0x25fd, L"mdsmwhtsquare"},
+       {0x26aa, L"mdwhtcircl"},
+       {0x2b26, L"mdwhtdiamond"},
+       {0x2b28, L"mdwhtlozenge"},
+       {0x25fb, L"mdwhtsquare"},
+       {0x29af, L"measangledltosw"},
+       {0x29ae, L"measangledrtose"},
+       {0x29ab, L"measangleldtosw"},
+       {0x29a9, L"measanglelutonw"},
+       {0x29aa, L"measanglerdtose"},
+       {0x29a8, L"measanglerutone"},
+       {0x29ad, L"measangleultonw"},
+       {0x29ac, L"measangleurtone"},
+       {0x225e, L"measeq"},
+       {0x2221, L"measuredangle"},
+       {0x299b, L"measuredangleleft"},
+       {0x22be, L"measuredrightangle"},
+       {0x2b51, L"medblackstar"},
+       {0x205f, L"medmathspace"},
+       {0x2b50, L"medwhitestar"},
+       {0x263f, L"mercury"},
+       {0x2127, L"mho"},
+       {0x2223, L"mid"},
+       {0x2a5d, L"midbarvee"},
+       {0x2a5c, L"midbarwedge"},
+       {0x2af0, L"midcir"},
+       {0x2212, L"minus"},
+       {0x2a2a, L"minusdot"},
+       {0x2a2b, L"minusfdots"},
+       {0x2a2c, L"minusrdots"},
+       {0x2adb, L"mlcp"},
+       {0x22a7, L"models"},
+       {0x2213, L"mp"},
+       {0x3bc, L"mu"},
+       {0x22b8, L"multimap"},
+       {0x27dc, L"multimapinv"},
+       {0x21df, L"nHdownarrow"},
+       {0x21de, L"nHuparrow"},
+       {0x21cd, L"nLeftarrow"},
+       {0x21ce, L"nLeftrightarrow"},
+       {0x21cf, L"nRightarrow"},
+       {0x22af, L"nVDash"},
+       {0x22ae, L"nVdash"},
+       {0x21fa, L"nVleftarrow"},
+       {0x2b3a, L"nVleftarrowtail"},
+       {0x21fc, L"nVleftrightarrow"},
+       {0x21fb, L"nVrightarrow"},
+       {0x2915, L"nVrightarrowtail"},
+       {0x2b35, L"nVtwoheadleftarrow"},
+       {0x2b3d, L"nVtwoheadleftarrowtail"},
+       {0x2901, L"nVtwoheadrightarrow"},
+       {0x2918, L"nVtwoheadrightarrowtail"},
+       {0x2207, L"nabla"},
+       {0x2249, L"napprox"},
+       {0x226d, L"nasymp"},
+       {0x266e, L"natural"},
+       {0x2247, L"ncong"},
+       {0x2260, L"ne"},
+       {0x2197, L"nearrow"},
+       {0xac, L"neg"},
+       {0x2931, L"neovnwarrow"},
+       {0x292e, L"neovsearrow"},
+       {0x2646, L"neptune"},
+       {0x2260, L"neq"},
+       {0x2262, L"nequiv"},
+       {0x2922, L"neswarrow"},
+       {0x26b2, L"neuter"},
+       {0x2204, L"nexists"},
+       {0x14b, L"ng"},
+       {0x2271, L"ngeq"},
+       {0x226f, L"ngtr"},
+       {0x2279, L"ngtrless"},
+       {0x2275, L"ngtrsim"},
+       {0x2af5, L"nhVvert"},
+       {0x2af2, L"nhpar"},
+       {0x220b, L"ni"},
+       {0x22fe, L"niobar"},
+       {0x22fc, L"nis"},
+       {0x22fa, L"nisd"},
+       {0x219a, L"nleftarrow"},
+       {0x21ae, L"nleftrightarrow"},
+       {0x2270, L"nleq"},
+       {0x226e, L"nless"},
+       {0x2278, L"nlessgtr"},
+       {0x2274, L"nlesssim"},
+       {0x2224, L"nmid"},
+       {0x220c, L"nni"},
+       {0x2011, L"nobreakhyphen"},
+       {0x2209, L"notin"},
+       {0x2226, L"nparallel"},
+       {0x2a14, L"npolint"},
+       {0x2280, L"nprec"},
+       {0x22e0, L"npreccurlyeq"},
+       {0x219b, L"nrightarrow"},
+       {0x2241, L"nsim"},
+       {0x2244, L"nsime"},
+       {0x22e2, L"nsqsubseteq"},
+       {0x22e3, L"nsqsupseteq"},
+       {0x2284, L"nsubset"},
+       {0x2288, L"nsubseteq"},
+       {0x2281, L"nsucc"},
+       {0x22e1, L"nsucccurlyeq"},
+       {0x2285, L"nsupset"},
+       {0x2289, L"nsupseteq"},
+       {0x22ea, L"ntriangleleft"},
+       {0x22ec, L"ntrianglelefteq"},
+       {0x22eb, L"ntriangleright"},
+       {0x22ed, L"ntrianglerighteq"},
+       {0x3bd, L"nu"},
+       {0x22ad, L"nvDash"},
+       {0x2902, L"nvLeftarrow"},
+       {0x2904, L"nvLeftrightarrow"},
+       {0x2903, L"nvRightarrow"},
+       {0x22ac, L"nvdash"},
+       {0x29de, L"nvinfty"},
+       {0x21f7, L"nvleftarrow"},
+       {0x2b39, L"nvleftarrowtail"},
+       {0x21f9, L"nvleftrightarrow"},
+       {0x21f8, L"nvrightarrow"},
+       {0x2914, L"nvrightarrowtail"},
+       {0x2b34, L"nvtwoheadleftarrow"},
+       {0x2b3c, L"nvtwoheadleftarrowtail"},
+       {0x2900, L"nvtwoheadrightarrow"},
+       {0x2917, L"nvtwoheadrightarrowtail"},
+       {0x2196, L"nwarrow"},
+       {0x2932, L"nwovnearrow"},
+       {0x2921, L"nwsearrow"},
+       {0xf8, L"o"},
+       {0x233d, L"obar"},
+       {0x29ba, L"obot"},
+       {0x23e0, L"obrbrak"},
+       {0x29b8, L"obslash"},
+       {0x2a38, L"odiv"},
+       {0x2299, L"odot"},
+       {0x29bc, L"odotslashdot"},
+       {0x153, L"oe"},
+       {0x29c1, L"ogreaterthan"},
+       {0x1a1, L"ohorn"},
+       {0x2230, L"oiiint"},
+       {0x222f, L"oiint"},
+       {0x222e, L"oint"},
+       {0x2233, L"ointctrclockwise"},
+       {0x29bb, L"olcross"},
+       {0x3d8, L"oldKoppa"},
+       {0x3d9, L"oldkoppa"},
+       {0x29c0, L"olessthan"},
+       {0x3c9, L"omega"},
+       {0x3bf, L"omicron"},
+       {0x2296, L"ominus"},
+       {0x29b9, L"operp"},
+       {0x2295, L"oplus"},
+       {0x2a2d, L"opluslhrim"},
+       {0x2a2e, L"oplusrhrim"},
+       {0x22b6, L"origof"},
+       {0x2298, L"oslash"},
+       {0x2297, L"otimes"},
+       {0x2a36, L"otimeshat"},
+       {0x2a34, L"otimeslhrim"},
+       {0x2a35, L"otimesrhrim"},
+       {0x23de, L"overbrace"},
+       {0x23b4, L"overbracket"},
+       {0x203e, L"overline"},
+       {0x23dc, L"overparen"},
+       {0x220b, L"owns"},
+       {0x2225, L"parallel"},
+       {0x25b1, L"parallelogram"},
+       {0x25b0, L"parallelogramblack"},
+       {0x2af3, L"parsim"},
+       {0x2202, L"partial"},
+       {0x2aa3, L"partialmeetcontraction"},
+       {0x2b20, L"pentagon"},
+       {0x2b1f, L"pentagonblack"},
+       {0x27c2, L"perp"},
+       {0x2ae1, L"perps"},
+       {0x3d5, L"phi"},
+       {0x260e, L"phone"},
+       {0x3c0, L"pi"},
+       {0x22d4, L"pitchfork"},
+       {0x2a25, L"plusdot"},
+       {0x2a72, L"pluseqq"},
+       {0x2a23, L"plushat"},
+       {0x2a26, L"plussim"},
+       {0x2a27, L"plussubtwo"},
+       {0x2a28, L"plustrif"},
+       {0x2647, L"pluto"},
+       {0xb1, L"pm"},
+       {0x2a15, L"pointnt"},
+       {0x3012, L"postalmark"},
+       {0x227a, L"prec"},
+       {0x2ab7, L"precapprox"},
+       {0x227c, L"preccurlyeq"},
+       {0x2aaf, L"preceq"},
+       {0x2ab3, L"preceqq"},
+       {0x2ab9, L"precnapprox"},
+       {0x2ab1, L"precneq"},
+       {0x2ab5, L"precneqq"},
+       {0x22e8, L"precnsim"},
+       {0x227e, L"precsim"},
+       {0x2032, L"prime"},
+       {0x220f, L"prod"},
+       {0x232e, L"profalar"},
+       {0x2312, L"profline"},
+       {0x2313, L"profsurf"},
+       {0x221d, L"propto"},
+       {0x22b0, L"prurel"},
+       {0x3c8, L"psi"},
+       {0x27d3, L"pullback"},
+       {0x27d4, L"pushout"},
+       {0x2057, L"qprime"},
+       {0x2669, L"quarternote"},
+       {0x225f, L"questeq"},
+       {0x201e, L"quotdblbase"},
+       {0x201f, L"quotdblright"},
+       {0x27, L"quote"},
+       {0x201a, L"quotsinglbase"},
+       {0x201b, L"quotsinglright"},
+       {0x27eb, L"rAngle"},
+       {0x2984, L"rBrace"},
+       {0x27e7, L"rBrack"},
+       {0x2986, L"rParen"},
+       {0x27e9, L"rangle"},
+       {0x2992, L"rangledot"},
+       {0x237c, L"rangledownzigzagarrow"},
+       {0x2bc, L"rasp"},
+       {0x27c6, L"rbag"},
+       {0x2998, L"rblkbrbrak"},
+       {0x7d, L"rbrace"},
+       {0x23ad, L"rbracelend"},
+       {0x23ac, L"rbracemid"},
+       {0x23ab, L"rbraceuend"},
+       {0x5d, L"rbrack"},
+       {0x23a5, L"rbrackextender"},
+       {0x23a6, L"rbracklend"},
+       {0x298e, L"rbracklrtick"},
+       {0x298c, L"rbrackubar"},
+       {0x23a4, L"rbrackuend"},
+       {0x2990, L"rbrackurtick"},
+       {0x2773, L"rbrbrak"},
+       {0x2309, L"rceil"},
+       {0x29fd, L"rcurvyangle"},
+       {0x292b, L"rdiagovfdiag"},
+       {0x2930, L"rdiagovsearrow"},
+       {0x2315, L"recorder"},
+       {0x29a3, L"revangle"},
+       {0x29a5, L"revangleubar"},
+       {0x29b0, L"revemptyset"},
+       {0x2aee, L"revnmid"},
+       {0x29d2, L"rfbowtie"},
+       {0x230b, L"rfloor"},
+       {0x29d5, L"rftimes"},
+       {0x22b3, L"rhd"},
+       {0x3c1, L"rho"},
+       {0x2b4c, L"righarrowbsimilar"},
+       {0x221f, L"rightangle"},
+       {0x299d, L"rightanglemdot"},
+       {0x299c, L"rightanglesqr"},
+       {0x2192, L"rightarrow"},
+       {0x2975, L"rightarrowapprox"},
+       {0x2b48, L"rightarrowbackapprox"},
+       {0x21e5, L"rightarrowbar"},
+       {0x291e, L"rightarrowdiamond"},
+       {0x2b43, L"rightarrowgtr"},
+       {0x27f4, L"rightarrowonoplus"},
+       {0x2945, L"rightarrowplus"},
+       {0x2942, L"rightarrowshortleftarrow"},
+       {0x2974, L"rightarrowsimilar"},
+       {0x2b44, L"rightarrowsupset"},
+       {0x21a3, L"rightarrowtail"},
+       {0x21fe, L"rightarrowtriangle"},
+       {0x2947, L"rightarrowx"},
+       {0x290d, L"rightbkarrow"},
+       {0x2933, L"rightcurvedarrow"},
+       {0x21e2, L"rightdasharrow"},
+       {0x291c, L"rightdbltail"},
+       {0x2911, L"rightdotarrow"},
+       {0x2937, L"rightdowncurvedarrow"},
+       {0x297d, L"rightfishtail"},
+       {0x21c1, L"rightharpoondown"},
+       {0x2957, L"rightharpoondownbar"},
+       {0x2964, L"rightharpoonsupdown"},
+       {0x21c0, L"rightharpoonup"},
+       {0x2953, L"rightharpoonupbar"},
+       {0x296c, L"rightharpoonupdash"},
+       {0x2970, L"rightimply"},
+       {0x21c4, L"rightleftarrows"},
+       {0x21cc, L"rightleftharpoons"},
+       {0x2969, L"rightleftharpoonsdown"},
+       {0x2968, L"rightleftharpoonsup"},
+       {0x263d, L"rightmoon"},
+       {0x27d6, L"rightouterjoin"},
+       {0x2b54, L"rightpentagon"},
+       {0x2b53, L"rightpentagonblack"},
+       {0x21c9, L"rightrightarrows"},
+       {0x219d, L"rightsquigarrow"},
+       {0x21dd, L"rightsquigarrow"},
+       {0x291a, L"righttail"},
+       {0x21f6, L"rightthreearrows"},
+       {0x22cc, L"rightthreetimes"},
+       {0x21e8, L"rightwhitearrow"},
+       {0x2a22, L"ringplus"},
+       {0x2253, L"risingdotseq"},
+       {0x23b1, L"rmoustache"},
+       {0x239f, L"rparenextender"},
+       {0x2994, L"rparengtr"},
+       {0x23a0, L"rparenlend"},
+       {0x239e, L"rparenuend"},
+       {0x2a12, L"rppolint"},
+       {0x2019, L"rq"},
+       {0x298a, L"rrangle"},
+       {0x2988, L"rrparenthesis"},
+       {0x29f7, L"rsolbar"},
+       {0x2ace, L"rsqhook"},
+       {0x2a65, L"rsub"},
+       {0x22ca, L"rtimes"},
+       {0x29ce, L"rtriltri"},
+       {0x29f4, L"ruledelayed"},
+       {0x23b9, L"rvboxline"},
+       {0x29d9, L"rvzigzag"},
+       {0x3e1, L"sampi"},
+       {0x2143, L"sansLmirrored"},
+       {0x2142, L"sansLturned"},
+       {0x2644, L"saturn"},
+       {0x2702, L"scissors"},
+       {0x2a13, L"scpolint"},
+       {0x212c, L"scrB"},
+       {0x2130, L"scrE"},
+       {0x2131, L"scrF"},
+       {0x210b, L"scrH"},
+       {0x2110, L"scrI"},
+       {0x2112, L"scrL"},
+       {0x2133, L"scrM"},
+       {0x211b, L"scrR"},
+       {0x212f, L"scre"},
+       {0x210a, L"scrg"},
+       {0x2134, L"scro"},
+       {0x22b1, L"scurel"},
+       {0x2198, L"searrow"},
+       {0x292d, L"seovnearrow"},
+       {0x2216, L"setminus"},
+       {0x29f5, L"setminus"},
+       {0x266f, L"sharp"},
+       {0x2adf, L"shortdowntack"},
+       {0x2190, L"shortleftarrow"},
+       {0x2ade, L"shortlefttack"},
+       {0x2192, L"shortrightarrow"},
+       {0x2944, L"shortrightarrowleftarrow"},
+       {0x2ae0, L"shortuptack"},
+       {0x29e2, L"shuffle"},
+       {0x3c3, L"sigma"},
+       {0x3c5, L"silon"},
+       {0x3d2, L"silon"},
+       {0x223c, L"sim"},
+       {0x2243, L"simeq"},
+       {0x2aa0, L"simgE"},
+       {0x2a9e, L"simgtr"},
+       {0x2b49, L"similarleftarrow"},
+       {0x2972, L"similarrightarrow"},
+       {0x2a9f, L"simlE"},
+       {0x2a9d, L"simless"},
+       {0x2a6c, L"simminussim"},
+       {0x2246, L"simneqq"},
+       {0x2a24, L"simplus"},
+       {0x2a6b, L"simrdots"},
+       {0x223f, L"sinewave"},
+       {0x2215, L"slash"},
+       {0x25c2, L"smallblacktriangleleft"},
+       {0x25b8, L"smallblacktriangleright"},
+       {0x22c4, L"smalldiamond"},
+       {0x220a, L"smallin"},
+       {0x222b, L"smallint"},
+       {0x220d, L"smallni"},
+       {0x2216, L"smallsetminus"},
+       {0x25c3, L"smalltriangleleft"},
+       {0x25b9, L"smalltriangleright"},
+       {0x2a33, L"smashtimes"},
+       {0x2b29, L"smblkdiamond"},
+       {0x2b2a, L"smblklozenge"},
+       {0x25aa, L"smblksquare"},
+       {0x29e4, L"smeparsl"},
+       {0x2323, L"smile"},
+       {0x263a, L"smiley"},
+       {0x2aaa, L"smt"},
+       {0x2aac, L"smte"},
+       {0x2b52, L"smwhitestar"},
+       {0x25e6, L"smwhtcircle"},
+       {0x2b2b, L"smwhtlozenge"},
+       {0x25ab, L"smwhtsquare"},
+       {0x2660, L"spadesuit"},
+       {0x2222, L"sphericalangle"},
+       {0x29a1, L"sphericalangleup"},
+       {0x2293, L"sqcap"},
+       {0x2294, L"sqcup"},
+       {0x2a16, L"sqint"},
+       {0x2311, L"sqlozenge"},
+       {0x800221a, L"sqrt"},
+       {0x800221b, L"sqrt3"},
+       {0x800221c, L"sqrt4"},
+       {0x23b7, L"sqrtbottom"},
+       {0x228f, L"sqsubset"},
+       {0x2291, L"sqsubseteq"},
+       {0x22e4, L"sqsubsetneq"},
+       {0x2290, L"sqsupset"},
+       {0x2292, L"sqsupseteq"},
+       {0x22e5, L"sqsupsetneq"},
+       {0x25a9, L"squarecrossfill"},
+       {0x25a9, L"squaregrayfill"},
+       {0x25a4, L"squarehfill"},
+       {0x25a6, L"squarehvfill"},
+       {0x25e7, L"squareleftblack"},
+       {0x25e8, L"squareleftblack"},
+       {0x2b15, L"squarellblack"},
+       {0x25f1, L"squarellquad"},
+       {0x25ea, L"squarelrblack"},
+       {0x25f2, L"squarelrquad"},
+       {0x25a8, L"squareneswfill"},
+       {0x25a7, L"squarenwsefill"},
+       {0x25e9, L"squareulblack"},
+       {0x25f0, L"squareulquad"},
+       {0x2b14, L"squareurblack"},
+       {0x25f3, L"squareurquad"},
+       {0x25a5, L"squarevfill"},
+       {0x25a2, L"squoval"},
+       {0xdf, L"ss"},
+       {0x22c6, L"star"},
+       {0x225b, L"stareq"},
+       {0xa3, L"sterling"},
+       {0x3db, L"stigma"},
+       {0x23e4, L"strns"},
+       {0x2ac3, L"subedot"},
+       {0x2ac1, L"submult"},
+       {0x2979, L"subrarr"},
+       {0x2282, L"subset"},
+       {0x2ac9, L"subsetapprox"},
+       {0x27c3, L"subsetcirc"},
+       {0x2abd, L"subsetdot"},
+       {0x2286, L"subseteq"},
+       {0x2ac5, L"subseteqq"},
+       {0x228a, L"subsetneq"},
+       {0x2acb, L"subsetneqq"},
+       {0x2abf, L"subsetplus"},
+       {0x2ac7, L"subsim"},
+       {0x2ad5, L"subsub"},
+       {0x2ad3, L"subsup"},
+       {0x227b, L"succ"},
+       {0x2ab8, L"succapprox"},
+       {0x227d, L"succcurlyeq"},
+       {0x2ab0, L"succeq"},
+       {0x2ab4, L"succeqq"},
+       {0x2aba, L"succnapprox"},
+       {0x2ab2, L"succneq"},
+       {0x2ab6, L"succneqq"},
+       {0x22e9, L"succnsim"},
+       {0x227f, L"succsim"},
+       {0x2211, L"sum"},
+       {0x23b3, L"sumbottom"},
+       {0x2a0b, L"sumint"},
+       {0x23b2, L"sumtop"},
+       {0x263c, L"sun"},
+       {0x2ad8, L"supdsub"},
+       {0x2ac4, L"supedot"},
+       {0x27c9, L"suphsol"},
+       {0x2ad7, L"suphsub"},
+       {0x297b, L"suplarr"},
+       {0x2ac2, L"supmult"},
+       {0x207f, L"supn"},
+       {0x2283, L"supset"},
+       {0x2aca, L"supsetapprox"},
+       {0x27c4, L"supsetcirc"},
+       {0x2abe, L"supsetdot"},
+       {0x2287, L"supseteq"},
+       {0x2ac6, L"supseteqq"},
+       {0x228b, L"supsetneq"},
+       {0x2acc, L"supsetneqq"},
+       {0x2ac0, L"supsetplus"},
+       {0x2ac8, L"supsim"},
+       {0x2ad4, L"supsub"},
+       {0x2ad6, L"supsup"},
+       {0x221a, L"surd"},
+       {0x2199, L"swarrow"},
+       {0x2afe, L"talloblong"},
+       {0x2316, L"target"},
+       {0x3c4, L"tau"},
+       {0x2649, L"taurus"},
+       {0x1d8d, L"testhookx"},
+       {0x2051, L"textAsterisks"},
+       {0x2ca, L"textacute"},
+       {0x2d6, L"textadvanced"},
+       {0x2bf, L"textain"},
+       {0xb4, L"textasciiacute"},
+       {0x5e, L"textasciicircum"},
+       {0xa8, L"textasciidieresis"},
+       {0x60, L"textasciigrave"},
+       {0xaf, L"textasciimacron"},
+       {0x7e, L"textasciitilde"},
+       {0x204e, L"textasterisklow"},
+       {0x2036, L"textbackdprime"},
+       {0x2035, L"textbackprime"},
+       {0x2037, L"textbacktrprime"},
+       {0x25f, L"textbardotlessj"},
+       {0x284, L"textbardotlessjvar"},
+       {0x2a1, L"textbarglotstop"},
+       {0x268, L"textbari"},
+       {0x19a, L"textbarl"},
+       {0x275, L"textbaro"},
+       {0x2a2, L"textbarrevglotstop"},
+       {0x289, L"textbaru"},
+       {0x26c, L"textbeltl"},
+       {0x1ba, L"textbenttailyogh"},
+       {0x2d8, L"textbreve"},
+       {0xa6, L"textbrokenbar"},
+       {0x2022, L"textbullet"},
+       {0x298, L"textbullseye"},
+       {0xa2, L"textcent"},
+       {0x2117, L"textcircledP"},
+       {0x29a, L"textcloseepsilon"},
+       {0x277, L"textcloseomega"},
+       {0x25e, L"textcloserevepsilon"},
+       {0xa9, L"textcopyright"},
+       {0x180, L"textcrb"},
+       {0x127, L"textcrh"},
+       {0x1be, L"textcrinvglotstop"},
+       {0x19b, L"textcrlambda"},
+       {0x1bb, L"textcrtwo"},
+       {0x255, L"textctc"},
+       {0x221, L"textctd"},
+       {0x286, L"textctesh"},
+       {0x29d, L"textctj"},
+       {0x234, L"textctl"},
+       {0x235, L"textctn"},
+       {0x236, L"textctt"},
+       {0x293, L"textctyogh"},
+       {0x291, L"textctz"},
+       {0xa4, L"textcurrency"},
+       {0x2a5, L"textdctzlig"},
+       {0xb0, L"textdegree"},
+       {0x2052, L"textdiscount"},
+       {0x24, L"textdollar"},
+       {0x2d9, L"textdotaccent"},
+       {0x237, L"textdotlessj"},
+       {0x2dd, L"textdoubleacute"},
+       {0x1c2, L"textdoublebarpipe"},
+       {0x1c1, L"textdoublepipe"},
+       {0x2033, L"textdprime"},
+       {0x2c5, L"textdptr"},
+       {0x2a4, L"textdyoghlig"},
+       {0x2a3, L"textdzlig"},
+       {0x25b, L"textepsilon"},
+       {0x283, L"textesh"},
+       {0x212e, L"textestimated"},
+       {0x1c3, L"textexclam"},
+       {0xa1, L"textexclamdown"},
+       {0x27e, L"textfishhookr"},
+       {0x192, L"textflorin"},
+       {0x20a3, L"textfranc"},
+       {0x263, L"textgamma"},
+       {0x294, L"textglotstop"},
+       {0x2cb, L"textgrave"},
+       {0x2d1, L"texthalflength"},
+       {0x2be, L"texthamza"},
+       {0xa727, L"texthen"},
+       {0xa727, L"textheng"},
+       {0x1d8a, L"texthooks"},
+       {0x1d8e, L"texthookz"},
+       {0x253, L"texthtb"},
+       {0x188, L"texthtc"},
+       {0x257, L"texthtd"},
+       {0x260, L"texthtg"},
+       {0x266, L"texthth"},
+       {0x267, L"texththeng"},
+       {0x199, L"texthtk"},
+       {0x1a5, L"texthtp"},
+       {0x2a0, L"texthtq"},
+       {0x29b, L"texthtscg"},
+       {0x1ad, L"texthtt"},
+       {0x195, L"texthvlig"},
+       {0x2010, L"texthyphen"},
+       {0x296, L"textinvglotstop"},
+       {0x281, L"textinvscr"},
+       {0x269, L"textiota"},
+       {0x2d0, L"textlengthmark"},
+       {0x2d3, L"textlhalfring"},
+       {0x1d81, L"textlhookd"},
+       {0x1d84, L"textlhookk"},
+       {0x1d85, L"textlhookl"},
+       {0x1ab, L"textlhookt"},
+       {0x27f, L"textlhti"},
+       {0x20a4, L"textlira"},
+       {0x27c, L"textlonglegr"},
+       {0x2ae, L"textlongy"},
+       {0x2af, L"textlongy"},
+       {0x1aa, L"textlooptoprevesh"},
+       {0x2cf, L"textlowacute"},
+       {0x2d5, L"textlowered"},
+       {0x2ce, L"textlowgrave"},
+       {0x2cd, L"textlowmacron"},
+       {0x2c2, L"textlptr"},
+       {0x271, L"textltailm"},
+       {0x272, L"textltailn"},
+       {0x26b, L"textltilde"},
+       {0x26e, L"textlyoghlig"},
+       {0x2c9, L"textmacron"},
+       {0xb5, L"textmu"},
+       {0x2116, L"textnumero"},
+       {0x2db, L"textogonek"},
+       {0x2126, L"textohm"},
+       {0xbd, L"textonehalf"},
+       {0xbc, L"textonequarter"},
+       {0xb9, L"textonesuperior"},
+       {0x254, L"textopeno"},
+       {0xaa, L"textordfeminine"},
+       {0xba, L"textordmasculine"},
+       {0x2df, L"textovercross"},
+       {0x2125, L"textoz"},
+       {0x2031, L"textpertenthousand"},
+       {0x2030, L"textperthousand"},
+       {0x20a7, L"textpesetas"},
+       {0x278, L"textphi"},
+       {0x1c0, L"textpipe"},
+       {0x2032, L"textprime"},
+       {0x2c8, L"textprimstress"},
+       {0x2057, L"textqprime"},
+       {0xbf, L"textquestiondown"},
+       {0x22, L"textquotedbl"},
+       {0x201c, L"textquotedblleft"},
+       {0x201d, L"textquotedblright"},
+       {0x2d4, L"textraised"},
+       {0x2c0, L"textraiseglotstop"},
+       {0x2c1, L"textraiserevglotstop"},
+       {0x264, L"textramshorns"},
+       {0x211e, L"textrecipe"},
+       {0x203b, L"textreferencemark"},
+       {0xae, L"textregistered"},
+       {0x2d7, L"textretracted"},
+       {0x258, L"textreve"},
+       {0x25c, L"textrevepsilon"},
+       {0x295, L"textrevglotstop"},
+       {0x2d2, L"textrhalfring"},
+       {0x25d, L"textrhookrevepsilon"},
+       {0x25a, L"textrhookschwa"},
+       {0x2de, L"textrhoticity"},
+       {0x2da, L"textringaccent"},
+       {0x2c3, L"textrptr"},
+       {0x256, L"textrtaild"},
+       {0x26d, L"textrtaill"},
+       {0x273, L"textrtailn"},
+       {0x27d, L"textrtailr"},
+       {0x282, L"textrtails"},
+       {0x288, L"textrtailt"},
+       {0x290, L"textrtailz"},
+       {0x1d00, L"textsca"},
+       {0x299, L"textscb"},
+       {0x1d07, L"textsce"},
+       {0x262, L"textscg"},
+       {0x29c, L"textsch"},
+       {0x259, L"textschwa"},
+       {0x26a, L"textsci"},
+       {0x29f, L"textscl"},
+       {0x274, L"textscn"},
+       {0x276, L"textscoelig"},
+       {0x280, L"textscr"},
+       {0x251, L"textscripta"},
+       {0x261, L"textscriptg"},
+       {0x28b, L"textscriptv"},
+       {0x1d1c, L"textscu"},
+       {0x28f, L"textscy"},
+       {0x2cc, L"textsecstress"},
+       {0x204f, L"textsemicolonreversed"},
+       {0x3a5, L"textsilon"},
+       {0x2dc, L"textsmalltilde"},
+       {0x297, L"textstretchcvar"},
+       {0x77, L"textsubw"},
+       {0x2b0, L"textsuph"},
+       {0x2b1, L"textsuphth"},
+       {0x2b6, L"textsupinvscr"},
+       {0x2b2, L"textsupj"},
+       {0x2b3, L"textsupr"},
+       {0x2b4, L"textsupturnr"},
+       {0x2b5, L"textsupturnrrtail"},
+       {0x2b7, L"textsupw"},
+       {0x2b8, L"textsupy"},
+       {0x2a7, L"texttctctlig"},
+       {0x2a8, L"texttctctlig"},
+       {0xbe, L"textthreequarters"},
+       {0xb3, L"textthreesuperior"},
+       {0x2122, L"texttrademark"},
+       {0x2034, L"texttrprime"},
+       {0x2a6, L"texttslig"},
+       {0x250, L"textturna"},
+       {0x2bb, L"textturncomma"},
+       {0x265, L"textturnh"},
+       {0x29e, L"textturnk"},
+       {0x27a, L"textturnlonglegr"},
+       {0x26f, L"textturnm"},
+       {0x270, L"textturnmrleg"},
+       {0x279, L"textturnr"},
+       {0x27b, L"textturnrrtail"},
+       {0x252, L"textturnscripta"},
+       {0x287, L"textturnt"},
+       {0x28c, L"textturnv"},
+       {0x28d, L"textturnw"},
+       {0x28e, L"textturny"},
+       {0xb2, L"texttwosuperior"},
+       {0x28a, L"textupsilon"},
+       {0x2c4, L"textuptr"},
+       {0x285, L"textvibyi"},
+       {0x2423, L"textvisiblespace"},
+       {0x292, L"textyogh"},
+       {0xfe, L"th"},
+       {0x2234, L"therefore"},
+       {0x29e7, L"thermod"},
+       {0x3b8, L"theta"},
+       {0x2248, L"thickapprox"},
+       {0x223c, L"thicksim"},
+       {0x27c0, L"threedangle"},
+       {0x2af6, L"threedotcolon"},
+       {0x2040, L"tieconcat"},
+       {0x29dd, L"tieinfty"},
+       {0xd7, L"times"},
+       {0x2a31, L"timesbar"},
+       {0x29ff, L"tminus"},
+       {0x2192, L"to"},
+       {0x2928, L"toea"},
+       {0x2927, L"tona"},
+       {0x2e5, L"tonebarextrahigh"},
+       {0x2e9, L"tonebarextralow"},
+       {0x2e6, L"tonebarhigh"},
+       {0x2e8, L"tonebarlow"},
+       {0x2e7, L"tonebarmid"},
+       {0x22a4, L"top"},
+       {0x2336, L"topbot"},
+       {0x2af1, L"topcir"},
+       {0x2ada, L"topfork"},
+       {0x25e0, L"topsemicircle"},
+       {0x2929, L"tosa"},
+       {0x292a, L"towa"},
+       {0x29fe, L"tplus"},
+       {0x23e2, L"trapezium"},
+       {0x25ec, L"trianglecdot"},
+       {0x25bf, L"triangledown"},
+       {0x26a0, L"triangleexclam"},
+       {0x25c1, L"triangleleft"},
+       {0x25ed, L"triangleleftblack"},
+       {0x22b4, L"trianglelefteq"},
+       {0x2a3a, L"triangleminus"},
+       {0x29ca, L"triangleodot"},
+       {0x2a39, L"triangleplus"},
+       {0x225c, L"triangleq"},
+       {0x25b7, L"triangleright"},
+       {0x25ee, L"trianglerightblack"},
+       {0x22b5, L"trianglerighteq"},
+       {0x29cc, L"triangles"},
+       {0x29cd, L"triangleserifs"},
+       {0x2a3b, L"triangletimes"},
+       {0x29cb, L"triangleubar"},
+       {0x29fb, L"tripleplus"},
+       {0x2034, L"trprime"},
+       {0x29a2, L"turnangle"},
+       {0x2129, L"turnediota"},
+       {0x2319, L"turnednot"},
+       {0x2a4b, L"twocaps"},
+       {0x2a4a, L"twocups"},
+       {0x21a1, L"twoheaddownarrow"},
+       {0x219e, L"twoheadleftarrow"},
+       {0x2b3b, L"twoheadleftarrowtail"},
+       {0x2b37, L"twoheadleftdbkarrow"},
+       {0x2b36, L"twoheadmapsfrom"},
+       {0x2905, L"twoheadmapsto"},
+       {0x21a0, L"twoheadrightarrow"},
+       {0x2916, L"twoheadrightarrowtail"},
+       {0x219f, L"twoheaduparrow"},
+       {0x2949, L"twoheaduparrowcircle"},
+       {0x2017, L"twolowline"},
+       {0x266b, L"twonotes"},
+       {0x2982, L"typecolon"},
+       {0x23e1, L"ubrbrak"},
+       {0x1b0, L"uhorn"},
+       {0x25dc, L"ularc"},
+       {0x25e4, L"ulblacktriangle"},
+       {0x231c, L"ulcorner"},
+       {0x230f, L"ulcrop"},
+       {0x25f8, L"ultriangle"},
+       {0x2a41, L"uminus"},
+       {0x23df, L"underbrace"},
+       {0x23b5, L"underbracket"},
+       {0x23dd, L"underparen"},
+       {0x22b4, L"unlhd"},
+       {0x22b5, L"unrhd"},
+       {0x214b, L"upand"},
+       {0x2191, L"uparrow"},
+       {0x2909, L"uparrowbarred"},
+       {0x29bd, L"uparrowoncircle"},
+       {0x21e2, L"updasharrow"},
+       {0x2195, L"updownarrow"},
+       {0x21a8, L"updownarrowbar"},
+       {0x21c5, L"updownarrows"},
+       {0x2951, L"updownharpoonleftleft"},
+       {0x294d, L"updownharpoonleftright"},
+       {0x294c, L"updownharpoonrightleft"},
+       {0x294f, L"updownharpoonrightright"},
+       {0x296e, L"updownharpoonsleftright"},
+       {0x297e, L"upfishtail"},
+       {0x21bf, L"upharpoonleft"},
+       {0x2960, L"upharpoonleftbar"},
+       {0x21be, L"upharpoonright"},
+       {0x295c, L"upharpoonrightbar"},
+       {0x2963, L"upharpoonsleftright"},
+       {0x27d2, L"upin"},
+       {0x2a1b, L"upint"},
+       {0x228e, L"uplus"},
+       {0x2934, L"uprightcurvearrow"},
+       {0x2127, L"upsilon"},
+       {0x21c8, L"upuparrows"},
+       {0x21e7, L"upwhitearrow"},
+       {0x25dd, L"urarc"},
+       {0x25e5, L"urblacktriangle"},
+       {0x231d, L"urcorner"},
+       {0x230e, L"urcrop"},
+       {0x25f9, L"urtriangle"},
+       {0x2c7, L"v"},
+       {0x2ae8, L"vBar"},
+       {0x2ae9, L"vBarv"},
+       {0x22a8, L"vDash"},
+       {0x2ae2, L"vDdash"},
+       {0x3f4, L"varTheta"},
+       {0x2ae6, L"varVdash"},
+       {0x2305, L"varbarwedge"},
+       {0x3d0, L"varbeta"},
+       {0x2667, L"varclubsuit"},
+       {0x2666, L"vardiamondsuit"},
+       {0x2306, L"vardoublebarwedge"},
+       {0x3b5, L"varepsilon"},
+       {0x2665, L"varheartsuit"},
+       {0x2b21, L"varhexagon"},
+       {0x2b22, L"varhexagonblack"},
+       {0x232c, L"varhexagonlrbonds"},
+       {0x2208, L"varin"},
+       {0x22f6, L"varisinobar"},
+       {0x22f3, L"varisins"},
+       {0x3f0, L"varkappa"},
+       {0x22bf, L"varlrtriangle"},
+       {0x220b, L"varni"},
+       {0x22fd, L"varniobar"},
+       {0x22fb, L"varnis"},
+       {0x2205, L"varnothing"},
+       {0x2232, L"varointclockwise"},
+       {0x3c6, L"varphi"},
+       {0x3d6, L"varpi"},
+       {0x221d, L"varpropto"},
+       {0x3f1, L"varrho"},
+       {0x23d0, L"varrowextender"},
+       {0x3c2, L"varsigma"},
+       {0x2664, L"varspadesuit"},
+       {0x2736, L"varstar"},
+       {0x3d1, L"vartheta"},
+       {0x25b5, L"vartriangle"},
+       {0x22b2, L"vartriangleleft"},
+       {0x22b3, L"vartriangleright"},
+       {0x2a61, L"varveebar"},
+       {0x23aa, L"vbraceextender"},
+       {0x29d0, L"vbrtri"},
+       {0x22a2, L"vdash"},
+       {0x22ee, L"vdots"},
+       {0x2a2f, L"vectimes"},
+       {0x2228, L"vee"},
+       {0x22bb, L"veebar"},
+       {0x27c7, L"veedot"},
+       {0x2a63, L"veedoublebar"},
+       {0x225a, L"veeeq"},
+       {0x2a5b, L"veemidvert"},
+       {0x2a52, L"veeodot"},
+       {0x2a56, L"veeonvee"},
+       {0x2a59, L"veeonwedge"},
+       {0x7c, L"vert"},
+       {0x2317, L"viewdata"},
+       {0x27dd, L"vlongdash"},
+       {0x25af, L"vrectangle"},
+       {0x25ae, L"vrectangleblack"},
+       {0x2b1d, L"vysmlblksquare"},
+       {0x2b1e, L"vysmlwhtsquare"},
+       {0x299a, L"vzigzag"},
+       {0x231a, L"watchicon"},
+       {0x2227, L"wedge"},
+       {0x2a5f, L"wedgebar"},
+       {0x27d1, L"wedgedot"},
+       {0x2a60, L"wedgedoublebar"},
+       {0x2a5a, L"wedgemidvert"},
+       {0x2a51, L"wedgeodot"},
+       {0x2a55, L"wedgeonwedge"},
+       {0x2259, L"wedgeq"},
+       {0x21ea, L"whitearrowupfrombar"},
+       {0x27c1, L"whiteinwhitetriangle"},
+       {0x25c5, L"whitepointerleft"},
+       {0x25bb, L"whitepointerright"},
+       {0x27e4, L"whitesquaretickleft"},
+       {0x27e5, L"whitesquaretickright"},
+       {0x2b2d, L"whthorzoval"},
+       {0x2b2f, L"whtvertoval"},
+       {0x29a6, L"wideangledown"},
+       {0x29a7, L"wideangleup"},
+       {0x2118, L"wp"},
+       {0x2240, L"wr"},
+       {0x29f9, L"xbsol"},
+       {0x3be, L"xi"},
+       {0x29f8, L"xsol"},
+       {0xa5, L"yen"},
+       {0x3b6, L"zeta"},
+       {0x2a20, L"zpipe"},
+{0, L""}};
+//-----------------------------------------------------------------------------
diff --git a/src/tex_table.cpp b/src/tex_table.cpp
deleted file mode 100644 (file)
index e8297d9..0000000
+++ /dev/null
@@ -1,1883 +0,0 @@
-/***************************************************************************
- * tex_table.cpp is part of Math Graphic Library
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU Library General Public License as       *
- *   published by the Free Software Foundation; either version 3 of the    *
- *   License, or (at your option) any later version.                       *
- *                                                                         *
- *   This program is distributed in the hope that it will be useful,       *
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
- *   GNU General Public License for more details.                          *
- *                                                                         *
- *   You should have received a copy of the GNU Library General Public     *
- *   License along with this program; if not, write to the                 *
- *   Free Software Foundation, Inc.,                                       *
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
- ***************************************************************************/
-#include "mgl2/font.h"
-
-/// Table of LaTeX symbols and its UTF8 codes. This array MUST BE sorted!!!
-MGL_EXPORT long mgl_tex_num=1881-24;
-MGL_EXPORT mglTeXsymb mgl_tex_symb[] = {
-       {0x23, L"#"},
-       {0x25, L"%"},
-       {0x26, L"&"},
-       {0xc5, L"AA"},
-       {0xc6, L"AE"},
-       {0x2370, L"APLboxquestion"},
-       {0x2353, L"APLboxupcaret"},
-       {0x2340, L"APLnotbackslash"},
-       {0x233f, L"APLnotslash"},
-       {0x391, L"Alpha"},
-       {0x26, L"And"},
-       {0x212b, L"Angstrom"},
-       {0x2ae7, L"Barv"},
-       {0x2102, L"BbbC"},
-       {0x213e, L"BbbGamma"},
-       {0x210d, L"BbbH"},
-       {0x2115, L"BbbN"},
-       {0x2119, L"BbbP"},
-       {0x213f, L"BbbPi"},
-       {0x211a, L"BbbQ"},
-       {0x211d, L"BbbR"},
-       {0x2124, L"BbbZ"},
-       {0x213d, L"Bbbgamma"},
-       {0x213c, L"Bbbpi"},
-       {0x2140, L"Bbbsum"},
-       {0x392, L"Beta"},
-       {0x224e, L"Bumpeq"},
-       {0x22d2, L"Cap"},
-       {0x3a7, L"Chi"},
-       {0x2237, L"Colon"},
-       {0x2a74, L"Coloneq"},
-       {0x22d3, L"Cup"},
-       {0x27f1, L"DDownarrow"},
-       {0xd0, L"DH"},
-       {0x110, L"DJ"},
-       {0x2ae5, L"DashV"},
-       {0x27da, L"DashVDash"},
-       {0x2ae4, L"Dashv"},
-       {0x290b, L"Ddownarrow"},
-       {0x394, L"Delta"},
-       {0x3dc, L"Digamma"},
-       {0x2251, L"Doteq"},
-       {0x21d3, L"Downarrow"},
-       {0x395, L"Epsilon"},
-       {0x2263, L"Equiv"},
-       {0x397, L"Eta"},
-       {0x2107, L"Eulerconst"},
-       {0x203c, L"Exclam"},
-       {0x2132, L"Finv"},
-       {0x2141, L"Game"},
-       {0x393, L"Gamma"},
-       {0x2aa2, L"Gt"},
-       {0x26a5, L"Hermaphrodite"},
-       {0x2111, L"Im"},
-       {0x399, L"Iota"},
-       {0x39a, L"Kappa"},
-       {0x3de, L"Koppa"},
-       {0x141, L"L"},
-       {0x2b45, L"LLeftarrow"},
-       {0x39b, L"Lambda"},
-       {0x27ec, L"Lbrbrak"},
-       {0x21b2, L"Ldsh"},
-       {0x21d0, L"Leftarrow"},
-       {0x21d4, L"Leftrightarrow"},
-       {0x21da, L"Lleftarrow"},
-       {0x27f8, L"Longleftarrow"},
-       {0x27fa, L"Longleftrightarrow"},
-       {0x27fd, L"Longmapsfrom"},
-       {0x27fe, L"Longmapsto"},
-       {0x27f9, L"Longrightarrow"},
-       {0x2995, L"Lparengtr"},
-       {0x21b0, L"Lsh"},
-       {0x2aa1, L"Lt"},
-       {0x29da, L"Lvzigzag"},
-       {0x2906, L"Mapsfrom"},
-       {0x2907, L"Mapsto"},
-       {0x39c, L"Mu"},
-       {0x14a, L"NG"},
-       {0x21d7, L"Nearrow"},
-       {0x2aec, L"Not"},
-       {0x39d, L"Nu"},
-       {0x21d6, L"Nwarrow"},
-       {0xd8, L"O"},
-       {0x152, L"OE"},
-       {0x1a0, L"Ohorn"},
-       {0x3a9, L"Omega"},
-       {0x39f, L"Omicron"},
-       {0x2a37, L"Otimes"},
-       {0xb6, L"P"},
-       {0x3a6, L"Phi"},
-       {0x3a0, L"Pi"},
-       {0x210e, L"Planckconst"},
-       {0x2abb, L"Prec"},
-       {0x214a, L"PropertyLine"},
-       {0x3a8, L"Psi"},
-       {0x220e, L"QED"},
-       {0x2047, L"Question"},
-       {0x2b46, L"RRightarrow"},
-       {0x27ed, L"Rbrbrak"},
-       {0x21b3, L"Rdsh"},
-       {0x211c, L"Re"},
-       {0x3a1, L"Rho"},
-       {0x21d2, L"Rightarrow"},
-       {0x2996, L"Rparenless"},
-       {0x21db, L"Rrightarrow"},
-       {0x21b1, L"Rsh"},
-       {0x29db, L"Rvzigzag"},
-       {0xa7, L"S"},
-       {0x2abc, L"Sc"},
-       {0x21d8, L"Searrow"},
-       {0x3a3, L"Sigma"},
-       {0x2a4e, L"Sqcap"},
-       {0x2a4f, L"Sqcup"},
-       {0x3da, L"Stigma"},
-       {0x22d0, L"Subset"},
-       {0x22d1, L"Supset"},
-       {0x21d9, L"Swarrow"},
-       {0xde, L"TH"},
-       {0x3a4, L"Tau"},
-       {0x398, L"Theta"},
-       {0x27f0, L"UUparrow"},
-       {0x1af, L"Uhorn"},
-       {0x21d1, L"Uparrow"},
-       {0x21d5, L"Updownarrow"},
-       {0x290a, L"Uuparrow"},
-       {0x22ab, L"VDash"},
-       {0x2aeb, L"Vbar"},
-       {0x22a9, L"Vdash"},
-       {0x2a54, L"Vee"},
-       {0x2016, L"Vert"},
-       {0x22aa, L"Vvdash"},
-       {0x2980, L"Vvert"},
-       {0x2a53, L"Wedge"},
-       {0x2612, L"XBox"},
-       {0x39e, L"Xi"},
-       {0x2144, L"Yup"},
-       {0x1b5, L"Zbar"},
-       {0x396, L"Zeta"},
-       {0x5e, L"^"},
-       {0xe5, L"aa"},
-       {0x223e, L"ac"},
-       {0x23e6, L"accurrent"},
-       {0x267e, L"acidfree"},
-       {0x2940, L"acwcirclearrow"},
-       {0x27f2, L"acwgapcirclearrow"},
-       {0x2939, L"acwleftarcarrow"},
-       {0x21ba, L"acwopencirclearrow"},
-       {0x293a, L"acwoverarcarrow"},
-       {0x293b, L"acwundercurvearrow"},
-       {0x22f0, L"adots"},
-       {0xe6, L"ae"},
-       {0x2135, L"aleph"},
-       {0x3b1, L"alpha"},
-//     {0x2210, L"amalg"},
-       {0x2a3f, L"amalg"},
-       {0x299f, L"angdnr"},
-       {0x2220, L"angle"},
-       {0x299e, L"angles"},
-       {0x29a4, L"angleubar"},
-       {0x2248, L"approx"},
-       {0x224a, L"approxeq"},
-       {0x2a70, L"approxeqq"},
-       {0x224b, L"approxident"},
-       {0x2258, L"arceq"},
-       {0x2648, L"aries"},
-       {0x22a6, L"assert"},
-       {0x2217, L"ast"},
-       {0x2a6e, L"asteq"},
-       {0x2609, L"astrosun"},
-       {0x224d, L"asymp"},
-       {0x2a11, L"awint"},
-       {0x2aed, L"bNot"},
-       {0x224c, L"backcong"},
-       {0x2036, L"backdprime"},
-       {0x3f6, L"backepsilon"},
-       {0x2035, L"backprime"},
-       {0x223d, L"backsim"},
-       {0x22cd, L"backsimeq"},
-       {0x5c, L"backslash"},
-       {0x2037, L"backtrprime"},
-       {0x22ff, L"bagmember"},
-       {0x2aea, L"barV"},
-       {0x2a43, L"barcap"},
-       {0x2a42, L"barcup"},
-       {0x2961, L"bardownharpoonleft"},
-       {0x295d, L"bardownharpoonright"},
-       {0x21e4, L"barleftarrow"},
-       {0x21b9, L"barleftarrowrightarrowbar"},
-       {0x2956, L"barleftharpoondown"},
-       {0x2952, L"barleftharpoonup"},
-       {0x21b8, L"barovernorthwestarrow"},
-       {0x2920, L"barrightarrowdiamond"},
-       {0x295f, L"barrightharpoondown"},
-       {0x295b, L"barrightharpoonup"},
-       {0x2912, L"baruparrow"},
-       {0x2958, L"barupharpoonleft"},
-       {0x2954, L"barupharpoonright"},
-       {0x22bd, L"barvee"},
-       {0x22bc, L"barwedge"},
-       {0x23b6, L"bbrktbrk"},
-       {0x2550, L"bdHrule"},
-       {0x2551, L"bdVrule"},
-       {0x256c, L"bdbVbH"},
-       {0x256b, L"bdbVbh"},
-       {0x2563, L"bdbVlH"},
-       {0x2562, L"bdbVlh"},
-       {0x2560, L"bdbVrH"},
-       {0x255f, L"bdbVrh"},
-       {0x256a, L"bdbvbH"},
-       {0x253c, L"bdbvbh"},
-       {0x2561, L"bdbvlH"},
-       {0x2524, L"bdbvlh"},
-       {0x255e, L"bdbvrH"},
-       {0x251c, L"bdbvrh"},
-       {0x2566, L"bddVbH"},
-       {0x2565, L"bddVbh"},
-       {0x2557, L"bddVlH"},
-       {0x2556, L"bddVlh"},
-       {0x2554, L"bddVrH"},
-       {0x2553, L"bddVrh"},
-       {0x2564, L"bddvbH"},
-       {0x252c, L"bddvbh"},
-       {0x2555, L"bddvlH"},
-       {0x2510, L"bddvlh"},
-       {0x2552, L"bddvrH"},
-       {0x250c, L"bddvrh"},
-       {0x2500, L"bdhrule"},
-       {0x2571, L"bdnesw"},
-       {0x2572, L"bdnwse"},
-       {0x2508, L"bdquadhdash"},
-       {0x250a, L"bdquadvdash"},
-       {0x2506, L"bdtriplevdash"},
-       {0x2569, L"bduVbH"},
-       {0x2568, L"bduVbh"},
-       {0x255d, L"bduVlH"},
-       {0x255c, L"bduVlh"},
-       {0x255a, L"bduVrH"},
-       {0x2559, L"bduVrh"},
-       {0x2567, L"bduvbH"},
-       {0x2534, L"bduvbh"},
-       {0x255b, L"bduvlH"},
-       {0x2518, L"bduvlh"},
-       {0x2558, L"bduvrH"},
-       {0x2514, L"bduvrh"},
-       {0x2502, L"bdvrule"},
-       {0x2235, L"because"},
-       {0x23e3, L"benzenr"},
-       {0x3b2, L"beta"},
-       {0x2136, L"beth"},
-       {0x226c, L"between"},
-       {0x25bc, L"bigblacktriangledown"},
-       {0x25b2, L"bigblacktriangleup"},
-       {0x27d8, L"bigbot"},
-       {0x22c2, L"bigcap"},
-       {0x22c3, L"bigcup"},
-       {0x2a57, L"bigslopedvee"},
-       {0x2a58, L"bigslopedwedge"},
-       {0x2605, L"bigstar"},
-       {0x27d9, L"bigtop"},
-       {0x25bd, L"bigtriangledown"},
-       {0x25b3, L"bigtriangleup"},
-       {0x22c1, L"bigvee"},
-       {0x22c0, L"bigwedge"},
-       {0x2606, L"bigwhitestar"},
-       {0x29ed, L"blackcircledownarrow"},
-       {0x2688, L"blackcircledrightdot"},
-       {0x2791, L"blackcircledsanseight"},
-       {0x278e, L"blackcircledsansfive"},
-       {0x278d, L"blackcircledsansfour"},
-       {0x2792, L"blackcircledsansnine"},
-       {0x278a, L"blackcircledsansone"},
-       {0x2790, L"blackcircledsansseven"},
-       {0x278f, L"blackcircledsanssix"},
-       {0x2793, L"blackcircledsansten"},
-       {0x278c, L"blackcircledsansthree"},
-       {0x278b, L"blackcircledsanstwo"},
-       {0x2689, L"blackcircledtwodots"},
-       {0x25d5, L"blackcircleulquadwhite"},
-       {0x29ea, L"blackdiamonddownarrow"},
-       {0x29d7, L"blackhourglass"},
-       {0x25c8, L"blackinwhitediamond"},
-       {0x25a3, L"blackinwhitesquare"},
-       {0x25d6, L"blacklefthalfcircle"},
-       {0x25c4, L"blackpointerleft"},
-       {0x25ba, L"blackpointerright"},
-       {0x25d7, L"blackrighthalfcircle"},
-       {0x263b, L"blacksmiley"},
-       {0x25b4, L"blacktriangle"},
-       {0x25be, L"blacktriangledown"},
-       {0x25c0, L"blacktriangleleft"},
-       {0x25b6, L"blacktriangleright"},
-       {0x2b2c, L"blkhorzoval"},
-       {0x2b2e, L"blkvertoval"},
-       {0x2588, L"blockfull"},
-       {0x2592, L"blockhalfshaded"},
-       {0x258c, L"blocklefthalf"},
-       {0x2584, L"blocklowhalf"},
-       {0x2591, L"blockqtrshaded"},
-       {0x2590, L"blockrighthalf"},
-       {0x2593, L"blockthreeqtrshaded"},
-       {0x2580, L"blockuphalf"},
-       {0x22a5, L"bot"},
-       {0x25e1, L"botsemicircle"},
-       {0x22c8, L"bowtie"},
-       {0x25fb, L"box"},
-       {0x29c6, L"boxast"},
-       {0x25eb, L"boxbar"},
-       {0x29c8, L"boxbox"},
-       {0x29c5, L"boxbslash"},
-       {0x29c7, L"boxcircle"},
-       {0x29c4, L"boxdiag"},
-       {0x22a1, L"boxdot"},
-       {0x229f, L"boxminus"},
-       {0x29c9, L"boxonbox"},
-       {0x229e, L"boxplus"},
-       {0x22a0, L"boxtimes"},
-       {0x2b41, L"bsimilarleftarrow"},
-       {0x2b47, L"bsimilarrightarrow"},
-       {0x27c8, L"bsolhsub"},
-       {0x2a32, L"btimes"},
-       {0x2219, L"bullet"},
-       {0x25ce, L"bullseye"},
-       {0x224f, L"bumpeq"},
-       {0x2aae, L"bumpeqq"},
-       {0x212c, L"calB"},
-       {0x2130, L"calE"},
-       {0x2131, L"calF"},
-       {0x210b, L"calH"},
-       {0x2110, L"calI"},
-       {0x2112, L"calL"},
-       {0x2133, L"calM"},
-       {0x211b, L"calR"},
-       {0x2229, L"cap"},
-       {0x2a40, L"capdot"},
-       {0x2a44, L"capwedge"},
-       {0x2038, L"caretinsert"},
-       {0x23ce, L"carreturn"},
-       {0x21b5, L"carriagereturn"},
-       {0x293f, L"ccwundercurvearrow"},
-       {0x22c5, L"cdot"},
-       {0xb7, L"cdotp"},
-       {0x22ef, L"cdots"},
-       {0x2ba, L"cdprime"},
-       {0x2713, L"checkmark"},
-       {0x3c7, L"chi"},
-       {0x29c3, L"cirE"},
-       {0x27df, L"cirbot"},
-       {0x2218, L"circ"},
-       {0x2257, L"circeq"},
-       {0x2a10, L"circfint"},
-       {0x25d2, L"circlebottomhalfblack"},
-       {0x24b6, L"circledA"},
-       {0x24b7, L"circledB"},
-       {0x24b8, L"circledC"},
-       {0x24b9, L"circledD"},
-       {0x24ba, L"circledE"},
-       {0x24bb, L"circledF"},
-       {0x24bc, L"circledG"},
-       {0x24bd, L"circledH"},
-       {0x24be, L"circledI"},
-       {0x24bf, L"circledJ"},
-       {0x24c0, L"circledK"},
-       {0x24c1, L"circledL"},
-       {0x24c2, L"circledM"},
-       {0x24c3, L"circledN"},
-       {0x24c4, L"circledO"},
-       {0x24c5, L"circledP"},
-       {0x24c6, L"circledQ"},
-       {0x24c7, L"circledR"},
-       {0x24c8, L"circledS"},
-       {0x24c9, L"circledT"},
-       {0x24ca, L"circledU"},
-       {0x24cb, L"circledV"},
-       {0x24cc, L"circledW"},
-       {0x24cd, L"circledX"},
-       {0x24ce, L"circledY"},
-       {0x24cf, L"circledZ"},
-       {0x24d0, L"circleda"},
-       {0x229b, L"circledast"},
-       {0x24d1, L"circledb"},
-       {0x29bf, L"circledbullet"},
-       {0x24d2, L"circledc"},
-       {0x229a, L"circledcirc"},
-       {0x24d3, L"circledd"},
-       {0x229d, L"circleddash"},
-       {0x24d4, L"circlede"},
-       {0x2467, L"circledeight"},
-       {0x229c, L"circledequal"},
-       {0x24d5, L"circledf"},
-       {0x2464, L"circledfive"},
-       {0x2463, L"circledfour"},
-       {0x24d6, L"circledg"},
-       {0x24d7, L"circledh"},
-       {0x24d8, L"circledi"},
-       {0x24d9, L"circledj"},
-       {0x24da, L"circledk"},
-       {0x24db, L"circledl"},
-       {0x24dc, L"circledm"},
-       {0x24dd, L"circledn"},
-       {0x2468, L"circlednine"},
-       {0x24de, L"circledo"},
-       {0x2460, L"circledone"},
-       {0x29ec, L"circledownarrow"},
-       {0x24df, L"circledp"},
-       {0x29b7, L"circledparallel"},
-       {0x24e0, L"circledq"},
-       {0x24e1, L"circledr"},
-       {0x2686, L"circledrightdot"},
-       {0x24e2, L"circleds"},
-       {0x2787, L"circledsanseight"},
-       {0x2784, L"circledsansfive"},
-       {0x2783, L"circledsansfour"},
-       {0x2788, L"circledsansnine"},
-       {0x2780, L"circledsansone"},
-       {0x2786, L"circledsansseven"},
-       {0x2785, L"circledsanssix"},
-       {0x2789, L"circledsansten"},
-       {0x2782, L"circledsansthree"},
-       {0x2781, L"circledsanstwo"},
-       {0x2466, L"circledseven"},
-       {0x2465, L"circledsix"},
-       {0x272a, L"circledstar"},
-       {0x24e3, L"circledt"},
-       {0x2462, L"circledthree"},
-       {0x2461, L"circledtwo"},
-       {0x2687, L"circledtwodots"},
-       {0x24e4, L"circledu"},
-       {0x24e5, L"circledv"},
-       {0x29b6, L"circledvert"},
-       {0x24e6, L"circledw"},
-       {0x29be, L"circledwhitebullet"},
-       {0x24e7, L"circledx"},
-       {0x24e8, L"circledy"},
-       {0x24e9, L"circledz"},
-       {0x24ea, L"circledzero"},
-       {0x29b5, L"circlehbar"},
-       {0x25d0, L"circlelefthalfblack"},
-       {0x25f5, L"circlellquad"},
-       {0x25f6, L"circlelrquad"},
-       {0x2b30, L"circleonleftarrow"},
-       {0x21f4, L"circleonrightarrow"},
-       {0x25d1, L"circlerighthalfblack"},
-       {0x25d3, L"circletophalfblack"},
-       {0x25f4, L"circleulquad"},
-       {0x25f7, L"circleurquad"},
-       {0x25d4, L"circleurquadblack"},
-       {0x25cd, L"circlevertfill"},
-       {0x2aef, L"cirmid"},
-       {0x29c2, L"cirscir"},
-       {0x2329, L"clangle"},
-       {0x2a4d, L"closedvarcap"},
-       {0x2a4c, L"closedvarcup"},
-       {0x2a50, L"closedvarcupsmashprod"},
-       {0x2050, L"closure"},
-       {0x2318, L"cloverleaf"},
-       {0x2663, L"clubsuit"},
-       {0x3a, L"colon"},
-       {0x2236, L"colon"},
-       {0x2254, L"coloneq"},
-       {0x2a29, L"commaminus"},
-       {0x2201, L"complement"},
-       {0x27e1, L"concavediamond"},
-       {0x27e2, L"concavediamondtickleft"},
-       {0x27e3, L"concavediamondtickright"},
-       {0x2245, L"cong"},
-       {0x2a6d, L"congdot"},
-       {0x2332, L"conictaper"},
-       {0x260c, L"conjunction"},
-       {0x2210, L"coprod"},
-       {0x2b9, L"cprime"},
-       {0x232a, L"crangle"},
-       {0x2acf, L"csub"},
-       {0x2ad1, L"csube"},
-       {0x2ad0, L"csup"},
-       {0x2ad2, L"csupe"},
-       {0x221b, L"cuberoot"},
-       {0x222a, L"cup"},
-       {0x228d, L"cupdot"},
-       {0x228c, L"cupleftarrow"},
-       {0x2a45, L"cupvee"},
-       {0x22de, L"curlyeqprec"},
-       {0x22df, L"curlyeqsucc"},
-       {0x22ce, L"curlyvee"},
-       {0x22cf, L"curlywedge"},
-       {0x21b6, L"curvearrowleft"},
-       {0x293d, L"curvearrowleftplus"},
-       {0x21b7, L"curvearrowright"},
-       {0x293c, L"curvearrowrightminus"},
-       {0x2941, L"cwcirclearrow"},
-       {0x27f3, L"cwgapcirclearrow"},
-       {0x21bb, L"cwopencirclearrow"},
-       {0x2938, L"cwrightarcarrow"},
-       {0x293e, L"cwundercurvearrow"},
-       {0x232d, L"cylcty"},
-       {0x2020, L"dag"},
-       {0x2020, L"dagger"},
-       {0x2138, L"daleth"},
-       {0x2621, L"danger"},
-       {0x2ae3, L"dashV"},
-       {0x27db, L"dashVdash"},
-       {0x2239, L"dashcolon"},
-       {0x296b, L"dashleftharpoondown"},
-       {0x296d, L"dashrightharpoondown"},
-       {0x22a3, L"dashv"},
-       {0x290f, L"dbkarow"},
-       {0x2021, L"ddag"},
-       {0x2021, L"ddagger"},
-       {0x22f1, L"ddots"},
-       {0x2a77, L"ddotseq"},
-       {0xb0, L"degree"},
-       {0x3b4, L"delta"},
-       {0xf0, L"dh"},
-       {0x2300, L"diameter"},
-       {0x25c7, L"diamond"},
-       {0x2b19, L"diamondbotblack"},
-       {0x27d0, L"diamondcdot"},
-       {0x291d, L"diamondleftarrow"},
-       {0x291f, L"diamondleftarrowbar"},
-       {0x2b16, L"diamondleftblack"},
-       {0x2b17, L"diamondrightblack"},
-       {0x2662, L"diamondsuit"},
-       {0x2b18, L"diamondtopblack"},
-       {0x2680, L"dicei"},
-       {0x2681, L"diceii"},
-       {0x2682, L"diceiii"},
-       {0x2683, L"diceiv"},
-       {0x2684, L"dicev"},
-       {0x2685, L"dicevi"},
-       {0x3dd, L"digamma"},
-       {0x273d, L"dingasterisk"},
-       {0x2393, L"dircurrent"},
-       {0x22f2, L"disin"},
-       {0xf7, L"div"},
-       {0x22c7, L"divideontimes"},
-       {0x111, L"dj"},
-       {0x230d, L"dlcrop"},
-       {0x2250, L"doteq"},
-       {0x2a67, L"dotequiv"},
-       {0x2238, L"dotminus"},
-       {0x2214, L"dotplus"},
-       {0x2026, L"dots"},
-       {0x2a6a, L"dotsim"},
-       {0x223a, L"dotsminusdots"},
-       {0x25cc, L"dottedcircle"},
-       {0x2b1a, L"dottedsquare"},
-       {0x2a30, L"dottimes"},
-       {0x2a62, L"doublebarvee"},
-       {0x2a5e, L"doublebarwedge"},
-       {0x29fa, L"doubleplus"},
-       {0x2193, L"downarrow"},
-       {0x2913, L"downarrowbar"},
-       {0x2908, L"downarrowbarred"},
-       {0x21e3, L"downdasharrow"},
-       {0x21ca, L"downdownarrows"},
-       {0x297f, L"downfishtail"},
-       {0x21c3, L"downharpoonleft"},
-       {0x2959, L"downharpoonleftbar"},
-       {0x21c2, L"downharpoonright"},
-       {0x2955, L"downharpoonrightbar"},
-       {0x2965, L"downharpoonsleftright"},
-       {0x2935, L"downrightcurvedarrow"},
-       {0x29e8, L"downtriangleleftblack"},
-       {0x29e9, L"downtrianglerightblack"},
-       {0x21f5, L"downuparrows"},
-       {0x296f, L"downupharpoonsleftright"},
-       {0x21e9, L"downwhitearrow"},
-       {0x21af, L"downzigzagarrow"},
-       {0x2033, L"dprime"},
-       {0x279b, L"draftingarrow"},
-       {0x2910, L"drbkarow"},
-       {0x230c, L"drcrop"},
-       {0x29f6, L"dsol"},
-       {0x2a64, L"dsub"},
-       {0x29df, L"dualmap"},
-       {0x2641, L"earth"},
-       {0x2a98, L"egsdot"},
-       {0x266a, L"eighthnote"},
-       {0x23e7, L"elinters"},
-       {0x2113, L"ell"},
-       {0x2a97, L"elsdot"},
-       {0x2014, L"emdash"},
-       {0x2205, L"emptyset"},
-       {0x29b3, L"emptysetoarr"},
-       {0x29b4, L"emptysetoarrl"},
-       {0x29b1, L"emptysetobar"},
-       {0x29b2, L"emptysetocirc"},
-       {0x2013, L"endash"},
-       {0x2025, L"enleadertwodots"},
-       {0x2709, L"envelope"},
-       {0x29e3, L"eparsl"},
-       {0x3f5, L"epsilon"},
-       {0x2256, L"eqcirc"},
-       {0x2255, L"eqcolon"},
-       {0x225d, L"eqdef"},
-       {0x2a66, L"eqdot"},
-       {0x2a75, L"eqeq"},
-       {0x2a76, L"eqeqeq"},
-       {0x22dd, L"eqgtr"},
-       {0x22dc, L"eqless"},
-       {0x2a9a, L"eqqgtr"},
-       {0x2a99, L"eqqless"},
-       {0x2a71, L"eqqplus"},
-       {0x2a73, L"eqqsim"},
-       {0x2a9c, L"eqqslantgtr"},
-       {0x2a9b, L"eqqslantless"},
-       {0x2242, L"eqsim"},
-       {0x2a96, L"eqslantgtr"},
-       {0x2a95, L"eqslantless"},
-       {0x2b40, L"equalleftarrow"},
-       {0x22d5, L"equalparallel"},
-       {0x2971, L"equalrightarrow"},
-       {0x2261, L"equiv"},
-       {0x2a78, L"equivDD"},
-       {0x2a68, L"equivVert"},
-       {0x2a69, L"equivVvert"},
-       {0x29e5, L"eqvparsl"},
-       {0x29f3, L"errbarblackcircle"},
-       {0x29f1, L"errbarblackdiamond"},
-       {0x29ef, L"errbarblacksquare"},
-       {0x29f2, L"errbarcircle"},
-       {0x29f0, L"errbardiamond"},
-       {0x29ee, L"errbarsquare"},
-       {0x3b7, L"eta"},
-       {0x20ac, L"euro"},
-       {0x2203, L"exists"},
-       {0x2252, L"fallingdotseq"},
-       {0x29d3, L"fbowtie"},
-       {0x2a3e, L"fcmp"},
-       {0x292f, L"fdiagovnearrow"},
-       {0x292c, L"fdiagovrdiag"},
-       {0x2640, L"female"},
-       {0x2012, L"figdash"},
-       {0x2a0f, L"fint"},
-       {0x25c9, L"fisheye"},
-       {0x266d, L"flat"},
-       {0x23e5, L"fltns"},
-       {0x2200, L"forall"},
-       {0x2adc, L"forks"},
-       {0x2add, L"forksnot"},
-       {0x2ad9, L"forkv"},
-       {0x221c, L"fourthroot"},
-       {0x2999, L"fourvdots"},
-       {0x215d, L"fracfiveeighths"},
-       {0x215a, L"fracfivesixths"},
-       {0x2158, L"fracfourfifths"},
-       {0x215b, L"fraconeeighth"},
-       {0x2155, L"fraconefifth"},
-       {0x2159, L"fraconesixth"},
-       {0x2153, L"fraconethird"},
-       {0x215e, L"fracseveneights"},
-       {0x2044, L"fracslash"},
-       {0x215c, L"fracthreeeighths"},
-       {0x2157, L"fracthreefifths"},
-       {0x2156, L"fractwofifths"},
-       {0x2154, L"fractwothirds"},
-       {0x212d, L"frakC"},
-       {0x210c, L"frakH"},
-       {0x2128, L"frakZ"},
-       {0x2322, L"frown"},
-       {0x2639, L"frownie"},
-       {0x27d7, L"fullouterjoin"},
-       {0x3b3, L"gamma"},
-       {0x2265, L"ge"},
-       {0x2265, L"geq"},
-       {0x2267, L"geqq"},
-       {0x2a7e, L"geqslant"},
-       {0x2aa9, L"gescc"},
-       {0x2a80, L"gesdot"},
-       {0x2a82, L"gesdoto"},
-       {0x2a84, L"gesdotol"},
-       {0x2a94, L"gesles"},
-       {0x2190, L"gets"},
-       {0x226b, L"gg"},
-       {0x22d9, L"ggg"},
-       {0x2af8, L"gggnest"},
-       {0x2137, L"gimel"},
-       {0x2a92, L"glE"},
-       {0x2aa5, L"gla"},
-       {0x29e6, L"gleichstark"},
-       {0x2aa4, L"glj"},
-       {0x2a8a, L"gnapprox"},
-       {0x2a88, L"gneq"},
-       {0x2269, L"gneqq"},
-       {0x22e7, L"gnsim"},
-       {0x3e, L"greater"},
-       {0x2a8e, L"gsime"},
-       {0x2a90, L"gsiml"},
-       {0x2aa7, L"gtcc"},
-       {0x2a7a, L"gtcir"},
-       {0x29a0, L"gtlpar"},
-       {0x2a7c, L"gtquest"},
-       {0x2a86, L"gtrapprox"},
-       {0x2978, L"gtrarr"},
-       {0x22d7, L"gtrdot"},
-       {0x22db, L"gtreqless"},
-       {0x2a8c, L"gtreqqless"},
-       {0x2277, L"gtrless"},
-       {0x2273, L"gtrsim"},
-       {0xab, L"guillemotleft"},
-       {0xbb, L"guillemotright"},
-       {0x2039, L"guilsinglleft"},
-       {0x203a, L"guilsinglright"},
-       {0x23af, L"harrowextender"},
-       {0x2a6f, L"hatapprox"},
-       {0x210f, L"hbar"},
-       {0x2661, L"heartsuit"},
-       {0x22b9, L"hermitmatrix"},
-       {0x2394, L"hexagon"},
-       {0x2b23, L"hexagonblack"},
-       {0x306e, L"hiraganano"},
-       {0x2924, L"hknearrow"},
-       {0x2923, L"hknwarrow"},
-       {0x2925, L"hksearow"},
-       {0x2926, L"hkswarow"},
-       {0x21a9, L"hookleftarrow"},
-       {0x21aa, L"hookrightarrow"},
-       {0x2015, L"horizbar"},
-       {0x29d6, L"hourglass"},
-       {0x2302, L"house"},
-       {0x25ad, L"hrectangle"},
-       {0x25ac, L"hrectangleblack"},
-       {0x210f, L"hslash"},
-       {0x2043, L"hyphenbullet"},
-       {0x3030, L"hzigzag"},
-       {0x2a0c, L"iiiint"},
-       {0x222d, L"iiint"},
-       {0x29dc, L"iinfin"},
-       {0x222c, L"iint"},
-       {0x22b7, L"imageof"},
-       {0x2208, L"in"},
-       {0x2105, L"incare"},
-       {0x2206, L"increment"},
-       {0x221e, L"infty"},
-       {0x222b, L"int"},
-       {0x2a0e, L"intBar"},
-       {0x2a0d, L"intbar"},
-       {0x2321, L"intbottom"},
-       {0x2a19, L"intcap"},
-       {0x2231, L"intclockwise"},
-       {0x2a1a, L"intcup"},
-       {0x22ba, L"intercal"},
-       {0x2af4, L"interleave"},
-       {0x23ae, L"intextender"},
-       {0x2a17, L"intlharhk"},
-       {0x2a3c, L"intprod"},
-       {0x2a3d, L"intprodr"},
-       {0x2320, L"inttop"},
-       {0x2a18, L"intx"},
-       {0x25d8, L"inversebullet"},
-       {0x25d9, L"inversewhitecircle"},
-       {0x2310, L"invnot"},
-       {0x25db, L"invwhitelowerhalfcircle"},
-       {0x25da, L"invwhiteupperhalfcircle"},
-       {0x3b9, L"iota"},
-       {0x2e0, L"ipasupgamma"},
-       {0x2e1, L"ipasupl"},
-       {0x2e4, L"ipasuprerglotstpp"},
-       {0x2e2, L"ipasups"},
-       {0x2e3, L"ipasupx"},
-       {0x2ed, L"ipaunaspirated"},
-       {0x2ec, L"ipavoicing"},
-       {0x22f9, L"isinE"},
-       {0x22f5, L"isindot"},
-       {0x22f7, L"isinobar"},
-       {0x22f4, L"isins"},
-       {0x22f8, L"isinvb"},
-       {0x2145, L"itBbbD"},
-       {0x2146, L"itBbbd"},
-       {0x2147, L"itBbbe"},
-       {0x2148, L"itBbbi"},
-       {0x2149, L"itBbbj"},
-       {0x2643, L"jupiter"},
-       {0x3ba, L"kappa"},
-       {0x223b, L"kernelcontraction"},
-       {0x3df, L"koppa"},
-       {0x142, L"l"},
-       {0x27ea, L"lAngle"},
-       {0x2983, L"lBrace"},
-       {0x27e6, L"lBrack"},
-       {0x2985, L"lParen"},
-       {0x3bb, L"lambda"},
-       {0x19b, L"lambdabar"},
-       {0x27e8, L"langle"},
-       {0x2991, L"langledot"},
-       {0x29e0, L"laplac"},
-       {0x2bd, L"lasp"},
-       {0x2aab, L"lat"},
-       {0x2aad, L"late"},
-       {0x27c5, L"lbag"},
-       {0x2997, L"lblkbrbrak"},
-       {0x7b, L"lbrace"},
-       {0x23a9, L"lbracelend"},
-       {0x23a8, L"lbracemid"},
-       {0x23a7, L"lbraceuend"},
-       {0x5b, L"lbrack"},
-       {0x23a2, L"lbrackextender"},
-       {0x23a3, L"lbracklend"},
-       {0x298f, L"lbracklltick"},
-       {0x298b, L"lbrackubar"},
-       {0x23a1, L"lbrackuend"},
-       {0x298d, L"lbrackultick"},
-       {0x2772, L"lbrbrak"},
-       {0x2308, L"lceil"},
-       {0x29fc, L"lcurvyangle"},
-       {0x21e0, L"ldasharrhead"},
-       {0x2264, L"le"},
-       {0x219d, L"leadsto"},
-       {0x2190, L"leftarrow"},
-       {0x2b4a, L"leftarrowapprox"},
-       {0x2b42, L"leftarrowbackapprox"},
-       {0x2b4b, L"leftarrowbsimilar"},
-       {0x2977, L"leftarrowless"},
-       {0x2b32, L"leftarrowonoplus"},
-       {0x2946, L"leftarrowplus"},
-       {0x2943, L"leftarrowshortrightarrow"},
-       {0x2973, L"leftarrowsimilar"},
-       {0x297a, L"leftarrowsubset"},
-       {0x21a2, L"leftarrowtail"},
-       {0x21fd, L"leftarrowtriangle"},
-       {0x2b3e, L"leftarrowx"},
-       {0x290c, L"leftbkarrow"},
-       {0x2b3f, L"leftcurvedarrow"},
-       {0x21e0, L"leftdasharrow"},
-       {0x21e1, L"leftdasharrowhead"},
-       {0x290e, L"leftdbkarrow"},
-       {0x291b, L"leftdbltail"},
-       {0x2b38, L"leftdotarrow"},
-       {0x2936, L"leftdowncurvedarrow"},
-       {0x297c, L"leftfishtail"},
-       {0x21bd, L"leftharpoondown"},
-       {0x295e, L"leftharpoondownbar"},
-       {0x2962, L"leftharpoonsupdown"},
-       {0x21bc, L"leftharpoonup"},
-       {0x295a, L"leftharpoonupbar"},
-       {0x296a, L"leftharpoonupdash"},
-       {0x21c7, L"leftleftarrows"},
-       {0x263e, L"leftmoon"},
-       {0x27d5, L"leftouterjoin"},
-       {0x2194, L"leftrightarrow"},
-       {0x2948, L"leftrightarrowcircle"},
-       {0x21c6, L"leftrightarrows"},
-       {0x21ff, L"leftrightarrowtriangle"},
-       {0x2950, L"leftrightharpoondowndown"},
-       {0x294b, L"leftrightharpoondownup"},
-       {0x21cb, L"leftrightharpoons"},
-       {0x2967, L"leftrightharpoonsdown"},
-       {0x2966, L"leftrightharpoonsup"},
-       {0x294a, L"leftrightharpoonupdown"},
-       {0x294e, L"leftrightharpoonupup"},
-       {0x21ad, L"leftrightsquigarrow"},
-       {0x219c, L"leftsquigarrow"},
-       {0x21dc, L"leftsquigarrow"},
-       {0x2919, L"lefttail"},
-       {0x2b31, L"leftthreearrows"},
-       {0x22cb, L"leftthreetimes"},
-       {0x21e6, L"leftwhitearrow"},
-       {0x2264, L"leq"},
-       {0x2266, L"leqq"},
-       {0x2af9, L"leqqslant"},
-       {0x2afa, L"leqqslant"},
-       {0x2a7d, L"leqslant"},
-       {0x2aa8, L"lescc"},
-       {0x2a7f, L"lesdot"},
-       {0x2a81, L"lesdoto"},
-       {0x2a83, L"lesdotor"},
-       {0x2a93, L"lesges"},
-       {0x3c, L"less"},
-       {0x2a85, L"lessapprox"},
-       {0x22d6, L"lessdot"},
-       {0x22da, L"lesseqgtr"},
-       {0x2a8b, L"lesseqqgtr"},
-       {0x2276, L"lessgtr"},
-       {0x2272, L"lesssim"},
-       {0x29d1, L"lfbowtie"},
-       {0x230a, L"lfloor"},
-       {0x29d4, L"lftimes"},
-       {0x2a91, L"lgE"},
-       {0x2b24, L"lgblkcircle"},
-       {0x2b1b, L"lgblksquare"},
-       {0x25ef, L"lgwhtcircle"},
-       {0x2b1c, L"lgwhtsquare"},
-       {0x22b2, L"lhd"},
-       {0x21b4, L"linefeed"},
-       {0x226a, L"ll"},
-       {0x2989, L"llangle"},
-       {0x25df, L"llarc"},
-       {0x25e3, L"llblacktriangle"},
-       {0x231e, L"llcorner"},
-       {0x22d8, L"lll"},
-       {0x2af7, L"lllnest"},
-       {0x2987, L"llparenthesis"},
-       {0x25fa, L"lltriangle"},
-       {0x23b0, L"lmoustache"},
-       {0x2a89, L"lnapprox"},
-       {0x2a87, L"lneq"},
-       {0x2268, L"lneqq"},
-       {0x22e6, L"lnsim"},
-       {0x27de, L"longdashv"},
-       {0x27cc, L"longdivision"},
-       {0x27f5, L"longleftarrow"},
-       {0x27f7, L"longleftrightarrow"},
-       {0x2b33, L"longleftsquigarrow"},
-       {0x27fb, L"longmapsfrom"},
-       {0x27fc, L"longmapsto"},
-       {0x27f6, L"longrightarrow"},
-       {0x27ff, L"longrightsquigarrow"},
-       {0x21ab, L"looparrowleft"},
-       {0x21ac, L"looparrowright"},
-       {0x2a1c, L"lowint"},
-       {0x25ca, L"lozenge"},
-       {0x27e0, L"lozengeminus"},
-       {0x239c, L"lparenextender"},
-       {0x239d, L"lparenlend"},
-       {0x2993, L"lparenless"},
-       {0x239b, L"lparenuend"},
-       {0x2018, L"lq"},
-       {0x25de, L"lrarc"},
-       {0x25e2, L"lrblacktriangle"},
-       {0x231f, L"lrcorner"},
-       {0x25ff, L"lrtriangle"},
-       {0x29e1, L"lrtriangleeq"},
-       {0x2a8d, L"lsime"},
-       {0x2a8f, L"lsimg"},
-       {0x2acd, L"lsqhook"},
-       {0x2aa6, L"ltcc"},
-       {0x2a79, L"ltcir"},
-       {0x22c9, L"ltimes"},
-       {0x2976, L"ltlarr"},
-       {0x2a7b, L"ltquest"},
-       {0x29cf, L"ltrivb"},
-       {0x23b8, L"lvboxline"},
-       {0x29d8, L"lvzigzag"},
-       {0x2642, L"male"},
-       {0x2720, L"maltese"},
-       {0x21a7, L"mapsdown"},
-       {0x21a4, L"mapsfrom"},
-       {0x21a6, L"mapsto"},
-       {0x21a5, L"mapsup"},
-       {0x2b25, L"mdblkdiamond"},
-       {0x2b27, L"mdblklozenge"},
-       {0x26ab, L"mdblkrcl"},
-       {0x25fc, L"mdblksquare"},
-       {0x25cf, L"mdlgblkcircle"},
-       {0x25c6, L"mdlgblkdiamond"},
-       {0x29eb, L"mdlgblklozenge"},
-       {0x25a0, L"mdlgblksquare"},
-       {0x25cb, L"mdlgwhtcircle"},
-       {0x25c7, L"mdlgwhtdiamond"},
-       {0x25a1, L"mdlgwhtsquare"},
-       {0x2981, L"mdsmblkcircle"},
-       {0x25fe, L"mdsmblksquare"},
-       {0x26ac, L"mdsmwhtcircl"},
-       {0x25fd, L"mdsmwhtsquare"},
-       {0x26aa, L"mdwhtcircl"},
-       {0x2b26, L"mdwhtdiamond"},
-       {0x2b28, L"mdwhtlozenge"},
-       {0x25fb, L"mdwhtsquare"},
-       {0x29af, L"measangledltosw"},
-       {0x29ae, L"measangledrtose"},
-       {0x29ab, L"measangleldtosw"},
-       {0x29a9, L"measanglelutonw"},
-       {0x29aa, L"measanglerdtose"},
-       {0x29a8, L"measanglerutone"},
-       {0x29ad, L"measangleultonw"},
-       {0x29ac, L"measangleurtone"},
-       {0x225e, L"measeq"},
-       {0x2221, L"measuredangle"},
-       {0x299b, L"measuredangleleft"},
-       {0x22be, L"measuredrightangle"},
-       {0x2b51, L"medblackstar"},
-       {0x205f, L"medmathspace"},
-       {0x2b50, L"medwhitestar"},
-       {0x263f, L"mercury"},
-       {0x2127, L"mho"},
-       {0x2223, L"mid"},
-       {0x2a5d, L"midbarvee"},
-       {0x2a5c, L"midbarwedge"},
-       {0x2af0, L"midcir"},
-       {0x2212, L"minus"},
-       {0x2a2a, L"minusdot"},
-       {0x2a2b, L"minusfdots"},
-       {0x2a2c, L"minusrdots"},
-       {0x2adb, L"mlcp"},
-       {0x22a7, L"models"},
-       {0x2213, L"mp"},
-       {0x3bc, L"mu"},
-       {0x22b8, L"multimap"},
-       {0x27dc, L"multimapinv"},
-       {0x21df, L"nHdownarrow"},
-       {0x21de, L"nHuparrow"},
-       {0x21cd, L"nLeftarrow"},
-       {0x21ce, L"nLeftrightarrow"},
-       {0x21cf, L"nRightarrow"},
-       {0x22af, L"nVDash"},
-       {0x22ae, L"nVdash"},
-       {0x21fa, L"nVleftarrow"},
-       {0x2b3a, L"nVleftarrowtail"},
-       {0x21fc, L"nVleftrightarrow"},
-       {0x21fb, L"nVrightarrow"},
-       {0x2915, L"nVrightarrowtail"},
-       {0x2b35, L"nVtwoheadleftarrow"},
-       {0x2b3d, L"nVtwoheadleftarrowtail"},
-       {0x2901, L"nVtwoheadrightarrow"},
-       {0x2918, L"nVtwoheadrightarrowtail"},
-       {0x2207, L"nabla"},
-       {0x2249, L"napprox"},
-       {0x226d, L"nasymp"},
-       {0x266e, L"natural"},
-       {0x2247, L"ncong"},
-       {0x2260, L"ne"},
-       {0x2197, L"nearrow"},
-       {0xac, L"neg"},
-       {0x2931, L"neovnwarrow"},
-       {0x292e, L"neovsearrow"},
-       {0x2646, L"neptune"},
-       {0x2260, L"neq"},
-       {0x2262, L"nequiv"},
-       {0x2922, L"neswarrow"},
-       {0x26b2, L"neuter"},
-       {0x2204, L"nexists"},
-       {0x14b, L"ng"},
-       {0x2271, L"ngeq"},
-       {0x226f, L"ngtr"},
-       {0x2279, L"ngtrless"},
-       {0x2275, L"ngtrsim"},
-       {0x2af5, L"nhVvert"},
-       {0x2af2, L"nhpar"},
-       {0x220b, L"ni"},
-       {0x22fe, L"niobar"},
-       {0x22fc, L"nis"},
-       {0x22fa, L"nisd"},
-       {0x219a, L"nleftarrow"},
-       {0x21ae, L"nleftrightarrow"},
-       {0x2270, L"nleq"},
-       {0x226e, L"nless"},
-       {0x2278, L"nlessgtr"},
-       {0x2274, L"nlesssim"},
-       {0x2224, L"nmid"},
-       {0x220c, L"nni"},
-       {0x2011, L"nobreakhyphen"},
-       {0x2209, L"notin"},
-       {0x2226, L"nparallel"},
-       {0x2a14, L"npolint"},
-       {0x2280, L"nprec"},
-       {0x22e0, L"npreccurlyeq"},
-       {0x219b, L"nrightarrow"},
-       {0x2241, L"nsim"},
-       {0x2244, L"nsime"},
-       {0x22e2, L"nsqsubseteq"},
-       {0x22e3, L"nsqsupseteq"},
-       {0x2284, L"nsubset"},
-       {0x2288, L"nsubseteq"},
-       {0x2281, L"nsucc"},
-       {0x22e1, L"nsucccurlyeq"},
-       {0x2285, L"nsupset"},
-       {0x2289, L"nsupseteq"},
-       {0x22ea, L"ntriangleleft"},
-       {0x22ec, L"ntrianglelefteq"},
-       {0x22eb, L"ntriangleright"},
-       {0x22ed, L"ntrianglerighteq"},
-       {0x3bd, L"nu"},
-       {0x22ad, L"nvDash"},
-       {0x2902, L"nvLeftarrow"},
-       {0x2904, L"nvLeftrightarrow"},
-       {0x2903, L"nvRightarrow"},
-       {0x22ac, L"nvdash"},
-       {0x29de, L"nvinfty"},
-       {0x21f7, L"nvleftarrow"},
-       {0x2b39, L"nvleftarrowtail"},
-       {0x21f9, L"nvleftrightarrow"},
-       {0x21f8, L"nvrightarrow"},
-       {0x2914, L"nvrightarrowtail"},
-       {0x2b34, L"nvtwoheadleftarrow"},
-       {0x2b3c, L"nvtwoheadleftarrowtail"},
-       {0x2900, L"nvtwoheadrightarrow"},
-       {0x2917, L"nvtwoheadrightarrowtail"},
-       {0x2196, L"nwarrow"},
-       {0x2932, L"nwovnearrow"},
-       {0x2921, L"nwsearrow"},
-       {0xf8, L"o"},
-       {0x233d, L"obar"},
-       {0x29ba, L"obot"},
-       {0x23e0, L"obrbrak"},
-       {0x29b8, L"obslash"},
-       {0x2a38, L"odiv"},
-       {0x2299, L"odot"},
-       {0x29bc, L"odotslashdot"},
-       {0x153, L"oe"},
-       {0x29c1, L"ogreaterthan"},
-       {0x1a1, L"ohorn"},
-       {0x2230, L"oiiint"},
-       {0x222f, L"oiint"},
-       {0x222e, L"oint"},
-       {0x2233, L"ointctrclockwise"},
-       {0x29bb, L"olcross"},
-       {0x3d8, L"oldKoppa"},
-       {0x3d9, L"oldkoppa"},
-       {0x29c0, L"olessthan"},
-       {0x3c9, L"omega"},
-       {0x3bf, L"omicron"},
-       {0x2296, L"ominus"},
-       {0x29b9, L"operp"},
-       {0x2295, L"oplus"},
-       {0x2a2d, L"opluslhrim"},
-       {0x2a2e, L"oplusrhrim"},
-       {0x22b6, L"origof"},
-       {0x2298, L"oslash"},
-       {0x2297, L"otimes"},
-       {0x2a36, L"otimeshat"},
-       {0x2a34, L"otimeslhrim"},
-       {0x2a35, L"otimesrhrim"},
-       {0x23de, L"overbrace"},
-       {0x23b4, L"overbracket"},
-       {0x203e, L"overline"},
-       {0x23dc, L"overparen"},
-       {0x220b, L"owns"},
-       {0x2225, L"parallel"},
-       {0x25b1, L"parallelogram"},
-       {0x25b0, L"parallelogramblack"},
-       {0x2af3, L"parsim"},
-       {0x2202, L"partial"},
-       {0x2aa3, L"partialmeetcontraction"},
-       {0x2b20, L"pentagon"},
-       {0x2b1f, L"pentagonblack"},
-       {0x27c2, L"perp"},
-       {0x2ae1, L"perps"},
-       {0x3d5, L"phi"},
-       {0x260e, L"phone"},
-       {0x3c0, L"pi"},
-       {0x22d4, L"pitchfork"},
-       {0x2a25, L"plusdot"},
-       {0x2a72, L"pluseqq"},
-       {0x2a23, L"plushat"},
-       {0x2a26, L"plussim"},
-       {0x2a27, L"plussubtwo"},
-       {0x2a28, L"plustrif"},
-       {0x2647, L"pluto"},
-       {0xb1, L"pm"},
-       {0x2a15, L"pointnt"},
-       {0x3012, L"postalmark"},
-       {0x227a, L"prec"},
-       {0x2ab7, L"precapprox"},
-       {0x227c, L"preccurlyeq"},
-       {0x2aaf, L"preceq"},
-       {0x2ab3, L"preceqq"},
-       {0x2ab9, L"precnapprox"},
-       {0x2ab1, L"precneq"},
-       {0x2ab5, L"precneqq"},
-       {0x22e8, L"precnsim"},
-       {0x227e, L"precsim"},
-       {0x2032, L"prime"},
-       {0x220f, L"prod"},
-       {0x232e, L"profalar"},
-       {0x2312, L"profline"},
-       {0x2313, L"profsurf"},
-       {0x221d, L"propto"},
-       {0x22b0, L"prurel"},
-       {0x3c8, L"psi"},
-       {0x27d3, L"pullback"},
-       {0x27d4, L"pushout"},
-       {0x2057, L"qprime"},
-       {0x2669, L"quarternote"},
-       {0x225f, L"questeq"},
-       {0x201e, L"quotdblbase"},
-       {0x201f, L"quotdblright"},
-       {0x201a, L"quotsinglbase"},
-       {0x201b, L"quotsinglright"},
-       {0x27eb, L"rAngle"},
-       {0x2984, L"rBrace"},
-       {0x27e7, L"rBrack"},
-       {0x2986, L"rParen"},
-       {0x27e9, L"rangle"},
-       {0x2992, L"rangledot"},
-       {0x237c, L"rangledownzigzagarrow"},
-       {0x2bc, L"rasp"},
-       {0x27c6, L"rbag"},
-       {0x2998, L"rblkbrbrak"},
-       {0x7d, L"rbrace"},
-       {0x23ad, L"rbracelend"},
-       {0x23ac, L"rbracemid"},
-       {0x23ab, L"rbraceuend"},
-       {0x5d, L"rbrack"},
-       {0x23a5, L"rbrackextender"},
-       {0x23a6, L"rbracklend"},
-       {0x298e, L"rbracklrtick"},
-       {0x298c, L"rbrackubar"},
-       {0x23a4, L"rbrackuend"},
-       {0x2990, L"rbrackurtick"},
-       {0x2773, L"rbrbrak"},
-       {0x2309, L"rceil"},
-       {0x29fd, L"rcurvyangle"},
-       {0x292b, L"rdiagovfdiag"},
-       {0x2930, L"rdiagovsearrow"},
-       {0x2315, L"recorder"},
-       {0x29a3, L"revangle"},
-       {0x29a5, L"revangleubar"},
-       {0x29b0, L"revemptyset"},
-       {0x2aee, L"revnmid"},
-       {0x29d2, L"rfbowtie"},
-       {0x230b, L"rfloor"},
-       {0x29d5, L"rftimes"},
-       {0x22b3, L"rhd"},
-       {0x3c1, L"rho"},
-       {0x2b4c, L"righarrowbsimilar"},
-       {0x221f, L"rightangle"},
-       {0x299d, L"rightanglemdot"},
-       {0x299c, L"rightanglesqr"},
-       {0x2192, L"rightarrow"},
-       {0x2975, L"rightarrowapprox"},
-       {0x2b48, L"rightarrowbackapprox"},
-       {0x21e5, L"rightarrowbar"},
-       {0x291e, L"rightarrowdiamond"},
-       {0x2b43, L"rightarrowgtr"},
-       {0x27f4, L"rightarrowonoplus"},
-       {0x2945, L"rightarrowplus"},
-       {0x2942, L"rightarrowshortleftarrow"},
-       {0x2974, L"rightarrowsimilar"},
-       {0x2b44, L"rightarrowsupset"},
-       {0x21a3, L"rightarrowtail"},
-       {0x21fe, L"rightarrowtriangle"},
-       {0x2947, L"rightarrowx"},
-       {0x290d, L"rightbkarrow"},
-       {0x2933, L"rightcurvedarrow"},
-       {0x21e2, L"rightdasharrow"},
-       {0x291c, L"rightdbltail"},
-       {0x2911, L"rightdotarrow"},
-       {0x2937, L"rightdowncurvedarrow"},
-       {0x297d, L"rightfishtail"},
-       {0x21c1, L"rightharpoondown"},
-       {0x2957, L"rightharpoondownbar"},
-       {0x2964, L"rightharpoonsupdown"},
-       {0x21c0, L"rightharpoonup"},
-       {0x2953, L"rightharpoonupbar"},
-       {0x296c, L"rightharpoonupdash"},
-       {0x2970, L"rightimply"},
-       {0x21c4, L"rightleftarrows"},
-       {0x21cc, L"rightleftharpoons"},
-       {0x2969, L"rightleftharpoonsdown"},
-       {0x2968, L"rightleftharpoonsup"},
-       {0x263d, L"rightmoon"},
-       {0x27d6, L"rightouterjoin"},
-       {0x2b54, L"rightpentagon"},
-       {0x2b53, L"rightpentagonblack"},
-       {0x21c9, L"rightrightarrows"},
-       {0x219d, L"rightsquigarrow"},
-       {0x21dd, L"rightsquigarrow"},
-       {0x291a, L"righttail"},
-       {0x21f6, L"rightthreearrows"},
-       {0x22cc, L"rightthreetimes"},
-       {0x21e8, L"rightwhitearrow"},
-       {0x2a22, L"ringplus"},
-       {0x2253, L"risingdotseq"},
-       {0x23b1, L"rmoustache"},
-       {0x239f, L"rparenextender"},
-       {0x2994, L"rparengtr"},
-       {0x23a0, L"rparenlend"},
-       {0x239e, L"rparenuend"},
-       {0x2a12, L"rppolint"},
-       {0x2019, L"rq"},
-       {0x298a, L"rrangle"},
-       {0x2988, L"rrparenthesis"},
-       {0x29f7, L"rsolbar"},
-       {0x2ace, L"rsqhook"},
-       {0x2a65, L"rsub"},
-       {0x22ca, L"rtimes"},
-       {0x29ce, L"rtriltri"},
-       {0x29f4, L"ruledelayed"},
-       {0x23b9, L"rvboxline"},
-       {0x29d9, L"rvzigzag"},
-       {0x3e1, L"sampi"},
-       {0x2143, L"sansLmirrored"},
-       {0x2142, L"sansLturned"},
-       {0x2644, L"saturn"},
-       {0x2702, L"scissors"},
-       {0x2a13, L"scpolint"},
-       {0x212c, L"scrB"},
-       {0x2130, L"scrE"},
-       {0x2131, L"scrF"},
-       {0x210b, L"scrH"},
-       {0x2110, L"scrI"},
-       {0x2112, L"scrL"},
-       {0x2133, L"scrM"},
-       {0x211b, L"scrR"},
-       {0x212f, L"scre"},
-       {0x210a, L"scrg"},
-       {0x2134, L"scro"},
-       {0x22b1, L"scurel"},
-       {0x2198, L"searrow"},
-       {0x292d, L"seovnearrow"},
-       {0x2216, L"setminus"},
-       {0x29f5, L"setminus"},
-       {0x266f, L"sharp"},
-       {0x2adf, L"shortdowntack"},
-       {0x2190, L"shortleftarrow"},
-       {0x2ade, L"shortlefttack"},
-       {0x2192, L"shortrightarrow"},
-       {0x2944, L"shortrightarrowleftarrow"},
-       {0x2ae0, L"shortuptack"},
-       {0x29e2, L"shuffle"},
-       {0x3c3, L"sigma"},
-       {0x3c5, L"silon"},
-       {0x3d2, L"silon"},
-       {0x223c, L"sim"},
-       {0x2243, L"simeq"},
-       {0x2aa0, L"simgE"},
-       {0x2a9e, L"simgtr"},
-       {0x2b49, L"similarleftarrow"},
-       {0x2972, L"similarrightarrow"},
-       {0x2a9f, L"simlE"},
-       {0x2a9d, L"simless"},
-       {0x2a6c, L"simminussim"},
-       {0x2246, L"simneqq"},
-       {0x2a24, L"simplus"},
-       {0x2a6b, L"simrdots"},
-       {0x223f, L"sinewave"},
-       {0x2215, L"slash"},
-       {0x25c2, L"smallblacktriangleleft"},
-       {0x25b8, L"smallblacktriangleright"},
-       {0x22c4, L"smalldiamond"},
-       {0x220a, L"smallin"},
-       {0x222b, L"smallint"},
-       {0x220d, L"smallni"},
-       {0x2216, L"smallsetminus"},
-       {0x25c3, L"smalltriangleleft"},
-       {0x25b9, L"smalltriangleright"},
-       {0x2a33, L"smashtimes"},
-       {0x2b29, L"smblkdiamond"},
-       {0x2b2a, L"smblklozenge"},
-       {0x25aa, L"smblksquare"},
-       {0x29e4, L"smeparsl"},
-       {0x2323, L"smile"},
-       {0x263a, L"smiley"},
-       {0x2aaa, L"smt"},
-       {0x2aac, L"smte"},
-       {0x2b52, L"smwhitestar"},
-       {0x25e6, L"smwhtcircle"},
-       {0x2b2b, L"smwhtlozenge"},
-       {0x25ab, L"smwhtsquare"},
-       {0x2660, L"spadesuit"},
-       {0x2222, L"sphericalangle"},
-       {0x29a1, L"sphericalangleup"},
-       {0x2293, L"sqcap"},
-       {0x2294, L"sqcup"},
-       {0x2a16, L"sqint"},
-       {0x2311, L"sqlozenge"},
-       {0x800221a, L"sqrt"},
-       {0x800221b, L"sqrt3"},
-       {0x800221c, L"sqrt4"},
-       {0x23b7, L"sqrtbottom"},
-       {0x228f, L"sqsubset"},
-       {0x2291, L"sqsubseteq"},
-       {0x22e4, L"sqsubsetneq"},
-       {0x2290, L"sqsupset"},
-       {0x2292, L"sqsupseteq"},
-       {0x22e5, L"sqsupsetneq"},
-       {0x25a9, L"squarecrossfill"},
-       {0x25a9, L"squaregrayfill"},
-       {0x25a4, L"squarehfill"},
-       {0x25a6, L"squarehvfill"},
-       {0x25e7, L"squareleftblack"},
-       {0x25e8, L"squareleftblack"},
-       {0x2b15, L"squarellblack"},
-       {0x25f1, L"squarellquad"},
-       {0x25ea, L"squarelrblack"},
-       {0x25f2, L"squarelrquad"},
-       {0x25a8, L"squareneswfill"},
-       {0x25a7, L"squarenwsefill"},
-       {0x25e9, L"squareulblack"},
-       {0x25f0, L"squareulquad"},
-       {0x2b14, L"squareurblack"},
-       {0x25f3, L"squareurquad"},
-       {0x25a5, L"squarevfill"},
-       {0x25a2, L"squoval"},
-       {0xdf, L"ss"},
-       {0x22c6, L"star"},
-       {0x225b, L"stareq"},
-       {0xa3, L"sterling"},
-       {0x3db, L"stigma"},
-       {0x23e4, L"strns"},
-       {0x2ac3, L"subedot"},
-       {0x2ac1, L"submult"},
-       {0x2979, L"subrarr"},
-       {0x2282, L"subset"},
-       {0x2ac9, L"subsetapprox"},
-       {0x27c3, L"subsetcirc"},
-       {0x2abd, L"subsetdot"},
-       {0x2286, L"subseteq"},
-       {0x2ac5, L"subseteqq"},
-       {0x228a, L"subsetneq"},
-       {0x2acb, L"subsetneqq"},
-       {0x2abf, L"subsetplus"},
-       {0x2ac7, L"subsim"},
-       {0x2ad5, L"subsub"},
-       {0x2ad3, L"subsup"},
-       {0x227b, L"succ"},
-       {0x2ab8, L"succapprox"},
-       {0x227d, L"succcurlyeq"},
-       {0x2ab0, L"succeq"},
-       {0x2ab4, L"succeqq"},
-       {0x2aba, L"succnapprox"},
-       {0x2ab2, L"succneq"},
-       {0x2ab6, L"succneqq"},
-       {0x22e9, L"succnsim"},
-       {0x227f, L"succsim"},
-       {0x2211, L"sum"},
-       {0x23b3, L"sumbottom"},
-       {0x2a0b, L"sumint"},
-       {0x23b2, L"sumtop"},
-       {0x263c, L"sun"},
-       {0x2ad8, L"supdsub"},
-       {0x2ac4, L"supedot"},
-       {0x27c9, L"suphsol"},
-       {0x2ad7, L"suphsub"},
-       {0x297b, L"suplarr"},
-       {0x2ac2, L"supmult"},
-       {0x207f, L"supn"},
-       {0x2283, L"supset"},
-       {0x2aca, L"supsetapprox"},
-       {0x27c4, L"supsetcirc"},
-       {0x2abe, L"supsetdot"},
-       {0x2287, L"supseteq"},
-       {0x2ac6, L"supseteqq"},
-       {0x228b, L"supsetneq"},
-       {0x2acc, L"supsetneqq"},
-       {0x2ac0, L"supsetplus"},
-       {0x2ac8, L"supsim"},
-       {0x2ad4, L"supsub"},
-       {0x2ad6, L"supsup"},
-       {0x221a, L"surd"},
-       {0x2199, L"swarrow"},
-       {0x2afe, L"talloblong"},
-       {0x2316, L"target"},
-       {0x3c4, L"tau"},
-       {0x2649, L"taurus"},
-       {0x1d8d, L"testhookx"},
-       {0x2051, L"textAsterisks"},
-       {0x2ca, L"textacute"},
-       {0x2d6, L"textadvanced"},
-       {0x2bf, L"textain"},
-       {0xb4, L"textasciiacute"},
-       {0x5e, L"textasciicircum"},
-       {0xa8, L"textasciidieresis"},
-       {0x60, L"textasciigrave"},
-       {0xaf, L"textasciimacron"},
-       {0x7e, L"textasciitilde"},
-       {0x204e, L"textasterisklow"},
-       {0x2036, L"textbackdprime"},
-       {0x2035, L"textbackprime"},
-       {0x2037, L"textbacktrprime"},
-       {0x25f, L"textbardotlessj"},
-       {0x284, L"textbardotlessjvar"},
-       {0x2a1, L"textbarglotstop"},
-       {0x268, L"textbari"},
-       {0x19a, L"textbarl"},
-       {0x275, L"textbaro"},
-       {0x2a2, L"textbarrevglotstop"},
-       {0x289, L"textbaru"},
-       {0x26c, L"textbeltl"},
-       {0x1ba, L"textbenttailyogh"},
-       {0x2d8, L"textbreve"},
-       {0xa6, L"textbrokenbar"},
-       {0x2022, L"textbullet"},
-       {0x298, L"textbullseye"},
-       {0xa2, L"textcent"},
-       {0x2117, L"textcircledP"},
-       {0x29a, L"textcloseepsilon"},
-       {0x277, L"textcloseomega"},
-       {0x25e, L"textcloserevepsilon"},
-       {0xa9, L"textcopyright"},
-       {0x180, L"textcrb"},
-       {0x127, L"textcrh"},
-       {0x1be, L"textcrinvglotstop"},
-       {0x19b, L"textcrlambda"},
-       {0x1bb, L"textcrtwo"},
-       {0x255, L"textctc"},
-       {0x221, L"textctd"},
-       {0x286, L"textctesh"},
-       {0x29d, L"textctj"},
-       {0x234, L"textctl"},
-       {0x235, L"textctn"},
-       {0x236, L"textctt"},
-       {0x293, L"textctyogh"},
-       {0x291, L"textctz"},
-       {0xa4, L"textcurrency"},
-       {0x2a5, L"textdctzlig"},
-       {0xb0, L"textdegree"},
-       {0x2052, L"textdiscount"},
-       {0x24, L"textdollar"},
-       {0x2d9, L"textdotaccent"},
-       {0x237, L"textdotlessj"},
-       {0x2dd, L"textdoubleacute"},
-       {0x1c2, L"textdoublebarpipe"},
-       {0x1c1, L"textdoublepipe"},
-       {0x2033, L"textdprime"},
-       {0x2c5, L"textdptr"},
-       {0x2a4, L"textdyoghlig"},
-       {0x2a3, L"textdzlig"},
-       {0x25b, L"textepsilon"},
-       {0x283, L"textesh"},
-       {0x212e, L"textestimated"},
-       {0x1c3, L"textexclam"},
-       {0xa1, L"textexclamdown"},
-       {0x27e, L"textfishhookr"},
-       {0x192, L"textflorin"},
-       {0x20a3, L"textfranc"},
-       {0x263, L"textgamma"},
-       {0x294, L"textglotstop"},
-       {0x2cb, L"textgrave"},
-       {0x2d1, L"texthalflength"},
-       {0x2be, L"texthamza"},
-       {0xa727, L"texthen"},
-       {0xa727, L"textheng"},
-       {0x1d8a, L"texthooks"},
-       {0x1d8e, L"texthookz"},
-       {0x253, L"texthtb"},
-       {0x188, L"texthtc"},
-       {0x257, L"texthtd"},
-       {0x260, L"texthtg"},
-       {0x266, L"texthth"},
-       {0x267, L"texththeng"},
-       {0x199, L"texthtk"},
-       {0x1a5, L"texthtp"},
-       {0x2a0, L"texthtq"},
-       {0x29b, L"texthtscg"},
-       {0x1ad, L"texthtt"},
-       {0x195, L"texthvlig"},
-       {0x2010, L"texthyphen"},
-       {0x296, L"textinvglotstop"},
-       {0x281, L"textinvscr"},
-       {0x269, L"textiota"},
-       {0x2d0, L"textlengthmark"},
-       {0x2d3, L"textlhalfring"},
-       {0x1d81, L"textlhookd"},
-       {0x1d84, L"textlhookk"},
-       {0x1d85, L"textlhookl"},
-       {0x1ab, L"textlhookt"},
-       {0x27f, L"textlhti"},
-       {0x20a4, L"textlira"},
-       {0x27c, L"textlonglegr"},
-       {0x2ae, L"textlongy"},
-       {0x2af, L"textlongy"},
-       {0x1aa, L"textlooptoprevesh"},
-       {0x2cf, L"textlowacute"},
-       {0x2d5, L"textlowered"},
-       {0x2ce, L"textlowgrave"},
-       {0x2cd, L"textlowmacron"},
-       {0x2c2, L"textlptr"},
-       {0x271, L"textltailm"},
-       {0x272, L"textltailn"},
-       {0x26b, L"textltilde"},
-       {0x26e, L"textlyoghlig"},
-       {0x2c9, L"textmacron"},
-       {0xb5, L"textmu"},
-       {0x2116, L"textnumero"},
-       {0x2db, L"textogonek"},
-       {0x2126, L"textohm"},
-       {0xbd, L"textonehalf"},
-       {0xbc, L"textonequarter"},
-       {0xb9, L"textonesuperior"},
-       {0x254, L"textopeno"},
-       {0xaa, L"textordfeminine"},
-       {0xba, L"textordmasculine"},
-       {0x2df, L"textovercross"},
-       {0x2125, L"textoz"},
-       {0x2031, L"textpertenthousand"},
-       {0x2030, L"textperthousand"},
-       {0x20a7, L"textpesetas"},
-       {0x278, L"textphi"},
-       {0x1c0, L"textpipe"},
-       {0x2032, L"textprime"},
-       {0x2c8, L"textprimstress"},
-       {0x2057, L"textqprime"},
-       {0xbf, L"textquestiondown"},
-       {0x22, L"textquotedbl"},
-       {0x201c, L"textquotedblleft"},
-       {0x201d, L"textquotedblright"},
-       {0x2d4, L"textraised"},
-       {0x2c0, L"textraiseglotstop"},
-       {0x2c1, L"textraiserevglotstop"},
-       {0x264, L"textramshorns"},
-       {0x211e, L"textrecipe"},
-       {0x203b, L"textreferencemark"},
-       {0xae, L"textregistered"},
-       {0x2d7, L"textretracted"},
-       {0x258, L"textreve"},
-       {0x25c, L"textrevepsilon"},
-       {0x295, L"textrevglotstop"},
-       {0x2d2, L"textrhalfring"},
-       {0x25d, L"textrhookrevepsilon"},
-       {0x25a, L"textrhookschwa"},
-       {0x2de, L"textrhoticity"},
-       {0x2da, L"textringaccent"},
-       {0x2c3, L"textrptr"},
-       {0x256, L"textrtaild"},
-       {0x26d, L"textrtaill"},
-       {0x273, L"textrtailn"},
-       {0x27d, L"textrtailr"},
-       {0x282, L"textrtails"},
-       {0x288, L"textrtailt"},
-       {0x290, L"textrtailz"},
-       {0x1d00, L"textsca"},
-       {0x299, L"textscb"},
-       {0x1d07, L"textsce"},
-       {0x262, L"textscg"},
-       {0x29c, L"textsch"},
-       {0x259, L"textschwa"},
-       {0x26a, L"textsci"},
-       {0x29f, L"textscl"},
-       {0x274, L"textscn"},
-       {0x276, L"textscoelig"},
-       {0x280, L"textscr"},
-       {0x251, L"textscripta"},
-       {0x261, L"textscriptg"},
-       {0x28b, L"textscriptv"},
-       {0x1d1c, L"textscu"},
-       {0x28f, L"textscy"},
-       {0x2cc, L"textsecstress"},
-       {0x204f, L"textsemicolonreversed"},
-       {0x3a5, L"textsilon"},
-       {0x2dc, L"textsmalltilde"},
-       {0x297, L"textstretchcvar"},
-       {0x77, L"textsubw"},
-       {0x2b0, L"textsuph"},
-       {0x2b1, L"textsuphth"},
-       {0x2b6, L"textsupinvscr"},
-       {0x2b2, L"textsupj"},
-       {0x2b3, L"textsupr"},
-       {0x2b4, L"textsupturnr"},
-       {0x2b5, L"textsupturnrrtail"},
-       {0x2b7, L"textsupw"},
-       {0x2b8, L"textsupy"},
-       {0x2a7, L"texttctctlig"},
-       {0x2a8, L"texttctctlig"},
-       {0xbe, L"textthreequarters"},
-       {0xb3, L"textthreesuperior"},
-       {0x2122, L"texttrademark"},
-       {0x2034, L"texttrprime"},
-       {0x2a6, L"texttslig"},
-       {0x250, L"textturna"},
-       {0x2bb, L"textturncomma"},
-       {0x265, L"textturnh"},
-       {0x29e, L"textturnk"},
-       {0x27a, L"textturnlonglegr"},
-       {0x26f, L"textturnm"},
-       {0x270, L"textturnmrleg"},
-       {0x279, L"textturnr"},
-       {0x27b, L"textturnrrtail"},
-       {0x252, L"textturnscripta"},
-       {0x287, L"textturnt"},
-       {0x28c, L"textturnv"},
-       {0x28d, L"textturnw"},
-       {0x28e, L"textturny"},
-       {0xb2, L"texttwosuperior"},
-       {0x28a, L"textupsilon"},
-       {0x2c4, L"textuptr"},
-       {0x285, L"textvibyi"},
-       {0x2423, L"textvisiblespace"},
-       {0x292, L"textyogh"},
-       {0xfe, L"th"},
-       {0x2234, L"therefore"},
-       {0x29e7, L"thermod"},
-       {0x3b8, L"theta"},
-       {0x2248, L"thickapprox"},
-       {0x223c, L"thicksim"},
-       {0x27c0, L"threedangle"},
-       {0x2af6, L"threedotcolon"},
-       {0x2040, L"tieconcat"},
-       {0x29dd, L"tieinfty"},
-       {0xd7, L"times"},
-       {0x2a31, L"timesbar"},
-       {0x29ff, L"tminus"},
-       {0x2192, L"to"},
-       {0x2928, L"toea"},
-       {0x2927, L"tona"},
-       {0x2e5, L"tonebarextrahigh"},
-       {0x2e9, L"tonebarextralow"},
-       {0x2e6, L"tonebarhigh"},
-       {0x2e8, L"tonebarlow"},
-       {0x2e7, L"tonebarmid"},
-       {0x22a4, L"top"},
-       {0x2336, L"topbot"},
-       {0x2af1, L"topcir"},
-       {0x2ada, L"topfork"},
-       {0x25e0, L"topsemicircle"},
-       {0x2929, L"tosa"},
-       {0x292a, L"towa"},
-       {0x29fe, L"tplus"},
-       {0x23e2, L"trapezium"},
-       {0x25ec, L"trianglecdot"},
-       {0x25bf, L"triangledown"},
-       {0x26a0, L"triangleexclam"},
-       {0x25c1, L"triangleleft"},
-       {0x25ed, L"triangleleftblack"},
-       {0x22b4, L"trianglelefteq"},
-       {0x2a3a, L"triangleminus"},
-       {0x29ca, L"triangleodot"},
-       {0x2a39, L"triangleplus"},
-       {0x225c, L"triangleq"},
-       {0x25b7, L"triangleright"},
-       {0x25ee, L"trianglerightblack"},
-       {0x22b5, L"trianglerighteq"},
-       {0x29cc, L"triangles"},
-       {0x29cd, L"triangleserifs"},
-       {0x2a3b, L"triangletimes"},
-       {0x29cb, L"triangleubar"},
-       {0x29fb, L"tripleplus"},
-       {0x2034, L"trprime"},
-       {0x29a2, L"turnangle"},
-       {0x2129, L"turnediota"},
-       {0x2319, L"turnednot"},
-       {0x2a4b, L"twocaps"},
-       {0x2a4a, L"twocups"},
-       {0x21a1, L"twoheaddownarrow"},
-       {0x219e, L"twoheadleftarrow"},
-       {0x2b3b, L"twoheadleftarrowtail"},
-       {0x2b37, L"twoheadleftdbkarrow"},
-       {0x2b36, L"twoheadmapsfrom"},
-       {0x2905, L"twoheadmapsto"},
-       {0x21a0, L"twoheadrightarrow"},
-       {0x2916, L"twoheadrightarrowtail"},
-       {0x219f, L"twoheaduparrow"},
-       {0x2949, L"twoheaduparrowcircle"},
-       {0x2017, L"twolowline"},
-       {0x266b, L"twonotes"},
-       {0x2982, L"typecolon"},
-       {0x23e1, L"ubrbrak"},
-       {0x1b0, L"uhorn"},
-       {0x25dc, L"ularc"},
-       {0x25e4, L"ulblacktriangle"},
-       {0x231c, L"ulcorner"},
-       {0x230f, L"ulcrop"},
-       {0x25f8, L"ultriangle"},
-       {0x2a41, L"uminus"},
-       {0x23df, L"underbrace"},
-       {0x23b5, L"underbracket"},
-       {0x23dd, L"underparen"},
-       {0x22b4, L"unlhd"},
-       {0x22b5, L"unrhd"},
-       {0x214b, L"upand"},
-       {0x2191, L"uparrow"},
-       {0x2909, L"uparrowbarred"},
-       {0x29bd, L"uparrowoncircle"},
-       {0x21e2, L"updasharrow"},
-       {0x2195, L"updownarrow"},
-       {0x21a8, L"updownarrowbar"},
-       {0x21c5, L"updownarrows"},
-       {0x2951, L"updownharpoonleftleft"},
-       {0x294d, L"updownharpoonleftright"},
-       {0x294c, L"updownharpoonrightleft"},
-       {0x294f, L"updownharpoonrightright"},
-       {0x296e, L"updownharpoonsleftright"},
-       {0x297e, L"upfishtail"},
-       {0x21bf, L"upharpoonleft"},
-       {0x2960, L"upharpoonleftbar"},
-       {0x21be, L"upharpoonright"},
-       {0x295c, L"upharpoonrightbar"},
-       {0x2963, L"upharpoonsleftright"},
-       {0x27d2, L"upin"},
-       {0x2a1b, L"upint"},
-       {0x228e, L"uplus"},
-       {0x2934, L"uprightcurvearrow"},
-       {0x21c8, L"upuparrows"},
-       {0x21e7, L"upwhitearrow"},
-       {0x25dd, L"urarc"},
-       {0x25e5, L"urblacktriangle"},
-       {0x231d, L"urcorner"},
-       {0x230e, L"urcrop"},
-       {0x25f9, L"urtriangle"},
-       {0x2c7, L"v"},
-       {0x2ae8, L"vBar"},
-       {0x2ae9, L"vBarv"},
-       {0x22a8, L"vDash"},
-       {0x2ae2, L"vDdash"},
-       {0x3f4, L"varTheta"},
-       {0x2ae6, L"varVdash"},
-       {0x2305, L"varbarwedge"},
-       {0x3d0, L"varbeta"},
-       {0x2667, L"varclubsuit"},
-       {0x2666, L"vardiamondsuit"},
-       {0x2306, L"vardoublebarwedge"},
-       {0x3b5, L"varepsilon"},
-       {0x2665, L"varheartsuit"},
-       {0x2b21, L"varhexagon"},
-       {0x2b22, L"varhexagonblack"},
-       {0x232c, L"varhexagonlrbonds"},
-       {0x2208, L"varin"},
-       {0x22f6, L"varisinobar"},
-       {0x22f3, L"varisins"},
-       {0x3f0, L"varkappa"},
-       {0x22bf, L"varlrtriangle"},
-       {0x220b, L"varni"},
-       {0x22fd, L"varniobar"},
-       {0x22fb, L"varnis"},
-       {0x2205, L"varnothing"},
-       {0x2232, L"varointclockwise"},
-       {0x3c6, L"varphi"},
-       {0x3d6, L"varpi"},
-       {0x221d, L"varpropto"},
-       {0x3f1, L"varrho"},
-       {0x23d0, L"varrowextender"},
-       {0x3c2, L"varsigma"},
-       {0x2664, L"varspadesuit"},
-       {0x2736, L"varstar"},
-       {0x3d1, L"vartheta"},
-       {0x25b5, L"vartriangle"},
-       {0x22b2, L"vartriangleleft"},
-       {0x22b3, L"vartriangleright"},
-       {0x2a61, L"varveebar"},
-       {0x23aa, L"vbraceextender"},
-       {0x29d0, L"vbrtri"},
-       {0x22a2, L"vdash"},
-       {0x22ee, L"vdots"},
-       {0x2a2f, L"vectimes"},
-       {0x2228, L"vee"},
-       {0x22bb, L"veebar"},
-       {0x27c7, L"veedot"},
-       {0x2a63, L"veedoublebar"},
-       {0x225a, L"veeeq"},
-       {0x2a5b, L"veemidvert"},
-       {0x2a52, L"veeodot"},
-       {0x2a56, L"veeonvee"},
-       {0x2a59, L"veeonwedge"},
-       {0x7c, L"vert"},
-       {0x2317, L"viewdata"},
-       {0x27dd, L"vlongdash"},
-       {0x25af, L"vrectangle"},
-       {0x25ae, L"vrectangleblack"},
-       {0x2b1d, L"vysmlblksquare"},
-       {0x2b1e, L"vysmlwhtsquare"},
-       {0x299a, L"vzigzag"},
-       {0x231a, L"watchicon"},
-       {0x2227, L"wedge"},
-       {0x2a5f, L"wedgebar"},
-       {0x27d1, L"wedgedot"},
-       {0x2a60, L"wedgedoublebar"},
-       {0x2a5a, L"wedgemidvert"},
-       {0x2a51, L"wedgeodot"},
-       {0x2a55, L"wedgeonwedge"},
-       {0x2259, L"wedgeq"},
-       {0x21ea, L"whitearrowupfrombar"},
-       {0x27c1, L"whiteinwhitetriangle"},
-       {0x25c5, L"whitepointerleft"},
-       {0x25bb, L"whitepointerright"},
-       {0x27e4, L"whitesquaretickleft"},
-       {0x27e5, L"whitesquaretickright"},
-       {0x2b2d, L"whthorzoval"},
-       {0x2b2f, L"whtvertoval"},
-       {0x29a6, L"wideangledown"},
-       {0x29a7, L"wideangleup"},
-       {0x2118, L"wp"},
-       {0x2240, L"wr"},
-       {0x29f9, L"xbsol"},
-       {0x3be, L"xi"},
-       {0x29f8, L"xsol"},
-       {0xa5, L"yen"},
-       {0x3b6, L"zeta"},
-       {0x2a20, L"zpipe"},
-{0, L""}};
-//-----------------------------------------------------------------------------
index 66034f26c063727bbc7aaa434b44fbd3cc5112bc..9983da4df7fe2e511a555032e1aa68e3b1767ec6 100644 (file)
@@ -21,6 +21,7 @@
 #include "mgl2/eval.h"\r
 #include "mgl2/data.h"\r
 #include "mgl2/base.h"\r
+#define MGL_FLOW_ACC   0.05    // accuracy of loop detection\r
 //-----------------------------------------------------------------------------\r
 //\r
 //     Traj series\r
@@ -58,8 +59,8 @@ void MGL_EXPORT mgl_traj_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay,
                long mx = j<ax->GetNy() ? j:0,my = j<ay->GetNy() ? j:0,mz = j<az->GetNy() ? j:0;\r
                for(long i=0;i<n;i++)\r
                {\r
-                       p1 = mglPoint(x->v(i,nx), y->v(i,ny), z->v(i,nz));\r
-                       p2 = mglPoint(ax->v(i,mx),ay->v(i,my),az->v(i,mz));\r
+                       p1.Set(x->v(i,nx), y->v(i,ny), z->v(i,nz));\r
+                       p2.Set(ax->v(i,mx),ay->v(i,my),az->v(i,mz));\r
                        mreal dd = p2.norm();\r
                        if(len==0)\r
                        {\r
@@ -131,8 +132,8 @@ void MGL_EXPORT mgl_vect_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const cha
 #pragma omp for nowait collapse(3) reduction(+:ca)\r
                for(long k=0;k<l;k++)   for(long j=0;j<m;j+=ty) for(long i=0;i<n;i+=tx)\r
                {\r
-                       d = mglPoint(GetX(x,i,j,k).x, GetY(y,i,j,k).x);\r
-                       v = mglPoint(ax->v(i,j,k),ay->v(i,j,k));\r
+                       d.Set(GetX(x,i,j,k).x, GetY(y,i,j,k).x);\r
+                       v.Set(ax->v(i,j,k),ay->v(i,j,k));\r
                        c1 = v.norm();  xm1 = xm1<c1 ? c1:xm1;  // handle NAN values\r
                        p1 = i<n-1 ? mglPoint(GetX(x,i+tx,j,k).x, GetY(y,i+tx,j,k).x)-d : d-mglPoint(GetX(x,i-tx,j,k).x, GetY(y,i-tx,j,k).x);\r
                        c1 = fabs(v*p1);        xx = p1.norm(); c1 *= xx?1/(xx*xx):0;\r
@@ -152,8 +153,8 @@ void MGL_EXPORT mgl_vect_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const cha
                if(ax->GetNz()>1)       zVal = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(k)/(ax->GetNz()-1);\r
                for(long j=0;j<m;j+=ty) for(long i=0;i<n;i+=tx)\r
                {\r
-                       d = mglPoint(GetX(x,i,j,k).x, GetY(y,i,j,k).x, zVal);\r
-                       v = mglPoint(ax->v(i,j,k),ay->v(i,j,k));\r
+                       d.Set(GetX(x,i,j,k).x, GetY(y,i,j,k).x, zVal);\r
+                       v.Set(ax->v(i,j,k),ay->v(i,j,k));\r
                        mreal dd = v.norm(), c1, c2;\r
                        v *= cm*(fix?(dd>dm ? 1./dd : 0) : xm);\r
 \r
@@ -228,8 +229,8 @@ void MGL_EXPORT mgl_vect_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay,
 #pragma omp for nowait collapse(3) reduction(+:ca)\r
                for(long k=0;k<l;k+=tz) for(long i=0;i<n;i+=tx) for(long j=0;j<m;j+=ty)\r
                {\r
-                       d = mglPoint(GetX(x,i,j,k).x, GetY(y,i,j,k).x, GetZ(z,i,j,k).x);\r
-                       v = mglPoint(ax->v(i,j,k),ay->v(i,j,k),az->v(i,j,k));\r
+                       d.Set(GetX(x,i,j,k).x, GetY(y,i,j,k).x, GetZ(z,i,j,k).x);\r
+                       v.Set(ax->v(i,j,k),ay->v(i,j,k),az->v(i,j,k));\r
                        c1 = v.norm();  xm1 = xm1<c1 ? c1:xm1;  // handle NAN values\r
                        p1 = i<n-1 ? mglPoint(GetX(x,i+tx,j,k).x, GetY(y,i+tx,j,k).x, GetZ(z,i+tx,j,k).x)-d : d-mglPoint(GetX(x,i-tx,j,k).x, GetY(y,i-tx,j,k).x, GetZ(z,i-tx,j,k).x);\r
                        c1 = fabs(v*p1);        xx = p1.norm(); c1 *= xx?1/(xx*xx):0;\r
@@ -251,8 +252,8 @@ void MGL_EXPORT mgl_vect_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay,
                if(gr->NeedStop())      break;\r
                for(long i=0;i<n;i+=tx) for(long j=0;j<m;j+=ty)\r
                {\r
-                       d=mglPoint(GetX(x,i,j,k).x, GetY(y,i,j,k).x, GetZ(z,i,j,k).x);\r
-                       v = mglPoint(ax->v(i,j,k),ay->v(i,j,k),az->v(i,j,k));\r
+                       d.Set(GetX(x,i,j,k).x, GetY(y,i,j,k).x, GetZ(z,i,j,k).x);\r
+                       v.Set(ax->v(i,j,k),ay->v(i,j,k),az->v(i,j,k));\r
                        mreal dd = v.norm(),c1,c2;\r
                        v *= cm*(fix?(dd>dm ? 1./dd : 0) : xm);\r
 \r
@@ -436,7 +437,7 @@ void MGL_EXPORT mgl_vect3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay,
                        xx = s.x.a[i0]; yy = s.y.a[i0]; zz = s.z.a[i0];\r
                        p1 = i<n-1 ? mglPoint(s.x.a[i0+tx]-xx, s.y.a[i0+tx]-yy, s.z.a[i0+tx]-zz) : mglPoint(xx-s.x.a[i0-tx], yy-s.y.a[i0-tx], zz-s.z.a[i0-tx]);\r
                        p2 = j<m-1 ? mglPoint(s.x.a[i0+tn]-xx, s.y.a[i0+tn]-yy, s.z.a[i0+tn]-zz) : mglPoint(xx-s.x.a[i0-tn], yy-s.y.a[i0-tn], zz-s.z.a[i0-tn]);\r
-                       v = mglPoint(s.ax.a[i0], s.ay.a[i0], s.az.a[i0]);\r
+                       v.Set(s.ax.a[i0], s.ay.a[i0], s.az.a[i0]);\r
                        c1 = v.norm();  xm1 = xm1<c1 ? c1:xm1;  // handle NAN values\r
                        yy = fabs(v*d); xx = d.norm();  yy *= xx?1/(xx*xx):0;\r
                        c1 = fabs(v*p1);        xx = p1.norm(); c1 *= xx?1/(xx*xx):0;\r
@@ -453,8 +454,8 @@ void MGL_EXPORT mgl_vect3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay,
        for(long i=0;i<n;i+=tx) for(long j=0;j<m;j+=ty)\r
        {\r
                register long i0 = i+n*j;\r
-               d = mglPoint(s.x.a[i0], s.y.a[i0], s.z.a[i0]);\r
-               v = mglPoint(s.ax.a[i0], s.ay.a[i0], s.az.a[i0]);\r
+               d.Set(s.x.a[i0], s.y.a[i0], s.z.a[i0]);\r
+               v.Set(s.ax.a[i0], s.ay.a[i0], s.az.a[i0]);\r
                mreal dd = v.norm(),c1,c2;\r
                v *= cm*(fix?(dd>dm ? 1./dd : 0) : xm);\r
 \r
@@ -506,30 +507,71 @@ void MGL_NO_EXPORT flow(mglBase *gr, double zVal, double u, double v, const mglD
        mglPoint *pp = new mglPoint[n], dp;\r
        mglPoint dx(1/fabs(gr->Max.x-gr->Min.x),1/fabs(gr->Max.y-gr->Min.y),1/fabs(gr->Max.z-gr->Min.z));\r
 \r
-       mreal dt = 0.5/(ax.nx > ax.ny ? ax.nx : ax.ny),e,f,g,ff[4],gg[4],h,s=1;\r
-       if(u<0 || v<0)  {       dt = -dt;       u = -u;         v = -v;         s = -1;}\r
+       mreal dt = 0.5/(ax.nx > ax.ny ? ax.nx : ax.ny),e,f,g,ff[4],gg[4],h,s=2;\r
+       if(u<0 || v<0)  {       dt = -dt;       u = -u; v = -v; s *= -1;}\r
        register long k=0,m;\r
        bool end = false;\r
-       do{\r
-               pp[k].x = nboth ? x.Spline1(u,0,0):x.Spline1(u,v,0);\r
-               pp[k].y = nboth ? y.Spline1(v,0,0):y.Spline1(u,v,0);\r
+       if(nboth) do{\r
+               mglPoint dif;\r
+               pp[k].x = x.Spline1(dif,u,0,0); f = ax.Spline1(u,v,0)/dif.x;\r
+               pp[k].y = y.Spline1(dif,v,0,0); g = ay.Spline1(u,v,0)/dif.x;\r
                pp[k].z = zVal;\r
                for(m=0;m<k-1;m++)      // determines encircle\r
-                       if(mgl_norm((pp[k]-pp[m])/dx)<dt/10.)   {       end = true;     break;  }\r
-               f = ax.Spline1(u,v,0);  g = ay.Spline1(u,v,0);\r
+                       if(mgl_norm((pp[k]-pp[m])/dx)<dt*MGL_FLOW_ACC)  {       end = true;     break;  }\r
+               h = hypot(f,g); pp[k].c = gr->GetC(ss,s*h);\r
+               if(h<1e-5)      break;  // stationary point\r
+               k++;\r
+               // find next point by midpoint method\r
+               h+=1;   ff[0]=f*dt/h;   gg[0]=g*dt/h;\r
+               e = u+ff[0]/2;  h = v+gg[0]/2;\r
+               x.Spline1(dif,e,0,0);   f = ax.Spline1(e,h,0)/dif.x;\r
+               y.Spline1(dif,h,0,0);   g = ay.Spline1(e,h,0)/dif.x;\r
+               h = 1+hypot(f,g);       ff[1]=f*dt/h;   gg[1]=g*dt/h;\r
+               e = u+ff[1]/2;  h = v+gg[1]/2;\r
+               x.Spline1(dif,e,0,0);   f = ax.Spline1(e,h,0)/dif.x;\r
+               y.Spline1(dif,h,0,0);   g = ay.Spline1(e,h,0)/dif.x;\r
+               h = 1+hypot(f,g);       ff[2]=f*dt/h;   gg[2]=g*dt/h;\r
+               e = u+ff[2];    h = v+gg[2];\r
+               x.Spline1(dif,e,0,0);   f = ax.Spline1(e,h,0)/dif.x;\r
+               y.Spline1(dif,h,0,0);   g = ay.Spline1(e,h,0)/dif.x;\r
+               h = 1+hypot(f,g);       ff[3]=f*dt/h;   gg[3]=g*dt/h;\r
+               u += ff[0]/6+ff[1]/3+ff[2]/3+ff[3]/6;\r
+               v += gg[0]/6+gg[1]/3+gg[2]/3+gg[3]/6;\r
+               // condition of end\r
+               end = end || k>=n || u<0 || v<0 || u>1 || v>1;\r
+       } while(!end);\r
+       else do{\r
+               mglPoint dif;\r
+               register mreal xu,xv,yu,yv,det,xx,yy;\r
+                       pp[k].x = x.Spline1(dif,u,v,0); xu=dif.x;       xv=dif.y;\r
+                       pp[k].y = y.Spline1(dif,u,v,0); yu=dif.x;       yv=dif.y;\r
+                       xx = ax.Spline1(u,v,0); yy = ay.Spline1(u,v,0);\r
+                       det = xv*yu-xu*yv;      f = (yy*xv-xx*yv)/det;  g = (xx*yu-yy*xu)/det;\r
+               pp[k].z = zVal;\r
+               for(m=0;m<k-1;m++)      // determines encircle\r
+                       if(mgl_norm((pp[k]-pp[m])/dx)<dt*MGL_FLOW_ACC)  {       end = true;     break;  }\r
                h = hypot(f,g); pp[k].c = gr->GetC(ss,s*h);\r
                if(h<1e-5)      break;  // stationary point\r
                k++;\r
                // find next point by midpoint method\r
                h+=1;   ff[0]=f*dt/h;   gg[0]=g*dt/h;\r
                e = u+ff[0]/2;  h = v+gg[0]/2;\r
-               f = ax.Spline1(e,h,0);  g = ay.Spline1(e,h,0);\r
+                       x.Spline1(dif,e,h,0);   xu=dif.x;       xv=dif.y;\r
+                       y.Spline1(dif,e,h,0);   yu=dif.x;       yv=dif.y;\r
+                       xx = ax.Spline1(e,h,0); yy = ay.Spline1(e,h,0);\r
+                       det = xv*yu-xu*yv;      f = (yy*xv-xx*yv)/det;  g = (xx*yu-yy*xu)/det;\r
                h = 1+hypot(f,g);       ff[1]=f*dt/h;   gg[1]=g*dt/h;\r
                e = u+ff[1]/2;  h = v+gg[1]/2;\r
-               f = ax.Spline1(e,h,0);  g = ay.Spline1(e,h,0);\r
+                       x.Spline1(dif,e,h,0);   xu=dif.x;       xv=dif.y;\r
+                       y.Spline1(dif,e,h,0);   yu=dif.x;       yv=dif.y;\r
+                       xx = ax.Spline1(e,h,0); yy = ay.Spline1(e,h,0);\r
+                       det = xv*yu-xu*yv;      f = (yy*xv-xx*yv)/det;  g = (xx*yu-yy*xu)/det;\r
                h = 1+hypot(f,g);       ff[2]=f*dt/h;   gg[2]=g*dt/h;\r
                e = u+ff[2];    h = v+gg[2];\r
-               f = ax.Spline1(e,h,0);  g = ay.Spline1(e,h,0);\r
+                       x.Spline1(dif,e,h,0);   xu=dif.x;       xv=dif.y;\r
+                       y.Spline1(dif,e,h,0);   yu=dif.x;       yv=dif.y;\r
+                       xx = ax.Spline1(e,h,0); yy = ay.Spline1(e,h,0);\r
+                       det = xv*yu-xu*yv;      f = (yy*xv-xx*yv)/det;  g = (xx*yu-yy*xu)/det;\r
                h = 1+hypot(f,g);       ff[3]=f*dt/h;   gg[3]=g*dt/h;\r
                u += ff[0]/6+ff[1]/3+ff[2]/3+ff[3]/6;\r
                v += gg[0]/6+gg[1]/3+gg[2]/3+gg[3]/6;\r
@@ -696,34 +738,94 @@ void flow(mglBase *gr, double u, double v, double w, const mglData &x, const mgl
 \r
        nn = (ax.nx > ax.ny ? ax.nx : ax.ny);\r
        nn = (nn > ax.nz ? nn : ax.nz);\r
-       mreal dt = 0.2/nn, e,f,g,ee[4],ff[4],gg[4],h,s=1,u1,v1,w1;\r
+       mreal dt = 0.2/nn, e,f,g,ee[4],ff[4],gg[4],h,s=2,u1,v1,w1;\r
        if(u<0 || v<0 || w<0)\r
-       {       dt = -dt;       u = -u;         v = -v;         w = -w;         s = -1;}\r
+       {       dt = -dt;       u = -u; v = -v; w = -w; s *= -1;}\r
        register long k=0,m;\r
        bool end = false;\r
-       do{\r
-               pp[k].x = nboth ? x.Spline1(u,0,0):x.Spline1(u,v,w);\r
-               pp[k].y = nboth ? y.Spline1(v,0,0):y.Spline1(u,v,w);\r
-               pp[k].z = nboth ? z.Spline1(w,0,0):z.Spline1(u,v,w);\r
+       if(nboth) do{\r
+               mglPoint dif;\r
+               pp[k].x = x.Spline1(dif,u,0,0); e = ax.Spline1(u,v,w)/dif.x;\r
+               pp[k].y = y.Spline1(dif,v,0,0); f = ay.Spline1(u,v,w)/dif.x;\r
+               pp[k].z = z.Spline1(dif,w,0,0); g = az.Spline1(u,v,w)/dif.x;\r
+               for(m=0;m<k-1;m++)      // determines encircle\r
+                       if(mgl_norm((pp[k]-pp[m])/dx)<dt*MGL_FLOW_ACC)  {       end = true;     break;  }\r
+               h = sqrt(e*e+f*f+g*g);  pp[k].c = gr->GetC(ss,s*h);\r
+               if(h<1e-5)      break;  // stationary point\r
+               k++;\r
+               // find next point by midpoint method\r
+               h+=1;   ee[0]=e*dt/h;   ff[0]=f*dt/h;   gg[0]=g*dt/h;\r
+               u1 = u+ee[0]/2; v1 = v+ff[0]/2; w1 = w+gg[0]/2;\r
+               x.Spline1(dif,u1,0,0);  e = ax.Spline1(u1,v1,w1)/dif.x;\r
+               y.Spline1(dif,v1,0,0);  f = ay.Spline1(u1,v1,w1)/dif.x;\r
+               z.Spline1(dif,w1,0,0);  g = az.Spline1(u1,v1,w1)/dif.x;\r
+               h = 1+sqrt(e*e+f*f+g*g);\r
+               ee[1]=e*dt/h;   ff[1]=f*dt/h;   gg[1]=g*dt/h;\r
+               u1 = u+ee[1]/2; v1 = v+ff[1]/2; w1 = w+gg[1]/2;\r
+               x.Spline1(dif,u1,0,0);  e = ax.Spline1(u1,v1,w1)/dif.x;\r
+               y.Spline1(dif,v1,0,0);  f = ay.Spline1(u1,v1,w1)/dif.x;\r
+               z.Spline1(dif,w1,0,0);  g = az.Spline1(u1,v1,w1)/dif.x;\r
+               h = 1+sqrt(e*e+f*f+g*g);\r
+               ee[2]=e*dt/h;   ff[2]=f*dt/h;   gg[2]=g*dt/h;\r
+               u1 = u+ee[2];   v1 = v+ff[2];   w1 = w+gg[2];\r
+               x.Spline1(dif,u1,0,0);  e = ax.Spline1(u1,v1,w1)/dif.x;\r
+               y.Spline1(dif,v1,0,0);  f = ay.Spline1(u1,v1,w1)/dif.x;\r
+               z.Spline1(dif,w1,0,0);  g = az.Spline1(u1,v1,w1)/dif.x;\r
+               h = 1+sqrt(e*e+f*f+g*g);\r
+               ee[3]=e*dt/h;   ff[3]=f*dt/h;   gg[3]=g*dt/h;\r
+               u += ee[0]/6+ee[1]/3+ee[2]/3+ee[3]/6;\r
+               v += ff[0]/6+ff[1]/3+ff[2]/3+ff[3]/6;\r
+               w += gg[0]/6+gg[1]/3+gg[2]/3+gg[3]/6;\r
+               // condition of end\r
+               end = end || k>=n || u<0 || v<0 || u>1 || v>1 || w<0 || w>1;\r
+       } while(!end);\r
+       else do{\r
+               mglPoint dif;\r
+               register mreal xu,xv,xw,yu,yv,yw,zv,zu,zw,det,xx,yy,zz;\r
+               pp[k].x = x.Spline1(dif,u,v,w); xu=dif.x;       xv=dif.y;       xw=dif.z;\r
+               pp[k].y = y.Spline1(dif,u,v,w); yu=dif.x;       yv=dif.y;       yw=dif.z;\r
+               pp[k].z = z.Spline1(dif,u,v,w); zu=dif.x;       zv=dif.y;       zw=dif.z;\r
+               xx = ax.Spline1(u,v,w); yy = ay.Spline1(u,v,w); zz = az.Spline1(u,v,w);\r
+               det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu;\r
+               e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det;\r
+               f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det;\r
+               g = (-xu*yv*zz+xv*yu*zz+xu*yy*zv-xx*yu*zv-xv*yy*zu+xx*yv*zu)/det;\r
                for(m=0;m<k-1;m++)      // determines encircle\r
                        if(mgl_norm((pp[k]-pp[m])/dx)<dt/10.)   {       end = true;     break;  }\r
-               e = ax.Spline1(u,v,w);  f = ay.Spline1(u,v,w);  g = az.Spline1(u,v,w);\r
                h = sqrt(e*e+f*f+g*g);  pp[k].c = gr->GetC(ss,s*h);\r
                if(h<1e-5)      break;  // stationary point\r
                k++;\r
                // find next point by midpoint method\r
                h+=1;   ee[0]=e*dt/h;   ff[0]=f*dt/h;   gg[0]=g*dt/h;\r
                u1 = u+ee[0]/2; v1 = v+ff[0]/2; w1 = w+gg[0]/2;\r
-               e = ax.Spline1(u1,v1,w1);       f = ay.Spline1(u1,v1,w1);\r
-               g = az.Spline1(u1,v1,w1);       h = 1+sqrt(e*e+f*f+g*g);\r
+               x.Spline1(dif,u1,v1,w1);        xu=dif.x;       xv=dif.y;       xw=dif.z;       xx = ax.Spline1(u1,v1,w1);\r
+               y.Spline1(dif,u1,v1,w1);        yu=dif.x;       yv=dif.y;       yw=dif.z;       yy = ay.Spline1(u1,v1,w1);\r
+               z.Spline1(dif,u1,v1,w1);        zu=dif.x;       zv=dif.y;       zw=dif.z;       zz = az.Spline1(u1,v1,w1);\r
+               det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu;\r
+               e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det;\r
+               f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det;\r
+               g = (-xu*yv*zz+xv*yu*zz+xu*yy*zv-xx*yu*zv-xv*yy*zu+xx*yv*zu)/det;\r
+               h = 1+sqrt(e*e+f*f+g*g);\r
                ee[1]=e*dt/h;   ff[1]=f*dt/h;   gg[1]=g*dt/h;\r
                u1 = u+ee[1]/2; v1 = v+ff[1]/2; w1 = w+gg[1]/2;\r
-               e = ax.Spline1(u1,v1,w1);       f = ay.Spline1(u1,v1,w1);\r
-               g = az.Spline1(u1,v1,w1);       h = 1+sqrt(e*e+f*f+g*g);\r
+               x.Spline1(dif,u1,v1,w1);        xu=dif.x;       xv=dif.y;       xw=dif.z;       xx = ax.Spline1(u1,v1,w1);\r
+               y.Spline1(dif,u1,v1,w1);        yu=dif.x;       yv=dif.y;       yw=dif.z;       yy = ay.Spline1(u1,v1,w1);\r
+               z.Spline1(dif,u1,v1,w1);        zu=dif.x;       zv=dif.y;       zw=dif.z;       zz = az.Spline1(u1,v1,w1);\r
+               det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu;\r
+               e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det;\r
+               f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det;\r
+               g = (-xu*yv*zz+xv*yu*zz+xu*yy*zv-xx*yu*zv-xv*yy*zu+xx*yv*zu)/det;\r
+               h = 1+sqrt(e*e+f*f+g*g);\r
                ee[2]=e*dt/h;   ff[2]=f*dt/h;   gg[2]=g*dt/h;\r
                u1 = u+ee[2];   v1 = v+ff[2];   w1 = w+gg[2];\r
-               e = ax.Spline1(u1,v1,w1);       f = ay.Spline1(u1,v1,w1);\r
-               g = az.Spline1(u1,v1,w1);       h = 1+sqrt(e*e+f*f+g*g);\r
+               x.Spline1(dif,u1,v1,w1);        xu=dif.x;       xv=dif.y;       xw=dif.z;       xx = ax.Spline1(u1,v1,w1);\r
+               y.Spline1(dif,u1,v1,w1);        yu=dif.x;       yv=dif.y;       yw=dif.z;       yy = ay.Spline1(u1,v1,w1);\r
+               z.Spline1(dif,u1,v1,w1);        zu=dif.x;       zv=dif.y;       zw=dif.z;       zz = az.Spline1(u1,v1,w1);\r
+               det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu;\r
+               e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det;\r
+               f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det;\r
+               g = (-xu*yv*zz+xv*yu*zz+xu*yy*zv-xx*yu*zv-xv*yy*zu+xx*yv*zu)/det;\r
+               h = 1+sqrt(e*e+f*f+g*g);\r
                ee[3]=e*dt/h;   ff[3]=f*dt/h;   gg[3]=g*dt/h;\r
                u += ee[0]/6+ee[1]/3+ee[2]/3+ee[3]/6;\r
                v += ff[0]/6+ff[1]/3+ff[2]/3+ff[3]/6;\r
@@ -740,8 +842,8 @@ void flow(mglBase *gr, double u, double v, double w, const mglData &x, const mgl
 \r
                gr->Reserve(4*k);       j = gr->AddPnt(pp[0],pp[0].c);\r
                l = pp[1] - pp[0];      l /= mgl_norm(l);\r
-               q1 = mglPoint(l.y,-l.x,0);      ll = mgl_norm(q1);\r
-               if(ll)  q1 /= ll;       else    q1 = mglPoint(0,1,0);\r
+               q1.Set(l.y,-l.x,0);     ll = mgl_norm(q1);\r
+               if(ll)  q1 /= ll;       else    q1.Set(0,1,0);\r
                q2 = q1^l;\r
                if(xo)  {       n1 = gr->AddPnt(pp[0],-1,q2);   n2 = gr->AddPnt(pp[0]+rr*q1,-1,q2);     }\r
                if(zo)  {       n3 = gr->AddPnt(pp[0],-1,q1);   n4 = gr->AddPnt(pp[0]+rr*q2,-1,q1);     }\r
@@ -977,18 +1079,18 @@ void MGL_NO_EXPORT flowr(mglBase *gr, double zVal, double u, double v, const mgl
        mreal *cc = new mreal[n];\r
        mglPoint dx(1/fabs(gr->Max.x-gr->Min.x),1/fabs(gr->Max.y-gr->Min.y),1/fabs(gr->Max.z-gr->Min.z));\r
 \r
-       mreal dt = 0.5/(ax.nx > ax.ny ? ax.nx : ax.ny),e,f,g,ff[4],gg[4],h,s=1;\r
-       mreal ss =      4./mgl_ipow(gr->Max.c - gr->Min.c,2);\r
-       if(u<0 || v<0)  {       dt = -dt;       u = -u;         v = -v;         s = -1;}\r
+       mreal dt = 0.5/(ax.nx > ax.ny ? ax.nx : ax.ny),e,f,g,ff[4],gg[4],h,s=2;\r
+       mreal ss = 16./mgl_ipow(gr->Max.c - gr->Min.c,2);\r
+       if(u<0 || v<0)  {       dt = -dt;       u = -u; v = -v; s *= -1;}\r
        register long k=0,m;\r
        bool end = false;\r
-       do{\r
-               pp[k].x = nboth ? x.Spline1(u,0,0):x.Spline1(u,v,0);\r
-               pp[k].y = nboth ? y.Spline1(v,0,0):y.Spline1(u,v,0);\r
+       if(nboth) do{\r
+               mglPoint dif;\r
+               pp[k].x = x.Spline1(dif,u,0,0); f = ax.Spline1(u,v,0)/dif.x;\r
+               pp[k].y = y.Spline1(dif,v,0,0); g = ay.Spline1(u,v,0)/dif.x;\r
                pp[k].z = zVal;\r
                for(m=0;m<k-1;m++)      // determines encircle\r
-                       if(mgl_norm((pp[k]-pp[m])/dx)<dt/10.)   {       end = true;     break;  }\r
-               f = ax.Spline1(u,v,0);  g = ay.Spline1(u,v,0);\r
+                       if(mgl_norm((pp[k]-pp[m])/dx)<dt*MGL_FLOW_ACC)  {       end = true;     break;  }\r
                h = hypot(f,g); cc[k] = gr->GetC(sc,s*h);\r
                pp[k].c = r0>0 ? r0*sqrt(1e-2+ss*h*h)/2 : -r0/sqrt(1e-2+ss*h*h)/5;\r
                if(h<1e-5)      break;  // stationary point\r
@@ -996,14 +1098,56 @@ void MGL_NO_EXPORT flowr(mglBase *gr, double zVal, double u, double v, const mgl
                // find next point by midpoint method\r
                h+=1;   ff[0]=f*dt/h;   gg[0]=g*dt/h;\r
                e = u+ff[0]/2;  h = v+gg[0]/2;\r
-               f = ax.Spline1(e,h,0);  g = ay.Spline1(e,h,0);  h = 1+hypot(f,g);\r
-               ff[1]=f*dt/h;   gg[1]=g*dt/h;\r
+               x.Spline1(dif,e,0,0);   f = ax.Spline1(e,h,0)/dif.x;\r
+               y.Spline1(dif,h,0,0);   g = ay.Spline1(e,h,0)/dif.x;\r
+               h = 1+hypot(f,g);       ff[1]=f*dt/h;   gg[1]=g*dt/h;\r
                e = u+ff[1]/2;  h = v+gg[1]/2;\r
-               f = ax.Spline1(e,h,0);  g = ay.Spline1(e,h,0);  h = 1+hypot(f,g);\r
-               ff[2]=f*dt/h;   gg[2]=g*dt/h;\r
+               x.Spline1(dif,e,0,0);   f = ax.Spline1(e,h,0)/dif.x;\r
+               y.Spline1(dif,h,0,0);   g = ay.Spline1(e,h,0)/dif.x;\r
+               h = 1+hypot(f,g);       ff[2]=f*dt/h;   gg[2]=g*dt/h;\r
                e = u+ff[2];    h = v+gg[2];\r
-               f = ax.Spline1(e,h,0);  g = ay.Spline1(e,h,0);  h = 1+hypot(f,g);\r
-               ff[3]=f*dt/h;   gg[3]=g*dt/h;\r
+               x.Spline1(dif,e,0,0);   f = ax.Spline1(e,h,0)/dif.x;\r
+               y.Spline1(dif,h,0,0);   g = ay.Spline1(e,h,0)/dif.x;\r
+               h = 1+hypot(f,g);       ff[3]=f*dt/h;   gg[3]=g*dt/h;\r
+               u += ff[0]/6+ff[1]/3+ff[2]/3+ff[3]/6;\r
+               v += gg[0]/6+gg[1]/3+gg[2]/3+gg[3]/6;\r
+               // condition of end\r
+               end = end || k>=n || u<0 || v<0 || u>1 || v>1;\r
+       } while(!end);\r
+       else do{\r
+               mglPoint dif;\r
+               register mreal xu,xv,yu,yv,det,xx,yy;\r
+                       pp[k].x = x.Spline1(dif,u,v,0); xu=dif.x;       xv=dif.y;\r
+                       pp[k].y = y.Spline1(dif,u,v,0); yu=dif.x;       yv=dif.y;\r
+                       xx = ax.Spline1(u,v,0); yy = ay.Spline1(u,v,0);\r
+                       det = xv*yu-xu*yv;      f = (yy*xv-xx*yv)/det;  g = (xx*yu-yy*xu)/det;\r
+               pp[k].z = zVal;\r
+               for(m=0;m<k-1;m++)      // determines encircle\r
+                       if(mgl_norm((pp[k]-pp[m])/dx)<dt*MGL_FLOW_ACC)  {       end = true;     break;  }\r
+               h = hypot(f,g); cc[k] = gr->GetC(sc,s*h);\r
+               pp[k].c = r0>0 ? r0*sqrt(1e-2+ss*h*h)/2 : -r0/sqrt(1e-2+ss*h*h)/5;\r
+               if(h<1e-5)      break;  // stationary point\r
+               k++;\r
+               // find next point by midpoint method\r
+               h+=1;   ff[0]=f*dt/h;   gg[0]=g*dt/h;\r
+               e = u+ff[0]/2;  h = v+gg[0]/2;\r
+                       x.Spline1(dif,e,h,0);   xu=dif.x;       xv=dif.y;\r
+                       y.Spline1(dif,e,h,0);   yu=dif.x;       yv=dif.y;\r
+                       xx = ax.Spline1(e,h,0); yy = ay.Spline1(e,h,0);\r
+                       det = xv*yu-xu*yv;      f = (yy*xv-xx*yv)/det;  g = (xx*yu-yy*xu)/det;\r
+               h = 1+hypot(f,g);       ff[1]=f*dt/h;   gg[1]=g*dt/h;\r
+               e = u+ff[1]/2;  h = v+gg[1]/2;\r
+                       x.Spline1(dif,e,h,0);   xu=dif.x;       xv=dif.y;\r
+                       y.Spline1(dif,e,h,0);   yu=dif.x;       yv=dif.y;\r
+                       xx = ax.Spline1(e,h,0); yy = ay.Spline1(e,h,0);\r
+                       det = xv*yu-xu*yv;      f = (yy*xv-xx*yv)/det;  g = (xx*yu-yy*xu)/det;\r
+               h = 1+hypot(f,g);       ff[2]=f*dt/h;   gg[2]=g*dt/h;\r
+               e = u+ff[2];    h = v+gg[2];\r
+                       x.Spline1(dif,e,h,0);   xu=dif.x;       xv=dif.y;\r
+                       y.Spline1(dif,e,h,0);   yu=dif.x;       yv=dif.y;\r
+                       xx = ax.Spline1(e,h,0); yy = ay.Spline1(e,h,0);\r
+                       det = xv*yu-xu*yv;      f = (yy*xv-xx*yv)/det;  g = (xx*yu-yy*xu)/det;\r
+               h = 1+hypot(f,g);       ff[3]=f*dt/h;   gg[3]=g*dt/h;\r
                u += ff[0]/6+ff[1]/3+ff[2]/3+ff[3]/6;\r
                v += gg[0]/6+gg[1]/3+gg[2]/3+gg[3]/6;\r
                // condition of end\r
@@ -1125,20 +1269,63 @@ void flowr(mglBase *gr, double u, double v, double w, const mglData &x, const mg
 \r
        nn = (ax.nx > ax.ny ? ax.nx : ax.ny);\r
        nn = (nn > ax.nz ? nn : ax.nz);\r
-       mreal dt = 0.2/nn, e,f,g,ee[4],ff[4],gg[4],h,s=1,u1,v1,w1;\r
-       mreal ss =      4./mgl_ipow(gr->Max.c - gr->Min.c,2);\r
+       mreal dt = 0.2/nn, e,f,g,ee[4],ff[4],gg[4],h,s=2,u1,v1,w1;\r
+       mreal ss = 16./mgl_ipow(gr->Max.c - gr->Min.c,2);\r
 \r
        if(u<0 || v<0 || w<0)\r
-       {       dt = -dt;       u = -u;         v = -v;         w = -w;         s = -1;}\r
+       {       dt = -dt;       u = -u; v = -v; w = -w; s *= -1;}\r
        register long k=0,m;\r
        bool end = false;\r
-       do{\r
-               pp[k].x = nboth ? x.Spline1(u,0,0):x.Spline1(u,v,w);\r
-               pp[k].y = nboth ? y.Spline1(v,0,0):y.Spline1(u,v,w);\r
-               pp[k].z = nboth ? z.Spline1(w,0,0):z.Spline1(u,v,w);\r
+       if(nboth) do{\r
+               mglPoint dif;\r
+               pp[k].x = x.Spline1(dif,u,0,0); e = ax.Spline1(u,v,w)/dif.x;\r
+               pp[k].y = y.Spline1(dif,v,0,0); f = ay.Spline1(u,v,w)/dif.x;\r
+               pp[k].z = z.Spline1(dif,w,0,0); g = az.Spline1(u,v,w)/dif.x;\r
+               for(m=0;m<k-1;m++)      // determines encircle\r
+                       if(mgl_norm((pp[k]-pp[m])/dx)<dt*MGL_FLOW_ACC)  {       end = true;     break;  }\r
+               h = sqrt(e*e+f*f+g*g);  cc[k] = gr->GetC(sc,s*h);\r
+               pp[k].c = r0>0 ? r0*sqrt(1e-2+ss*h*h)/2 : -r0/sqrt(1e-2+ss*h*h)/5;\r
+               if(h<1e-5)      break;  // stationary point\r
+               k++;\r
+               // find next point by midpoint method\r
+               h+=1;   ee[0]=e*dt/h;   ff[0]=f*dt/h;   gg[0]=g*dt/h;\r
+               u1 = u+ee[0]/2; v1 = v+ff[0]/2; w1 = w+gg[0]/2;\r
+               x.Spline1(dif,u1,0,0);  e = ax.Spline1(u1,v1,w1)/dif.x;\r
+               y.Spline1(dif,v1,0,0);  f = ay.Spline1(u1,v1,w1)/dif.x;\r
+               z.Spline1(dif,w1,0,0);  g = az.Spline1(u1,v1,w1)/dif.x;\r
+               h = 1+sqrt(e*e+f*f+g*g);\r
+               ee[1]=e*dt/h;   ff[1]=f*dt/h;   gg[1]=g*dt/h;\r
+               u1 = u+ee[1]/2; v1 = v+ff[1]/2; w1 = w+gg[1]/2;\r
+               x.Spline1(dif,u1,0,0);  e = ax.Spline1(u1,v1,w1)/dif.x;\r
+               y.Spline1(dif,v1,0,0);  f = ay.Spline1(u1,v1,w1)/dif.x;\r
+               z.Spline1(dif,w1,0,0);  g = az.Spline1(u1,v1,w1)/dif.x;\r
+               h = 1+sqrt(e*e+f*f+g*g);\r
+               ee[2]=e*dt/h;   ff[2]=f*dt/h;   gg[2]=g*dt/h;\r
+               u1 = u+ee[2];   v1 = v+ff[2];   w1 = w+gg[2];\r
+               x.Spline1(dif,u1,0,0);  e = ax.Spline1(u1,v1,w1)/dif.x;\r
+               y.Spline1(dif,v1,0,0);  f = ay.Spline1(u1,v1,w1)/dif.x;\r
+               z.Spline1(dif,w1,0,0);  g = az.Spline1(u1,v1,w1)/dif.x;\r
+               h = 1+sqrt(e*e+f*f+g*g);\r
+               ee[3]=e*dt/h;   ff[3]=f*dt/h;   gg[3]=g*dt/h;\r
+               u += ee[0]/6+ee[1]/3+ee[2]/3+ee[3]/6;\r
+               v += ff[0]/6+ff[1]/3+ff[2]/3+ff[3]/6;\r
+               w += gg[0]/6+gg[1]/3+gg[2]/3+gg[3]/6;\r
+               // condition of end\r
+               end = end || k>=n || u<0 || v<0 || u>1 || v>1 || w<0 || w>1;\r
+       } while(!end);\r
+       else do{\r
+               mglPoint dif;\r
+               register mreal xu,xv,xw,yu,yv,yw,zv,zu,zw,det,xx,yy,zz;\r
+               pp[k].x = x.Spline1(dif,u,v,w); xu=dif.x;       xv=dif.y;       xw=dif.z;\r
+               pp[k].y = y.Spline1(dif,u,v,w); yu=dif.x;       yv=dif.y;       yw=dif.z;\r
+               pp[k].z = z.Spline1(dif,u,v,w); zu=dif.x;       zv=dif.y;       zw=dif.z;\r
+               xx = ax.Spline1(u,v,w); yy = ay.Spline1(u,v,w); zz = az.Spline1(u,v,w);\r
+               det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu;\r
+               e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det;\r
+               f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det;\r
+               g = (-xu*yv*zz+xv*yu*zz+xu*yy*zv-xx*yu*zv-xv*yy*zu+xx*yv*zu)/det;\r
                for(m=0;m<k-1;m++)      // determines encircle\r
                        if(mgl_norm((pp[k]-pp[m])/dx)<dt/10.)   {       end = true;     break;  }\r
-               e = ax.Spline1(u,v,w);  f = ay.Spline1(u,v,w);  g = az.Spline1(u,v,w);\r
                h = sqrt(e*e+f*f+g*g);  cc[k] = gr->GetC(sc,s*h);\r
                pp[k].c = r0>0 ? r0*sqrt(1e-2+ss*h*h)/2 : -r0/sqrt(1e-2+ss*h*h)/5;\r
                if(h<1e-5)      break;  // stationary point\r
@@ -1146,16 +1333,34 @@ void flowr(mglBase *gr, double u, double v, double w, const mglData &x, const mg
                // find next point by midpoint method\r
                h+=1;   ee[0]=e*dt/h;   ff[0]=f*dt/h;   gg[0]=g*dt/h;\r
                u1 = u+ee[0]/2; v1 = v+ff[0]/2; w1 = w+gg[0]/2;\r
-               e = ax.Spline1(u1,v1,w1);       f = ay.Spline1(u1,v1,w1);\r
-               g = az.Spline1(u1,v1,w1);       h = 1+sqrt(e*e+f*f+g*g);\r
+               x.Spline1(dif,u1,v1,w1);        xu=dif.x;       xv=dif.y;       xw=dif.z;       xx = ax.Spline1(u1,v1,w1);\r
+               y.Spline1(dif,u1,v1,w1);        yu=dif.x;       yv=dif.y;       yw=dif.z;       yy = ay.Spline1(u1,v1,w1);\r
+               z.Spline1(dif,u1,v1,w1);        zu=dif.x;       zv=dif.y;       zw=dif.z;       zz = az.Spline1(u1,v1,w1);\r
+               det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu;\r
+               e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det;\r
+               f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det;\r
+               g = (-xu*yv*zz+xv*yu*zz+xu*yy*zv-xx*yu*zv-xv*yy*zu+xx*yv*zu)/det;\r
+               h = 1+sqrt(e*e+f*f+g*g);\r
                ee[1]=e*dt/h;   ff[1]=f*dt/h;   gg[1]=g*dt/h;\r
                u1 = u+ee[1]/2; v1 = v+ff[1]/2; w1 = w+gg[1]/2;\r
-               e = ax.Spline1(u1,v1,w1);       f = ay.Spline1(u1,v1,w1);\r
-               g = az.Spline1(u1,v1,w1);       h = 1+sqrt(e*e+f*f+g*g);\r
+               x.Spline1(dif,u1,v1,w1);        xu=dif.x;       xv=dif.y;       xw=dif.z;       xx = ax.Spline1(u1,v1,w1);\r
+               y.Spline1(dif,u1,v1,w1);        yu=dif.x;       yv=dif.y;       yw=dif.z;       yy = ay.Spline1(u1,v1,w1);\r
+               z.Spline1(dif,u1,v1,w1);        zu=dif.x;       zv=dif.y;       zw=dif.z;       zz = az.Spline1(u1,v1,w1);\r
+               det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu;\r
+               e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det;\r
+               f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det;\r
+               g = (-xu*yv*zz+xv*yu*zz+xu*yy*zv-xx*yu*zv-xv*yy*zu+xx*yv*zu)/det;\r
+               h = 1+sqrt(e*e+f*f+g*g);\r
                ee[2]=e*dt/h;   ff[2]=f*dt/h;   gg[2]=g*dt/h;\r
                u1 = u+ee[2];   v1 = v+ff[2];   w1 = w+gg[2];\r
-               e = ax.Spline1(u1,v1,w1);       f = ay.Spline1(u1,v1,w1);\r
-               g = az.Spline1(u1,v1,w1);       h = 1+sqrt(e*e+f*f+g*g);\r
+               x.Spline1(dif,u1,v1,w1);        xu=dif.x;       xv=dif.y;       xw=dif.z;       xx = ax.Spline1(u1,v1,w1);\r
+               y.Spline1(dif,u1,v1,w1);        yu=dif.x;       yv=dif.y;       yw=dif.z;       yy = ay.Spline1(u1,v1,w1);\r
+               z.Spline1(dif,u1,v1,w1);        zu=dif.x;       zv=dif.y;       zw=dif.z;       zz = az.Spline1(u1,v1,w1);\r
+               det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu;\r
+               e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det;\r
+               f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det;\r
+               g = (-xu*yv*zz+xv*yu*zz+xu*yy*zv-xx*yu*zv-xv*yy*zu+xx*yv*zu)/det;\r
+               h = 1+sqrt(e*e+f*f+g*g);\r
                ee[3]=e*dt/h;   ff[3]=f*dt/h;   gg[3]=g*dt/h;\r
                u += ee[0]/6+ee[1]/3+ee[2]/3+ee[3]/6;\r
                v += ff[0]/6+ff[1]/3+ff[2]/3+ff[3]/6;\r
index c4bf96eda78becd4f3e64be933853fed10f86083..d36b11e6a6cd31e9302f2dc2d4be0f646f3561d3 100644 (file)
@@ -57,7 +57,7 @@ void MGL_EXPORT mgl_cloud_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const cha
        n /= tx;        m /= ty;        l /= tz;\r
        long *pos=new long[n*m*l];\r
        gr->Reserve(n*m*l);\r
-       mglPoint q=mglPoint(NAN);\r
+       mglPoint q(NAN);\r
        for(long k=0;k<l;k++)\r
        {\r
                if(gr->NeedStop())      break;\r
@@ -182,7 +182,7 @@ void MGL_EXPORT mgl_surf3_plot(HMGL gr, long n,long m,long *kx1,long *kx2,long *
                if(ni<3)        continue;\r
 \r
                for(jj=0;jj<ni;jj++)\r
-               {       pp[jj]=kk[id[jj]];      pd[jj]=long(pp[jj].c+0.5);      }\r
+               {       pp[jj]=kk[id[jj]];      pd[jj]=mgl_int(pp[jj].c);       }\r
                // remove points which is too close to first one\r
                for(jj=1;jj<ni;)\r
                {\r
@@ -235,90 +235,98 @@ void MGL_EXPORT mgl_surf3_plot(HMGL gr, long n,long m,long *kx1,long *kx2,long *
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_surf3_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, const char *opt)\r
+void MGL_NO_EXPORT mgl_surf3ca_gen(HMGL gr, double val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT c, HCDT b, const char *sch)\r
 {\r
-       long i,j,k,i1,n=a->GetNx(),m=a->GetNy(),l=a->GetNz();\r
-       long *kx1,*kx2,*ky1,*ky2,*kz;\r
-       bool nboth = !mgl_isboth(x,y,z,a);\r
+       long n=a->GetNx(),m=a->GetNy(),l=a->GetNz();\r
+       bool nboth = mgl_isnboth(x,y,z,a);\r
        int wire = mglchr(sch,'#')?1:0;\r
        if(mglchr(sch,'.'))     wire = 2;\r
-       mreal d;\r
-       if(mgl_check_dim3(gr,!nboth,x,y,z,a,0,"Surf3")) return;\r
-\r
-       gr->SaveState(opt);\r
-       static int cgid=1;      gr->StartGroup("Surf3",cgid++);\r
-\r
        bool inv = (mglchr(sch,'-'));\r
-       long ss = gr->AddTexture(sch), pos;\r
+       long ss = gr->AddTexture(sch);\r
 \r
-       kx1 = new long[n*m];    kx2 = new long[n*m];\r
-       ky1 = new long[n*m];    ky2 = new long[n*m];\r
-       kz  = new long[n*m];\r
-       mreal c=gr->GetC(ss,val);\r
+       long *kx1 = new long[n*m],      *kx2 = new long[n*m];\r
+       long *ky1 = new long[n*m],      *ky2 = new long[n*m];\r
+       long *kz  = new long[n*m];\r
        std::vector<mglPoint> kk;\r
-//     kk.reserve(n*m*l);\r
+       kk.reserve(n*m*l);\r
 \r
-       mglPoint p,q,u, p0;\r
-       mreal a0;\r
-       for(k=0;k<l;k++)\r
+       for(long k=0;k<l;k++)\r
        {\r
                if(gr->NeedStop())      break;\r
                memcpy(kx1,kx2,n*m*sizeof(long));       memset(kx2,-1,n*m*sizeof(long));\r
                memcpy(ky1,ky2,n*m*sizeof(long));       memset(ky2,-1,n*m*sizeof(long));\r
                memset(kz ,-1,n*m*sizeof(long));\r
                gr->Reserve(n*m);       gr->Reserve(n*m);\r
-               for(j=0;j<m;j++)        for(i=0;i<n;i++)\r
+               size_t kk1 = kk.size();\r
+               for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
                {\r
-                       i1 = i+n*j;             a0 = a->v(i,j,k);\r
-                       p0 = nboth? mglPoint(x->v(i), y->v(j), z->v(k)) : mglPoint(x->v(i,j,k), y->v(i,j,k), z->v(i,j,k));\r
+                       register long i1 = i+n*j;\r
+                       mreal a0 = a->v(i,j,k);\r
                        if(i<n-1)\r
                        {\r
-                               d = mgl_d(val,a0,a->v(i+1,j,k));\r
+                               mreal d = mgl_d(val,a0,a->v(i+1,j,k));\r
                                if(d>=0 && d<1)\r
-                               {\r
-                                       if(nboth)       p = mglPoint(p0.x*(1-d)+x->v(i+1)*d, p0.y, p0.z);\r
-                                       else    p = mglPoint(p0.x*(1-d)+x->v(i+1,j,k)*d, p0.y*(1-d)+y->v(i+1,j,k)*d, p0.z*(1-d)+z->v(i+1,j,k)*d);\r
-                                       u = mglPoint(i+d,j,k);\r
-                                       q = mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l);\r
-                                       pos = gr->AddPnt(p,c,q);        u.c=pos;\r
-                                       if(pos<0)       continue;\r
-                                       kx2[i1] = kk.size();    kk.push_back(u);\r
-                               }\r
+                               {       kx2[i1] = kk.size();    kk.push_back(mglPoint(i+d,j,k));        }\r
                        }\r
                        if(j<m-1)\r
                        {\r
-                               d = mgl_d(val,a0,a->v(i,j+1,k));\r
+                               mreal d = mgl_d(val,a0,a->v(i,j+1,k));\r
                                if(d>=0 && d<1)\r
-                               {\r
-                                       if(nboth)       p = mglPoint(p0.x, p0.y*(1-d)+y->v(j+1)*d, p0.z);\r
-                                       else    p = mglPoint(p0.x*(1-d)+x->v(i,j+1,k)*d, p0.y*(1-d)+y->v(i,j+1,k)*d, p0.z*(1-d)+z->v(i,j+1,k)*d);\r
-                                       u = mglPoint(i,j+d,k);\r
-                                       q = mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l);\r
-                                       pos = gr->AddPnt(p,c,q);        u.c=pos;\r
-                                       if(pos<0)       continue;\r
-                                       ky2[i1] = kk.size();    kk.push_back(u);\r
-                               }\r
+                               {       ky2[i1] = kk.size();    kk.push_back(mglPoint(i,j+d,k));        }\r
                        }\r
                        if(k>0)\r
-                       {\r
-                               d = mgl_d(val,a->v(i,j,k-1),a0);\r
+                       {       \r
+                               mreal d = mgl_d(val,a->v(i,j,k-1),a0);\r
                                if(d>=0 && d<1)\r
-                               {\r
-                                       if(nboth)       p = mglPoint(p0.x, p0.y, z->v(k-1)*(1-d)+p0.z*d);\r
-                                       else    p = mglPoint(x->v(i,j,k-1)*(1-d)+p0.x*d, y->v(i,j,k-1)*(1-d)+p0.y*d, z->v(i,j,k-1)*(1-d)+p0.z*d);\r
-                                       u = mglPoint(i,j,k+d-1);\r
-                                       q = mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l);\r
-                                       pos = gr->AddPnt(p,c,q);        u.c=pos;\r
-                                       if(pos<0)       continue;\r
-                                       kz[i1] = kk.size();     kk.push_back(u);\r
-                               }\r
+                               {       kz[i1] = kk.size();             kk.push_back(mglPoint(i,j,k+d-1));      }\r
                        }\r
                }\r
+               mreal cv=gr->GetC(ss,val);\r
+               if(b && c)      for(size_t i=kk1;i<kk.size();i++)\r
+               {\r
+                       mglPoint &u = kk[i];\r
+                       u.c = gr->AddPnt(nboth ? mglPoint(mgl_data_linear(x,u.x,0,0),mgl_data_linear(y,u.y,0,0),mgl_data_linear(z,u.z,0,0)) : \r
+                                                       mglPoint(mgl_data_linear(x,u.x,u.y,u.z),mgl_data_linear(y,u.x,u.y,u.z),mgl_data_linear(z,u.x,u.y,u.z)),\r
+                                       gr->GetC(ss,mgl_data_linear(c,u.x,u.y,u.z)),\r
+                                       mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l),\r
+                                       gr->GetA(mgl_data_linear(b,u.x,u.y,u.z)));\r
+               }\r
+               else if(c)      for(size_t i=kk1;i<kk.size();i++)\r
+               {\r
+                       mglPoint &u = kk[i];\r
+                       u.c = gr->AddPnt(nboth ? mglPoint(mgl_data_linear(x,u.x,0,0),mgl_data_linear(y,u.y,0,0),mgl_data_linear(z,u.z,0,0)) : \r
+                                                       mglPoint(mgl_data_linear(x,u.x,u.y,u.z),mgl_data_linear(y,u.x,u.y,u.z),mgl_data_linear(z,u.x,u.y,u.z)),\r
+                                               gr->GetC(ss,mgl_data_linear(c,u.x,u.y,u.z)),\r
+                                               mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l));\r
+               }\r
+               else if(b)      for(size_t i=kk1;i<kk.size();i++)\r
+               {\r
+                       mglPoint &u = kk[i];\r
+                       u.c = gr->AddPnt(nboth ? mglPoint(mgl_data_linear(x,u.x,0,0),mgl_data_linear(y,u.y,0,0),mgl_data_linear(z,u.z,0,0)) : \r
+                                                       mglPoint(mgl_data_linear(x,u.x,u.y,u.z),mgl_data_linear(y,u.x,u.y,u.z),mgl_data_linear(z,u.x,u.y,u.z)),\r
+                                       cv, mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l),\r
+                                       gr->GetA(mgl_data_linear(b,u.x,u.y,u.z)));\r
+               }\r
+               else    for(size_t i=kk1;i<kk.size();i++)\r
+               {\r
+                       mglPoint &u = kk[i];\r
+                       u.c = gr->AddPnt(nboth ? mglPoint(mgl_data_linear(x,u.x,0,0),mgl_data_linear(y,u.y,0,0),mgl_data_linear(z,u.z,0,0)) : \r
+                                                       mglPoint(mgl_data_linear(x,u.x,u.y,u.z),mgl_data_linear(y,u.x,u.y,u.z),mgl_data_linear(z,u.x,u.y,u.z)),\r
+                                               cv, mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l));\r
+               }\r
+               \r
                if(k>0) mgl_surf3_plot(gr,n,m,kx1,kx2,ky1,ky2,kz,kk,wire);\r
        }\r
-       gr->EndGroup();\r
        delete []kx1;   delete []kx2;   delete []ky1;\r
-       delete []ky2;   delete []kz;\r
+       delete []ky2;   delete []kz;    gr->EndGroup();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_surf3_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, const char *opt)\r
+{\r
+       if(mgl_check_dim3(gr,mgl_isboth(x,y,z,a),x,y,z,a,0,"Surf3"))    return;\r
+       gr->SaveState(opt);\r
+       static int cgid=1;      gr->StartGroup("Surf3",cgid++);\r
+       mgl_surf3ca_gen(gr, val, x, y, z, a, 0, 0, sch);\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_surf3_val(HMGL gr, double val, HCDT a, const char *sch, const char *opt)\r
@@ -378,92 +386,10 @@ void MGL_EXPORT mgl_surf3_(uintptr_t *gr, uintptr_t *a, const char *sch, const c
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_surf3a_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *sch, const char *opt)\r
 {\r
-       long i,j,k,i1,n=a->GetNx(),m=a->GetNy(),l=a->GetNz();\r
-       long *kx1,*kx2,*ky1,*ky2,*kz;\r
-       bool nboth = mgl_isnboth(x,y,z,a);\r
-       int wire = mglchr(sch,'#')?1:0;\r
-       if(mglchr(sch,'.'))     wire = 2;\r
-       mreal d;\r
-       if(mgl_check_dim3(gr,!nboth,x,y,z,a,b,"Surf3A"))        return;\r
-\r
+       if(mgl_check_dim3(gr,!mgl_isnboth(x,y,z,a),x,y,z,a,b,"Surf3A")) return;\r
        gr->SaveState(opt);\r
        static int cgid=1;      gr->StartGroup("Surf3A",cgid++);\r
-\r
-       bool inv = (mglchr(sch,'-'));\r
-       long ss = gr->AddTexture(sch), pos;\r
-\r
-       kx1 = new long[n*m];    kx2 = new long[n*m];\r
-       ky1 = new long[n*m];    ky2 = new long[n*m];\r
-       kz  = new long[n*m];\r
-       mreal c=gr->GetC(ss,val),aa;\r
-       std::vector<mglPoint> kk;\r
-       kk.reserve(n*m*l);\r
-\r
-       mglPoint p,q,u, p0;\r
-       mreal a0,b0;\r
-       for(k=0;k<l;k++)\r
-       {\r
-               if(gr->NeedStop())      break;\r
-               memcpy(kx1,kx2,n*m*sizeof(long));       memset(kx2,-1,n*m*sizeof(long));\r
-               memcpy(ky1,ky2,n*m*sizeof(long));       memset(ky2,-1,n*m*sizeof(long));\r
-               memset(kz ,-1,n*m*sizeof(long));\r
-               gr->Reserve(n*m);       gr->Reserve(n*m);\r
-               for(j=0;j<m;j++)        for(i=0;i<n;i++)\r
-               {\r
-                       i1 = i+n*j;\r
-                       a0 = a->v(i,j,k);       b0 = b->v(i,j,k);\r
-                       p0 = nboth? mglPoint(x->v(i), y->v(j), z->v(k)) : mglPoint(x->v(i,j,k), y->v(i,j,k), z->v(i,j,k));\r
-                       if(i<n-1)\r
-                       {\r
-                               d = mgl_d(val,a0,a->v(i+1,j,k));\r
-                               if(d>=0 && d<1)\r
-                               {\r
-                                       if(nboth)       p = mglPoint(p0.x*(1-d)+x->v(i+1)*d, p0.y, p0.z);\r
-                                       else    p = mglPoint(p0.x*(1-d)+x->v(i+1,j,k)*d, p0.y*(1-d)+y->v(i+1,j,k)*d, p0.z*(1-d)+z->v(i+1,j,k)*d);\r
-                                       aa = gr->GetA(b0*(1-d)+b->v(i+1,j,k)*d);\r
-                                       u = mglPoint(i+d,j,k);\r
-                                       q = mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l);\r
-                                       pos = gr->AddPnt(p,c,q,aa);     u.c=pos;\r
-                                       if(pos<0)       continue;\r
-                                       kx2[i1] = kk.size();    kk.push_back(u);\r
-                               }\r
-                       }\r
-                       if(j<m-1)\r
-                       {\r
-                               d = mgl_d(val,a0,a->v(i,j+1,k));\r
-                               if(d>=0 && d<1)\r
-                               {\r
-                                       if(nboth)       p = mglPoint(p0.x, p0.y*(1-d)+y->v(j+1)*d, p0.z);\r
-                                       else    p = mglPoint(p0.x*(1-d)+x->v(i,j+1,k)*d, p0.y*(1-d)+y->v(i,j+1,k)*d, p0.z*(1-d)+z->v(i,j+1,k)*d);\r
-                                       aa = gr->GetA(b0*(1-d)+b->v(i,j+1,k)*d);\r
-                                       u = mglPoint(i,j+d,k);\r
-                                       q = mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l);\r
-                                       pos = gr->AddPnt(p,c,q,aa);     u.c=pos;\r
-                                       if(pos<0)       continue;\r
-                                       ky2[i1] = kk.size();    kk.push_back(u);\r
-                               }\r
-                       }\r
-                       if(k>0)\r
-                       {\r
-                               d = mgl_d(val,a->v(i,j,k-1),a0);\r
-                               if(d>=0 && d<1)\r
-                               {\r
-                                       if(nboth)       p = mglPoint(p0.x, p0.y, z->v(k-1)*(1-d)+p0.z*d);\r
-                                       else    p = mglPoint(x->v(i,j,k-1)*(1-d)+p0.x*d, y->v(i,j,k-1)*(1-d)+p0.y*d, z->v(i,j,k-1)*(1-d)+p0.z*d);\r
-                                       aa = gr->GetA(b->v(i,j,k-1)*(1-d)+b0*d);\r
-                                       u = mglPoint(i,j,k+d-1);\r
-                                       q = mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l);\r
-                                       pos = gr->AddPnt(p,c,q,aa);     u.c=pos;\r
-                                       if(pos<0)       continue;\r
-                                       kz[i1] = kk.size();     kk.push_back(u);\r
-                               }\r
-                       }\r
-               }\r
-               if(k>0) mgl_surf3_plot(gr,n,m,kx1,kx2,ky1,ky2,kz,kk,wire);\r
-       }\r
-       gr->EndGroup();\r
-       delete []kx1;   delete []kx2;   delete []ky1;\r
-       delete []ky2;   delete []kz;\r
+       mgl_surf3ca_gen(gr, val, x, y, z, a, 0, b, sch);\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_surf3a_val(HMGL gr, double val, HCDT a, HCDT b, const char *sch, const char *opt)\r
@@ -535,94 +461,12 @@ void MGL_EXPORT mgl_surf3a_(uintptr_t *gr, uintptr_t *a, uintptr_t *b, const cha
 //     Surf3C series\r
 //\r
 //-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_surf3c_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *sch, const char *opt)\r
+void MGL_EXPORT mgl_surf3c_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT c, const char *sch, const char *opt)\r
 {\r
-       long i,j,k,i1,n=a->GetNx(),m=a->GetNy(),l=a->GetNz();\r
-       long *kx1,*kx2,*ky1,*ky2,*kz;\r
-       bool nboth = mgl_isnboth(x,y,z,a);\r
-       int wire = mglchr(sch,'#')?1:0;\r
-       if(mglchr(sch,'.'))     wire = 2;\r
-       mreal d;\r
-       if(mgl_check_dim3(gr,!nboth,x,y,z,a,b,"Surf3C"))        return;\r
-\r
+       if(mgl_check_dim3(gr,!mgl_isnboth(x,y,z,a),x,y,z,a,c,"Surf3C")) return;\r
        gr->SaveState(opt);\r
        static int cgid=1;      gr->StartGroup("Surf3C",cgid++);\r
-\r
-       bool inv = (mglchr(sch,'-'));\r
-       long ss = gr->AddTexture(sch), pos;\r
-\r
-       kx1 = new long[n*m];    kx2 = new long[n*m];\r
-       ky1 = new long[n*m];    ky2 = new long[n*m];\r
-       kz  = new long[n*m];\r
-       mreal c;\r
-       std::vector<mglPoint> kk;\r
-       kk.reserve(n*m*l);\r
-\r
-       mglPoint p,q,u, p0;\r
-       mreal a0,b0;\r
-       for(k=0;k<l;k++)\r
-       {\r
-               if(gr->NeedStop())      break;\r
-               memcpy(kx1,kx2,n*m*sizeof(long));       memset(kx2,-1,n*m*sizeof(long));\r
-               memcpy(ky1,ky2,n*m*sizeof(long));       memset(ky2,-1,n*m*sizeof(long));\r
-               memset(kz ,-1,n*m*sizeof(long));\r
-               gr->Reserve(n*m);       gr->Reserve(n*m);\r
-               for(j=0;j<m;j++)        for(i=0;i<n;i++)\r
-               {\r
-                       i1 = i+n*j;\r
-                       a0 = a->v(i,j,k);       b0 = b->v(i,j,k);\r
-                       p0 = nboth? mglPoint(x->v(i), y->v(j), z->v(k)) : mglPoint(x->v(i,j,k), y->v(i,j,k), z->v(i,j,k));\r
-                       if(i<n-1)\r
-                       {\r
-                               d = mgl_d(val,a0,a->v(i+1,j,k));\r
-                               if(d>=0 && d<1)\r
-                               {\r
-                                       if(nboth)       p = mglPoint(p0.x*(1-d)+x->v(i+1)*d, p0.y, p0.z);\r
-                                       else    p = mglPoint(p0.x*(1-d)+x->v(i+1,j,k)*d, p0.y*(1-d)+y->v(i+1,j,k)*d, p0.z*(1-d)+z->v(i+1,j,k)*d);\r
-                                       c = gr->GetC(ss,b0*(1-d)+b->v(i+1,j,k)*d);\r
-                                       u = mglPoint(i+d,j,k);\r
-                                       q = mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l);\r
-                                       pos = gr->AddPnt(p,c,q);        u.c=pos;\r
-                                       if(pos<0)       continue;\r
-                                       kx2[i1] = kk.size();    kk.push_back(u);\r
-                               }\r
-                       }\r
-                       if(j<m-1)\r
-                       {\r
-                               d = mgl_d(val,a0,a->v(i,j+1,k));\r
-                               if(d>=0 && d<1)\r
-                               {\r
-                                       if(nboth)       p = mglPoint(p0.x, p0.y*(1-d)+y->v(j+1)*d, p0.z);\r
-                                       else    p = mglPoint(p0.x*(1-d)+x->v(i,j+1,k)*d, p0.y*(1-d)+y->v(i,j+1,k)*d, p0.z*(1-d)+z->v(i,j+1,k)*d);\r
-                                       c = gr->GetC(ss,b0*(1-d)+b->v(i,j+1,k)*d);\r
-                                       u = mglPoint(i,j+d,k);\r
-                                       q = mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l);\r
-                                       pos = gr->AddPnt(p,c,q);        u.c=pos;\r
-                                       if(pos<0)       continue;\r
-                                       ky2[i1] = kk.size();    kk.push_back(u);\r
-                               }\r
-                       }\r
-                       if(k>0)\r
-                       {\r
-                               d = mgl_d(val,a->v(i,j,k-1),a0);\r
-                               if(d>=0 && d<1)\r
-                               {\r
-                                       if(nboth)       p = mglPoint(p0.x, p0.y, z->v(k-1)*(1-d)+p0.z*d);\r
-                                       else    p = mglPoint(x->v(i,j,k-1)*(1-d)+p0.x*d, y->v(i,j,k-1)*(1-d)+p0.y*d, z->v(i,j,k-1)*(1-d)+p0.z*d);\r
-                                       c = gr->GetC(ss,b->v(i,j,k-1)*(1-d)+b0*d);\r
-                                       u = mglPoint(i,j,k+d-1);\r
-                                       q = mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l);\r
-                                       pos = gr->AddPnt(p,c,q);        u.c=pos;\r
-                                       if(pos<0)       continue;\r
-                                       kz[i1] = kk.size();     kk.push_back(u);\r
-                               }\r
-                       }\r
-               }\r
-               if(k>0) mgl_surf3_plot(gr,n,m,kx1,kx2,ky1,ky2,kz,kk,wire);\r
-       }\r
-       gr->EndGroup();\r
-       delete []kx1;   delete []kx2;   delete []ky1;\r
-       delete []ky2;   delete []kz;\r
+       mgl_surf3ca_gen(gr, val, x, y, z, a, c, 0, sch);\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_surf3c_val(HMGL gr, double val, HCDT a, HCDT b, const char *sch, const char *opt)\r
@@ -680,6 +524,72 @@ void MGL_EXPORT mgl_surf3c_(uintptr_t *gr, uintptr_t *a, uintptr_t *b, const cha
        mgl_surf3c(_GR_, _DA_(a), _DA_(b), s, o);       delete []o;     delete []s;     }\r
 //-----------------------------------------------------------------------------\r
 //\r
+//     Surf3C series\r
+//\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_surf3ca_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT c, HCDT b, const char *sch, const char *opt)\r
+{\r
+       if(mgl_check_dim3(gr,!mgl_isnboth(x,y,z,a),x,y,z,a,c,"Surf3C") || mgl_check_dim3(gr,!mgl_isnboth(x,y,z,a),x,y,z,a,b,"Surf3C"))  return;\r
+       gr->SaveState(opt);\r
+       static int cgid=1;      gr->StartGroup("Surf3C",cgid++);\r
+       mgl_surf3ca_gen(gr, val, x, y, z, a, c, b, sch);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_surf3ca_val(HMGL gr, double val, HCDT a, HCDT c, HCDT b, const char *sch, const char *opt)\r
+{\r
+       gr->SaveState(opt);\r
+       mglDataV x(a->GetNx()), y(a->GetNy()),z(a->GetNz());\r
+       x.Fill(gr->Min.x,gr->Max.x);\r
+       y.Fill(gr->Min.y,gr->Max.y);\r
+       z.Fill(gr->Min.z,gr->Max.z);\r
+       mgl_surf3ca_xyz_val(gr,val,&x,&y,&z,a,c,b,sch,0);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_surf3ca_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, HCDT c, HCDT b, const char *sch, const char *opt)\r
+{\r
+       mreal r = gr->SaveState(opt);\r
+       long num = mgl_isnan(r)?3:long(r+0.5);\r
+       for(long i=0;i<num;i++)\r
+       {\r
+               mreal v = gr->Max.c + (gr->Min.c-gr->Max.c)*(i+1.)/(num+1);\r
+               mgl_surf3ca_xyz_val(gr,v,x,y,z,a,c,b,sch,0);\r
+       }\r
+       gr->LoadState();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_surf3ca(HMGL gr, HCDT a, HCDT c, HCDT b, const char *sch, const char *opt)\r
+{\r
+       gr->SaveState(opt);\r
+       mglDataV x(a->GetNx()), y(a->GetNy()),z(a->GetNz());\r
+       x.Fill(gr->Min.x,gr->Max.x);\r
+       y.Fill(gr->Min.y,gr->Max.y);\r
+       z.Fill(gr->Min.z,gr->Max.z);\r
+       mgl_surf3ca_xyz(gr,&x,&y,&z,a,c,b,sch,0);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_surf3ca_xyz_val_(uintptr_t *gr, mreal *Val, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *c, uintptr_t *b, const char *sch, const char *opt,int l,int lo)\r
+{      char *s=new char[l+1];  memcpy(s,sch,l);        s[l]=0;\r
+       char *o=new char[lo+1]; memcpy(o,opt,lo);       o[lo]=0;\r
+       mgl_surf3ca_xyz_val(_GR_, *Val, _DA_(x), _DA_(y), _DA_(z), _DA_(a), _DA_(c), _DA_(b), s, o);\r
+       delete []o;     delete []s;     }\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_surf3ca_val_(uintptr_t *gr, mreal *Val, uintptr_t *a, uintptr_t *c, uintptr_t *b, const char *sch, const char *opt,int l,int lo)\r
+{      char *s=new char[l+1];  memcpy(s,sch,l);        s[l]=0;\r
+       char *o=new char[lo+1]; memcpy(o,opt,lo);       o[lo]=0;\r
+        mgl_surf3ca_val(_GR_, *Val, _DA_(a), _DA_(c), _DA_(b), s, o);  delete []o;     delete []s;     }\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_surf3ca_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *c, uintptr_t *b, const char *sch, const char *opt,int l,int lo)\r
+{      char *s=new char[l+1];  memcpy(s,sch,l);        s[l]=0;\r
+       char *o=new char[lo+1]; memcpy(o,opt,lo);       o[lo]=0;\r
+       mgl_surf3ca_xyz(_GR_, _DA_(x), _DA_(y), _DA_(z), _DA_(a), _DA_(c), _DA_(b), s, o);\r
+       delete []o;     delete []s;     }\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_surf3ca_(uintptr_t *gr, uintptr_t *a, uintptr_t *c, uintptr_t *b, const char *sch, const char *opt,int l,int lo)\r
+{      char *s=new char[l+1];  memcpy(s,sch,l);        s[l]=0;\r
+       char *o=new char[lo+1]; memcpy(o,opt,lo);       o[lo]=0;\r
+       mgl_surf3ca(_GR_, _DA_(a), _DA_(c), _DA_(b), s, o);     delete []o;     delete []s;     }\r
+//-----------------------------------------------------------------------------\r
+//\r
 //     Beam series\r
 //\r
 //-----------------------------------------------------------------------------\r
index a57e11260ba54b7f571cd843731b8893b0aacee3..2b268ae6901d7fb2577ab3842853ee7ae93b6201 100644 (file)
-       set(MGL_EXTRA light)
-       set(MGL_PNG alpha area aspect axial axis barh bars belt boxplot
-               box boxs candle chart cloud colorbar combined cones conta contd
-               contfa contf contf_xyz cont contv cont_xyz curvcoor cut dat_diff
-               dat_extra densa dens dens_xyz dew dots error error2 fall fit flow fonts
-               fog grad hist inplot label legend loglog map mark mesh mirror
-               molecule parser pde pipe plot primitives projection qo2d radar region schemes
-               several_light solve stem step stereo stfa style surf3a surf3c surf3
-               surfa surfc surf table tape tens ternary textmark text ticks tile tiles
-               torus traj triangulation triplot tube type0 type1 type2 vect vecta venn
-               projection5 mask correl refill ohlc ode indirect)
-       set(MGL_PNG_N )
-       set(MGL_PNG_S )
-       set(MGL_PNG_J )
-       set(MGL_PNG_D )
-
-       set(MGL_OUT ${CMAKE_BINARY_DIR}/texinfo)
-       set(MGL_TEX ${CMAKE_SOURCE_DIR}/texinfo)
-       file(MAKE_DIRECTORY ${MGL_OUT}/udav)
-       file(MAKE_DIRECTORY ${MGL_OUT}/png)
-       file(MAKE_DIRECTORY ${MGL_OUT}/small)
-       file(MAKE_DIRECTORY ${MGL_OUT}/json)
-       file(MAKE_DIRECTORY ${MGL_OUT}/pdf)
-       file(COPY ${MGL_TEX}/qt.png ${MGL_TEX}/fltk.png ${MGL_TEX}/classes.png ${MGL_TEX}/emblem_sm.png ${MGL_TEX}/datadvance.png DESTINATION ${MGL_OUT})
-       file(COPY ${MGL_TEX}/index.html ${MGL_TEX}/json.html ${MGL_TEX}/mathgl.js DESTINATION ${MGL_OUT})
-
-       set(UDAV_IMG udav_arg.png udav_calc.png udav_cmd.png udav_data.png udav_mask.png
-               udav_gen_set.png udav_help.png udav_light.png udav_main.png udav_opt.png udav_inplot.png
-               udav_pen.png udav_prop.png udav_sch.png udav_txt.png udav_var.png)
-       foreach(SAMPLE ${UDAV_IMG})
-               file(COPY ${MGL_TEX}/udav/${SAMPLE} DESTINATION ${MGL_OUT}/udav/)
-       endforeach(SAMPLE)
-
-       foreach(SAMPLE ${MGL_PNG})
-               set(MGL_PNG_N ${MGL_PNG_N} ${MGL_OUT}/png/${SAMPLE}.png)
-               add_custom_command(OUTPUT ${MGL_OUT}/png/${SAMPLE}.png
-                       COMMAND mgl_example -kind=${SAMPLE}
-                       DEPENDS mgl_example
-                       WORKING_DIRECTORY ${MGL_OUT}/png )
-               set(MGL_PNG_S ${MGL_PNG_S} ${MGL_OUT}/small/${SAMPLE}-sm.png)
-               add_custom_command(OUTPUT ${MGL_OUT}/small/${SAMPLE}-sm.png
-                       COMMAND mgl_example -kind=${SAMPLE} -mini
-                       DEPENDS mgl_example
-                       WORKING_DIRECTORY ${MGL_OUT}/small )
+configure_file(${MathGL_SOURCE_DIR}/texinfo/version.texi.in ${MathGL_BINARY_DIR}/texinfo/version.texi)
+
+set(MGL_EXTRA light)
+set(MGL_PNG alpha area aspect axial axis barh bars belt boxplot
+       box boxs candle chart cloud colorbar combined cones conta contd
+       contfa contf contf_xyz cont contv cont_xyz curvcoor cut dat_diff
+       dat_extra densa dens dens_xyz dew dots error error2 fall fit flow fonts
+       fog grad hist inplot label legend loglog map mark mesh mirror
+       molecule parser pde pipe plot primitives projection qo2d radar region schemes
+       several_light solve stem step stereo stfa style surf3a surf3c surf3ca surf3
+       surfa surfc surfca surf table tape tens ternary textmark text ticks tile tiles
+       torus traj triangulation triplot tube type0 type1 type2 vect vecta venn
+       projection5 mask correl refill ohlc ode indirect)
+set(MGL_PNG_N )
+set(MGL_PNG_S )
+set(MGL_PNG_J )
+set(MGL_PNG_D )
+
+set(MGL_OUT ${CMAKE_BINARY_DIR}/texinfo)
+set(MGL_TEX ${CMAKE_SOURCE_DIR}/texinfo)
+file(MAKE_DIRECTORY ${MGL_OUT}/udav)
+file(MAKE_DIRECTORY ${MGL_OUT}/png)
+file(MAKE_DIRECTORY ${MGL_OUT}/small)
+file(MAKE_DIRECTORY ${MGL_OUT}/json)
+file(MAKE_DIRECTORY ${MGL_OUT}/pdf)
+file(COPY ${MGL_TEX}/qt.png ${MGL_TEX}/fltk.png ${MGL_TEX}/classes.png ${MGL_TEX}/emblem_sm.png ${MGL_TEX}/datadvance.png DESTINATION ${MGL_OUT})
+file(COPY ${MGL_TEX}/index.html ${MGL_TEX}/json.html ${MGL_TEX}/mathgl.js DESTINATION ${MGL_OUT})
+
+set(UDAV_IMG udav_arg.png udav_calc.png udav_cmd.png udav_data.png udav_mask.png
+       udav_gen_set.png udav_help.png udav_light.png udav_main.png udav_opt.png udav_inplot.png
+       udav_pen.png udav_prop.png udav_sch.png udav_txt.png udav_var.png)
+foreach(SAMPLE ${UDAV_IMG})
+       file(COPY ${MGL_TEX}/udav/${SAMPLE} DESTINATION ${MGL_OUT}/udav/)
+endforeach(SAMPLE)
+
+foreach(SAMPLE ${MGL_PNG})
+       set(MGL_PNG_N ${MGL_PNG_N} ${MGL_OUT}/png/${SAMPLE}.png)
+       add_custom_command(OUTPUT ${MGL_OUT}/png/${SAMPLE}.png
+               COMMAND mgl_example -kind=${SAMPLE}
+               DEPENDS mgl_example
+               WORKING_DIRECTORY ${MGL_OUT}/png )
+       set(MGL_PNG_S ${MGL_PNG_S} ${MGL_OUT}/small/${SAMPLE}-sm.png)
+       add_custom_command(OUTPUT ${MGL_OUT}/small/${SAMPLE}-sm.png
+               COMMAND mgl_example -kind=${SAMPLE} -mini
+               DEPENDS mgl_example
+               WORKING_DIRECTORY ${MGL_OUT}/small )
 if(MGL_HAVE_DOC_JSON)
-               set(MGL_PNG_J ${MGL_PNG_J} ${MGL_OUT}/json/${SAMPLE}.json)
-               add_custom_command(OUTPUT ${MGL_OUT}/json/${SAMPLE}.json
-                       COMMAND mgl_example -json -kind=${SAMPLE}
-                       DEPENDS mgl_example
-                       WORKING_DIRECTORY ${MGL_OUT}/json )
+       set(MGL_PNG_J ${MGL_PNG_J} ${MGL_OUT}/json/${SAMPLE}.json)
+       add_custom_command(OUTPUT ${MGL_OUT}/json/${SAMPLE}.json
+               COMMAND mgl_example -json -kind=${SAMPLE}
+               DEPENDS mgl_example
+               WORKING_DIRECTORY ${MGL_OUT}/json )
 endif(MGL_HAVE_DOC_JSON)
 if(MGL_HAVE_DOC_PRC)
-               set(MGL_PNG_D ${MGL_PNG_D} ${MGL_OUT}/pdf/${SAMPLE}.pdf)
-               add_custom_command(OUTPUT ${MGL_OUT}/pdf/${SAMPLE}.pdf
-                       COMMAND mgl_example -pdf -kind=${SAMPLE}
-                       DEPENDS mgl_example
-                       WORKING_DIRECTORY ${MGL_OUT}/pdf )
+       set(MGL_PNG_D ${MGL_PNG_D} ${MGL_OUT}/pdf/${SAMPLE}.pdf)
+       add_custom_command(OUTPUT ${MGL_OUT}/pdf/${SAMPLE}.pdf
+               COMMAND mgl_example -pdf -kind=${SAMPLE}
+               DEPENDS mgl_example
+               WORKING_DIRECTORY ${MGL_OUT}/pdf )
 endif(MGL_HAVE_DOC_PRC)
-       endforeach(SAMPLE)
-
-       foreach(SAMPLE ${MGL_EXTRA})
-               set(MGL_PNG_N ${MGL_PNG_N} ${MGL_OUT}/png/${SAMPLE}.png)
-               add_custom_command(OUTPUT ${MGL_OUT}/png/${SAMPLE}.png
-                       COMMAND mgl_example -kind=${SAMPLE}
-                       DEPENDS mgl_example
-                       WORKING_DIRECTORY ${MGL_OUT}/png )
-               set(MGL_PNG_S ${MGL_PNG_S} ${MGL_OUT}/small/${SAMPLE}-sm.png)
-               add_custom_command(OUTPUT ${MGL_OUT}/small/${SAMPLE}-sm.png
-                       COMMAND mgl_example -kind=${SAMPLE} -mini
-                       DEPENDS mgl_example
-                       WORKING_DIRECTORY ${MGL_OUT}/small )
-       endforeach(SAMPLE)
-
-       set(list_texi_files_en overview_en.texi example_en.texi ex_mgl_en.texi parse_en.texi formats_en.texi udav_en.texi symbols_en.texi core_en.texi concept_en.texi widget_en.texi data_en.texi other_en.texi appendix_en.texi fdl.texi version.texi time.texi time_big.texi )
-       set(list_texi_files_ru overview_ru.texi example_ru.texi ex_mgl_ru.texi parse_ru.texi formats_ru.texi udav_ru.texi symbols_ru.texi core_ru.texi concept_ru.texi widget_ru.texi data_ru.texi other_ru.texi appendix_ru.texi fdl.texi version.texi time.texi time_big.texi )
-
-       add_custom_command(OUTPUT ${MGL_OUT}/mathgl_en.info
-               COMMAND ${findmi} ${MGL_TEX}/mathgl_en.texi
-               DEPENDS ${list_texi_files_en} mathgl_en.texi ${MGL_PNG_N}
-               WORKING_DIRECTORY ${MGL_OUT}
+endforeach(SAMPLE)
+
+foreach(SAMPLE ${MGL_EXTRA})
+       set(MGL_PNG_N ${MGL_PNG_N} ${MGL_OUT}/png/${SAMPLE}.png)
+       add_custom_command(OUTPUT ${MGL_OUT}/png/${SAMPLE}.png
+               COMMAND mgl_example -kind=${SAMPLE}
+               DEPENDS mgl_example
+               WORKING_DIRECTORY ${MGL_OUT}/png )
+       set(MGL_PNG_S ${MGL_PNG_S} ${MGL_OUT}/small/${SAMPLE}-sm.png)
+       add_custom_command(OUTPUT ${MGL_OUT}/small/${SAMPLE}-sm.png
+               COMMAND mgl_example -kind=${SAMPLE} -mini
+               DEPENDS mgl_example
+               WORKING_DIRECTORY ${MGL_OUT}/small )
+endforeach(SAMPLE)
+
+set(list_texi_files_en overview_en.texi example_en.texi ex_mgl_en.texi parse_en.texi formats_en.texi udav_en.texi symbols_en.texi core_en.texi concept_en.texi widget_en.texi data_en.texi other_en.texi appendix_en.texi fdl.texi ${MathGL_BINARY_DIR}/texinfo/version.texi time.texi time_big.texi )
+set(list_texi_files_ru overview_ru.texi example_ru.texi ex_mgl_ru.texi parse_ru.texi formats_ru.texi udav_ru.texi symbols_ru.texi core_ru.texi concept_ru.texi widget_ru.texi data_ru.texi other_ru.texi appendix_ru.texi fdl.texi ${MathGL_BINARY_DIR}/texinfo/version.texi time.texi time_big.texi )
+
+add_custom_command(OUTPUT ${MGL_OUT}/mathgl_en.info
+       COMMAND ${findmi} ${MGL_TEX}/mathgl_en.texi
+       DEPENDS ${list_texi_files_en} mathgl_en.texi ${MGL_PNG_N}
+       WORKING_DIRECTORY ${MGL_OUT}
+)
+add_custom_command(OUTPUT ${MGL_OUT}/mathgl_ru.info
+       COMMAND ${findmi} ${MGL_TEX}/mathgl_ru.texi
+       DEPENDS ${list_texi_files_ru} mathgl_ru.texi ${MGL_PNG_N}
+       WORKING_DIRECTORY ${MGL_OUT}
+)
+
+add_custom_command(OUTPUT ${MGL_OUT}/mathgl_en.html
+       COMMAND ${findth} ${th_opt} -I ${MGL_OUT} --no-split ${MGL_TEX}/mathgl_en.texi
+       DEPENDS ${list_texi_files_en} mathgl_en.texi ${MGL_PNG_N}
+       WORKING_DIRECTORY ${MGL_OUT}
+)
+add_custom_command(OUTPUT ${MGL_OUT}/mgl_en.html
+       COMMAND ${findth} ${th_opt} --set-customization-variable 'BODYTEXT ' -I ${MGL_OUT} --no-split ${MGL_TEX}/mgl_en.texi
+       DEPENDS ${list_texi_files_en} mgl_en.texi ${MGL_PNG_N}
+       WORKING_DIRECTORY ${MGL_OUT}
+)
+add_custom_command(OUTPUT ${MGL_OUT}/mathgl_ru.html
+       COMMAND ${findth} ${th_opt} -I=${MGL_OUT} --no-split ${MGL_TEX}/mathgl_ru.texi
+       DEPENDS ${list_texi_files_ru} mathgl_ru.texi ${MGL_PNG_N}
+       WORKING_DIRECTORY ${MGL_OUT}
+)
+add_custom_command(OUTPUT ${MGL_OUT}/mgl_ru.html
+       COMMAND ${findth} ${th_opt} --set-customization-variable 'BODYTEXT ' -I=${MGL_OUT} --no-split ${MGL_TEX}/mgl_ru.texi
+       DEPENDS ${list_texi_files_ru} mgl_ru.texi ${MGL_PNG_N}
+       WORKING_DIRECTORY ${MGL_OUT}
+)
+
+add_custom_command(OUTPUT ${site_en}
+       COMMAND ${findth} ${th_opt} -I=${MGL_OUT}/png --split=node -o doc_en ${MGL_TEX}/doc_en.texi
+       DEPENDS ${list_texi_files_en} doc_en.texi ${MGL_PNG_N} web_en.texi ${MGL_PNG_S} ${MGL_PNG_J} ${MGL_PNG_D}
+       WORKING_DIRECTORY ${MGL_OUT}
+)
+add_custom_command(OUTPUT ${site_ru}
+       COMMAND ${findth} ${th_opt} -I=${MGL_OUT}/png --split=node -o doc_ru ${MGL_TEX}/doc_ru.texi
+       DEPENDS ${list_texi_files_ru} doc_ru.texi ${MGL_PNG_N} web_ru.texi ${MGL_PNG_S} ${MGL_PNG_J} ${MGL_PNG_D}
+       WORKING_DIRECTORY ${MGL_OUT}
+)
+
+add_custom_command(OUTPUT ${MGL_OUT}/mathgl_en.pdf
+       COMMAND ${findtp} ${MGL_TEX}/mathgl_en.texi
+       COMMAND ${findtp} ${MGL_TEX}/mathgl_en.texi
+       COMMAND ${findtp} ${MGL_TEX}/mathgl_en.texi
+       DEPENDS ${list_texi_files_en} mathgl_en.texi ${MGL_PNG_N}
+       WORKING_DIRECTORY ${MGL_OUT}
+)
+add_custom_command(OUTPUT ${MGL_OUT}/mgl_en.pdf
+       COMMAND ${findtp} ${MGL_TEX}/mgl_en.texi
+       COMMAND ${findtp} ${MGL_TEX}/mgl_en.texi
+       COMMAND ${findtp} ${MGL_TEX}/mgl_en.texi
+       DEPENDS ${list_texi_files_en} mgl_en.texi ${MGL_PNG_N}
+       WORKING_DIRECTORY ${MGL_OUT}
+)
+
+add_custom_command(OUTPUT ${MGL_OUT}/mathgl_ru.pdf
+       COMMAND ${findtp} ${MGL_TEX}/mathgl_ru.texi
+       COMMAND ${findtp} ${MGL_TEX}/mathgl_ru.texi
+       COMMAND ${findtp} ${MGL_TEX}/mathgl_ru.texi
+       DEPENDS ${list_texi_files_ru} mathgl_ru.texi ${MGL_PNG_N}
+       WORKING_DIRECTORY ${MGL_OUT}
+)
+add_custom_command(OUTPUT ${MGL_OUT}/mgl_ru.pdf
+       COMMAND ${findtp} ${MGL_TEX}/mgl_ru.texi
+       COMMAND ${findtp} ${MGL_TEX}/mgl_ru.texi
+       COMMAND ${findtp} ${MGL_TEX}/mgl_ru.texi
+       DEPENDS ${list_texi_files_en} mgl_ru.texi ${MGL_PNG_N}
+       WORKING_DIRECTORY ${MGL_OUT}
+)
+
+if(MGL_HAVE_DOC_INFO)
+       add_custom_target(doc_info ALL
+               DEPENDS ${MGL_OUT}/mathgl_en.info
+               DEPENDS ${MGL_OUT}/mathgl_ru.info
        )
-       add_custom_command(OUTPUT ${MGL_OUT}/mathgl_ru.info
-               COMMAND ${findmi} ${MGL_TEX}/mathgl_ru.texi
-               DEPENDS ${list_texi_files_ru} mathgl_ru.texi ${MGL_PNG_N}
-               WORKING_DIRECTORY ${MGL_OUT}
-       )
-
-       add_custom_command(OUTPUT ${MGL_OUT}/mathgl_en.html
-               COMMAND ${findth} ${th_opt} -I ${MGL_OUT} --no-split ${MGL_TEX}/mathgl_en.texi
-               DEPENDS ${list_texi_files_en} mathgl_en.texi ${MGL_PNG_N}
-               WORKING_DIRECTORY ${MGL_OUT}
-       )
-       add_custom_command(OUTPUT ${MGL_OUT}/mgl_en.html
-               COMMAND ${findth} ${th_opt} -I ${MGL_OUT} --no-split ${MGL_TEX}/mgl_en.texi
-               DEPENDS ${list_texi_files_en} mgl_en.texi ${MGL_PNG_N}
-               WORKING_DIRECTORY ${MGL_OUT}
-       )
-       add_custom_command(OUTPUT ${MGL_OUT}/mathgl_ru.html
-               COMMAND ${findth} ${th_opt} -I=${MGL_OUT} --no-split ${MGL_TEX}/mathgl_ru.texi
-               DEPENDS ${list_texi_files_ru} mathgl_ru.texi ${MGL_PNG_N}
-               WORKING_DIRECTORY ${MGL_OUT}
-       )
-       add_custom_command(OUTPUT ${MGL_OUT}/mgl_ru.html
-               COMMAND ${findth} ${th_opt} -I=${MGL_OUT} --no-split ${MGL_TEX}/mgl_ru.texi
-               DEPENDS ${list_texi_files_ru} mgl_ru.texi ${MGL_PNG_N}
-               WORKING_DIRECTORY ${MGL_OUT}
-       )
-
-       add_custom_command(OUTPUT ${site_en}
-               COMMAND ${findth} ${th_opt} -I=${MGL_OUT}/png --split=node -o doc_en ${MGL_TEX}/doc_en.texi
-               DEPENDS ${list_texi_files_en} doc_en.texi ${MGL_PNG_N} web_en.texi ${MGL_PNG_S} ${MGL_PNG_J} ${MGL_PNG_D}
-               WORKING_DIRECTORY ${MGL_OUT}
+# TODO: try to install all mathgl*.info* in future!!!
+       install(FILES ${MGL_OUT}/mathgl_en.info ${MGL_OUT}/mathgl_en.info-1 ${MGL_OUT}/mathgl_en.info-2 ${MGL_OUT}/mathgl_en.info-3 DESTINATION ${MGL_INFO_PATH})
+endif(MGL_HAVE_DOC_INFO)
+
+if(MGL_HAVE_DOC_HTML)
+       add_custom_target(doc_html ALL
+       DEPENDS ${MGL_OUT}/mgl_en.html
+       DEPENDS ${MGL_OUT}/mathgl_en.html
+       DEPENDS ${MGL_OUT}/mgl_ru.html
+       DEPENDS ${MGL_OUT}/mathgl_ru.html
        )
-       add_custom_command(OUTPUT ${site_ru}
-               COMMAND ${findth} ${th_opt} -I=${MGL_OUT}/png --split=node -o doc_ru ${MGL_TEX}/doc_ru.texi
-               DEPENDS ${list_texi_files_ru} doc_ru.texi ${MGL_PNG_N} web_ru.texi ${MGL_PNG_S} ${MGL_PNG_J} ${MGL_PNG_D}
-               WORKING_DIRECTORY ${MGL_OUT}
+       install(FILES ${MGL_TEX}/qt.png ${MGL_TEX}/fltk.png ${MGL_TEX}/classes.png ${MGL_TEX}/datadvance.png DESTINATION ${MGL_DOC_PATH})
+       install(FILES ${MGL_OUT}/mathgl_en.html ${MGL_OUT}/mgl_en.html ${MGL_OUT}/mathgl_ru.html ${MGL_OUT}/mgl_ru.html DESTINATION ${MGL_DOC_PATH})
+       install(DIRECTORY ${MGL_OUT}/png DESTINATION ${MGL_DOC_PATH})
+       install(DIRECTORY ${MGL_OUT}/udav DESTINATION ${MGL_DOC_PATH})
+endif(MGL_HAVE_DOC_HTML)
+
+if(MGL_HAVE_DOC_SITE)
+       add_custom_target(doc_site ALL
+       DEPENDS ${site_en}
+       DEPENDS ${site_ru}
        )
+endif(MGL_HAVE_DOC_SITE)
 
-       add_custom_command(OUTPUT ${MGL_OUT}/mathgl_en.pdf
-               COMMAND ${findtp} ${MGL_TEX}/mathgl_en.texi
-               COMMAND ${findtp} ${MGL_TEX}/mathgl_en.texi
-               COMMAND ${findtp} ${MGL_TEX}/mathgl_en.texi
-               DEPENDS ${list_texi_files_en} mathgl_en.texi ${MGL_PNG_N}
-               WORKING_DIRECTORY ${MGL_OUT}
-       )
-       add_custom_command(OUTPUT ${MGL_OUT}/mgl_en.pdf
-               COMMAND ${findtp} ${MGL_TEX}/mgl_en.texi
-               COMMAND ${findtp} ${MGL_TEX}/mgl_en.texi
-               COMMAND ${findtp} ${MGL_TEX}/mgl_en.texi
-               DEPENDS ${list_texi_files_en} mgl_en.texi ${MGL_PNG_N}
-               WORKING_DIRECTORY ${MGL_OUT}
+if(MGL_HAVE_DOC_PDF_EN)
+       add_custom_target(doc_en ALL
+               DEPENDS ${MGL_OUT}/mgl_en.pdf
+               DEPENDS ${MGL_OUT}/mathgl_en.pdf
        )
+       install(FILES ${MGL_OUT}/mathgl_en.pdf ${MGL_OUT}/mgl_en.pdf DESTINATION ${MGL_DOC_PATH})
+endif(MGL_HAVE_DOC_PDF_EN)
 
-       add_custom_command(OUTPUT ${MGL_OUT}/mathgl_ru.pdf
-               COMMAND ${findtp} ${MGL_TEX}/mathgl_ru.texi
-               COMMAND ${findtp} ${MGL_TEX}/mathgl_ru.texi
-               COMMAND ${findtp} ${MGL_TEX}/mathgl_ru.texi
-               DEPENDS ${list_texi_files_ru} mathgl_ru.texi ${MGL_PNG_N}
-               WORKING_DIRECTORY ${MGL_OUT}
-       )
-       add_custom_command(OUTPUT ${MGL_OUT}/mgl_ru.pdf
-               COMMAND ${findtp} ${MGL_TEX}/mgl_ru.texi
-               COMMAND ${findtp} ${MGL_TEX}/mgl_ru.texi
-               COMMAND ${findtp} ${MGL_TEX}/mgl_ru.texi
-               DEPENDS ${list_texi_files_en} mgl_ru.texi ${MGL_PNG_N}
-               WORKING_DIRECTORY ${MGL_OUT}
-       )
-
-       if(MGL_HAVE_DOC_INFO)
-               add_custom_target(doc_info ALL
-                       DEPENDS ${MGL_OUT}/mathgl_en.info
-                       DEPENDS ${MGL_OUT}/mathgl_ru.info
-               )
-# TODO: try to install all mathgl*.info* in future!!!
-               install(FILES ${MGL_OUT}/mathgl_en.info ${MGL_OUT}/mathgl_en.info-1 ${MGL_OUT}/mathgl_en.info-2 ${MGL_OUT}/mathgl_en.info-3 DESTINATION ${MGL_INFO_PATH})
-       endif(MGL_HAVE_DOC_INFO)
-
-       if(MGL_HAVE_DOC_HTML)
-               add_custom_target(doc_html ALL
-               DEPENDS ${MGL_OUT}/mgl_en.html
-               DEPENDS ${MGL_OUT}/mathgl_en.html
-               DEPENDS ${MGL_OUT}/mgl_ru.html
-               DEPENDS ${MGL_OUT}/mathgl_ru.html
-               )
-               install(FILES ${MGL_TEX}/qt.png ${MGL_TEX}/fltk.png ${MGL_TEX}/classes.png ${MGL_TEX}/datadvance.png DESTINATION ${MGL_DOC_PATH})
-               install(FILES ${MGL_OUT}/mathgl_en.html ${MGL_OUT}/mgl_en.html ${MGL_OUT}/mathgl_ru.html ${MGL_OUT}/mgl_ru.html DESTINATION ${MGL_DOC_PATH})
-               install(DIRECTORY ${MGL_OUT}/png DESTINATION ${MGL_DOC_PATH})
-               install(DIRECTORY ${MGL_OUT}/udav DESTINATION ${MGL_DOC_PATH})
-       endif(MGL_HAVE_DOC_HTML)
-
-       if(MGL_HAVE_DOC_SITE)
-               add_custom_target(doc_site ALL
-               DEPENDS ${site_en}
-               DEPENDS ${site_ru}
-               )
-       endif(MGL_HAVE_DOC_SITE)
-
-       if(MGL_HAVE_DOC_PDF_EN)
-               add_custom_target(doc_en ALL
-                       DEPENDS ${MGL_OUT}/mgl_en.pdf
-                       DEPENDS ${MGL_OUT}/mathgl_en.pdf
-               )
-               install(FILES ${MGL_OUT}/mathgl_en.pdf ${MGL_OUT}/mgl_en.pdf DESTINATION ${MGL_DOC_PATH})
-       endif(MGL_HAVE_DOC_PDF_EN)
-
-       if(MGL_HAVE_DOC_PDF_RU)
-               add_custom_target(doc_ru ALL
+if(MGL_HAVE_DOC_PDF_RU)
+       add_custom_target(doc_ru ALL
 #                      DEPENDS ${MGL_OUT}/mgl_ru.pdf
 #                      DEPENDS ${MGL_OUT}/mathgl_ru.pdf
-               )
+       )
 #              install(FILES ${MGL_OUT}/mathgl_ru.pdf DESTINATION ${MGL_DOC_PATH})
-       endif(MGL_HAVE_DOC_PDF_RU)
+endif(MGL_HAVE_DOC_PDF_RU)
 
-       set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "doc_en;doc_ru;./mathgl*.*;./mgl*.*")
+set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "doc_en;doc_ru;./mathgl*.*;./mgl*.*")
 
-       install(FILES ${MGL_TEX}/mglconv.1 ${MGL_TEX}/mglview.1 ${MGL_TEX}/udav.1 ${MGL_TEX}/mgl.cgi.1 DESTINATION ${MGL_MAN_PATH}/man1)
-       install(FILES ${MGL_TEX}/mgl.5 DESTINATION ${MGL_MAN_PATH}/man5)
+install(FILES ${MGL_TEX}/mglconv.1 ${MGL_TEX}/mglview.1 ${MGL_TEX}/udav.1 ${MGL_TEX}/mgl.cgi.1 DESTINATION ${MGL_MAN_PATH}/man1)
+install(FILES ${MGL_TEX}/mgl.5 DESTINATION ${MGL_MAN_PATH}/man5)
index 202b454ef23e394826a41a091b7526b6ec14ef47..c668416e6c85b23ac0eb7b758ac62ea3b04672a4 100644 (file)
@@ -118,6 +118,8 @@ The color scheme is used for determining the color of surfaces, isolines, isosur
 
 The final color is a linear interpolation of color array. The color array is constructed from the string ids (including ``bright'' colors, see @ref{Color styles}). The argument is the amplitude normalized in color range (see @ref{Axis settings}). For example, string containing 4 characters @samp{bcyr} corresponds to a colorbar from blue (lowest value) through cyan (next value) through yellow (next value) to the red (highest value). String @samp{kw} corresponds to a colorbar from black (lowest value) to white (highest value). String @samp{m} corresponds to a simple magenta color.
 
+The special 2-axis color scheme (like in @ref{map} plot) can be used if it contain symbol @samp{%}. In this case the second direction (alpha channel) is used as second coordinate for colors. At this, up to 4 colors can be specified for corners: @{c1,a1@}, @{c2,a1@}, @{c1,a2@}, @{c2,a2@}. Here color and alpha ranges are @{c1,c2@} and @{a1,a2@} correspondingly. If one specify less than 4 colors then black color is used for corner @{c1,a1@}. If only 2 colors are specified then the color of their sum is used for corner @{c2,a2@}.
+
 There are several useful combinations. String @samp{kw} corresponds to the simplest gray color scheme where higher values are brighter. String @samp{wk} presents the inverse gray color scheme where higher value is darker. Strings @samp{kRryw}, @samp{kGgw}, @samp{kBbcw} present the well-known @emph{hot}, @emph{summer} and @emph{winter} color schemes. Strings @samp{BbwrR} and @samp{bBkRr} allow to view bi-color figure on white or black background, where negative values are blue and positive values are red. String @samp{BbcyrR} gives a color scheme similar to the well-known @emph{jet} color scheme.
 
 For more precise coloring, you can change default (equidistant) position of colors in color scheme. The format is @samp{@{CN,pos@}}, @samp{@{CN,pos@}} or @samp{@{xRRGGBB,pos@}}. The position value @var{pos} should be in range [0, 1]. Note, that alternative method for fine tuning of the color scheme is using the formula for coloring (see @ref{Curved coordinates}).
@@ -153,7 +155,7 @@ or just use manual mask style (for v.2.3 and later)@*
 
 Text style is specified by the string which may contain: color id characters @samp{wkrgbcymhRGBCYMHW} (see @ref{Color styles}), and font style (@samp{ribwou}) and/or alignment (@samp{LRC}) specifications. At this, font style and alignment begin after the separator @samp{:}. For example, @samp{r:iCb} sets the bold (@samp{b}) italic (@samp{i}) font text aligned at the center (@samp{C}) and with red color (@samp{r}). Starting from MathGL v.2.3, you can set not single color for whole text, but use color gradient for printed text (see @ref{Color scheme}).
 
-The font styles are: @samp{r} -- roman (or regular) font, @samp{i} -- italic style, @samp{b} -- bold style. By default roman roman font is used. The align types are: @samp{L} -- align left (default), @samp{C} -- align center, @samp{R} -- align right. Additional font effects are: @samp{w} -- wired, @samp{o} -- over-lined, @samp{u} -- underlined.
+The font styles are: @samp{r} -- roman (or regular) font, @samp{i} -- italic style, @samp{b} -- bold style. By default roman roman font is used. The align types are: @samp{L} -- align left (default), @samp{C} -- align center, @samp{R} -- align right, @samp{T} -- align under, @samp{V} -- align center vertical. Additional font effects are: @samp{w} -- wired, @samp{o} -- over-lined, @samp{u} -- underlined.
 
 Also a parsing of the LaTeX-like syntax is provided. There are commands for the font style changing inside the string (for example, use \b for bold font): \a or \overline -- over-lined, \b or \textbf -- bold, \i or \textit -- italic, \r or \textrm -- roman (disable bold and italic attributes), \u or \underline -- underlined, \w or \wire -- wired, \big -- bigger size, @@ -- smaller size. The lower and upper indexes are specified by @samp{_} and @samp{^} symbols. At this the changed font style is applied only on next symbol or symbols in braces @{@}. The text in braces @{@} are treated as single symbol that allow one to print the index of index. For example, compare the strings @samp{sin (x^@{2^3@})} and @samp{sin (x^2^3)}. You may also change text color inside string by command #? or by \color? where @samp{?} is symbolic id of the color (@pxref{Color styles}). For example, words @samp{blue} and @samp{red} will be colored in the string @samp{#b@{blue@} and \colorr@{red@} text}. The most of functions understand the newline symbol @samp{\n} and allows to print multi-line text. Finally, you can use arbitrary (if it was defined in font-face) UTF codes by command @code{\utf0x????}. For example, @code{\utf0x3b1} will produce
 @ifhtml
@@ -201,13 +203,15 @@ MathGL have the fast variant of textual formula evaluation
 The basic functions are: @samp{sqrt(x)} -- square root of @var{x}, @samp{pow(x,y)} -- power @var{x} in @var{y}, @samp{ln(x)} -- natural logarithm of @var{x}, @samp{lg(x)} -- decimal logarithm of @var{x}, @samp{log(a,x)} -- logarithm base @var{a} of @var{x}, @samp{abs(x)} -- absolute value of @var{x}, @samp{sign(x)} -- sign of @var{x}, @samp{mod(x,y)} -- @var{x} modulo @var{y}, @samp{step(x)} -- step function, @samp{int(x)} -- integer part of @var{x}, @samp{rnd} -- random number, @samp{random(x)} -- random data of size as in @var{x}, @samp{pi} -- number
 @ifhtml
 @html
-&pi; = 3.1415926&hellip;
+&pi; = 3.1415926&hellip;, inf=&infin;
 @end html
 @end ifhtml
 @ifnothtml
-@math{\pi=3.1415926...}
+@math{\pi=3.1415926..., inf=\infty}
 @end ifnothtml
 
+Functions for complex numbers @samp{real(x)}, @samp{imag(x)}, @samp{abs(x)}, @samp{arg(x)}, @samp{conj(x)}.
+
 Trigonometric functions are: @samp{sin(x)}, @samp{cos(x)}, @samp{tan(x)} (or @samp{tg(x)}). Inverse trigonometric functions are: @samp{asin(x)}, @samp{acos(x)}, @samp{atan(x)}. Hyperbolic functions are: @samp{sinh(x)} (or @samp{sh(x)}), @samp{cosh(x)} (or @samp{ch(x)}), @samp{tanh(x)} (or @samp{th(x)}). Inverse hyperbolic functions are: @samp{asinh(x)}, @samp{acosh(x)}, @samp{atanh(x)}.
 
 @ifhtml
index fedfece10d28da90f7d560cb20aecaa9025e4c5d..d0bea9395fb617bb880bfa5b38fa3ca2d7eff1e4 100644 (file)
@@ -116,6 +116,8 @@ Base colors are defined by one of symbol @samp{wkrgbcymhRGBCYMHWlenupqLENUPQ}.
 
 При определении цвета по @emph{амплитуде} (наиболее часто используется) окончательный цвет определяется путем линейной интерполяции массива цветов. Массив цветов формируется из цветов, указанных в строке спецификации. Аргумент -- амплитуда, нормированная на диапазон изменения цвета (см. @ref{Axis settings}). Например, строка из 4 символов @samp{bcyr} соответствует изменению цвета от синего (минимальное значение) через голубой и желтый (промежуточные значения) к красному (максимальное значение). Строка @samp{kw} соответствует изменению цвета от черного (минимальное значение) к белому (максимальное значение). Строка из одного символа (например, @samp{g}) соответствует однотонному цвету (в данному случае зеленому).
 
+Специальная двуосная цветовая схема (как в графике @ref{map}) задается символом @samp{%}. В ней второе направление (прозрачность) используется как вторая координата для цвета. При этом можно указать до 4 цветов для углов: @{c1,a1@}, @{c2,a1@}, @{c1,a2@}, @{c2,a2@}. Здесь диапазоны цвета и прозрачности равны @{c1,c2@} и @{a1,a2@}. Если указано меньше 4 цветов, то черный используется для угла @{c1,a1@}. Если задано только 2 цвета, то их сумма используется для угла @{c2,a2@}.
+
 Есть несколько полезных цветовых схем. Строка @samp{kw} дает обычную серую (черно-белую) схему, когда большие значения светлее. Строка @samp{wk} представляет обратную серую схему, когда большие значения темнее. Строки @samp{kRryw}, @samp{kGgw}, @samp{kBbcw} представляют собой хорошо известные схемы @emph{hot}, @emph{summer} и @emph{winter}. Строки @samp{BbwrR} и @samp{bBkRr} позволяют рисовать двухцветные фигуры на белом или черном фоне, когда отрицательные значения показаны синим цветом, а положительные -- красным. Строка @samp{BbcyrR} дает цветовую схему, близкую к хорошо известной схеме @emph{jet}.
 
 Для более точно раскрашивания поверхностей можно изменить равномерное (по умолчанию) положение цветов в цветовой схеме. Формат следующий: @samp{@{CN,pos@}}, @samp{@{CN,pos@}} или @samp{@{xRRGGBB,pos@}}. Здесь значение @var{pos} положения цвета должно быть в диапазоне [0, 1]. Отмечу, что альтернативным механизмом тонкой настройки цветовой схемы может служить использование формул для цветовой координаты (см. @ref{Curved coordinates}).
@@ -152,7 +154,7 @@ Base colors are defined by one of symbol @samp{wkrgbcymhRGBCYMHWlenupqLENUPQ}.
 
 Стиль текста задается строкой, которая может содержать цвет текста @samp{wkrgbcymhRGBCYMHW} (см. @ref{Color styles}), а также тип шрифта (@samp{ribwou}) и/или выравнивания (@samp{LRC}) после символа @samp{:}. Например, @samp{r:iCb} соответствует жирному (@samp{b}) курсиву (@samp{i}) с выравниванием по центру (@samp{C} красного цвета (@samp{r}). Начиная с MathGL версии 2.3, вы можете использовать не только один цвет для всего текста, но и задать цветовой градиент для выводимой строки (см. @ref{Color scheme}).
 
-Начертания шрифта: @samp{r} -- прямой шрифт, @samp{i} -- курсив, @samp{b} -- жирный. По умолчанию используется прямой шрифт. Типы выравнивания текста: @samp{L} -- по левому краю (по умолчанию), @samp{C} -- по центру, @samp{R} -- по правому краю. Дополнительные эффекты шрифта: @samp{w} -- контурный, @samp{o} -- надчеркнутый, @samp{u} -- подчеркнутый.
+Начертания шрифта: @samp{r} -- прямой шрифт, @samp{i} -- курсив, @samp{b} -- жирный. По умолчанию используется прямой шрифт. Типы выравнивания текста: @samp{L} -- по левому краю (по умолчанию), @samp{C} -- по центру, @samp{R} -- по правому краю, @samp{T} -- под текстом, @samp{V} -- по центру вертикально. Дополнительные эффекты шрифта: @samp{w} -- контурный, @samp{o} -- надчеркнутый, @samp{u} -- подчеркнутый.
 
 Синтаксический разбор LaTeX-их команд по умолчанию включен. Это команды смены стиля текста (например, \b для жирного текста): \a или \overline -- надчеркивание, \b или \textbf -- жирный, \i или \textit -- курсив, \r или \textrm -- прямой (отменяет стили жирного и курсива), \u или \underline -- подчеркнутый, \w или \wire -- контурный, \big -- большего размера, @@ -- меньшего размера. Нижний и верхний индексы задаются символами @samp{_} и @samp{^}. При этом изменение стиля применяется только к следующему символу или к символам в фигурных скобках @{@}, которые понимаются как единый блок. Например, сравните строки @samp{sin (x^@{2^3@})} и @samp{sin (x^2^3)}. Можно также менять цвет текста внутри строки с помощью команд #? или \color?, где @samp{?} -- символ цвета (@pxref{Line styles}). Например, слова @samp{Blue} и @samp{red} будут окрашены в соответствующий цвет в строке @samp{#b@{Blue@} and \colorr@{red@} text}. Большинство функций понимает символ новой строки @samp{\n} и позволяет выводить много строчный текст. Наконец, можно использовать символы с произвольным UTF кодом с помощью команды @code{\utf0x????}. Например, @code{\utf0x3b1} даст символ
 @ifhtml
@@ -199,13 +201,15 @@ MathGL имеет быстрый парсер текстовых формул
 Базовые функции: @samp{sqrt(x)} -- квадратный корень из @var{x}, @samp{pow(x,y)} -- @var{x} в степени @var{y}, @samp{ln(x)} -- натуральный логарифм @var{x}, @samp{lg(x)} -- десятичный логарифм @var{x}, @samp{log(a,x)} -- логарифм по основанию @var{a} от @var{x}, @samp{abs(x)} -- модуль @var{x}, @samp{sign(x)} -- знак @var{x}, @samp{mod(x,y)} -- остаток от деления @var{x} на @var{y}, @samp{step(x)} -- ступенчатая функция, @samp{int(x)} -- целая часть @var{x}, @samp{rnd} -- случайное число, @samp{random(x)} -- матрица случайный чисел размером как @var{x}, @samp{pi} -- число
 @ifhtml
 @html
-&pi; = 3.1415926&hellip;
+&pi; = 3.1415926&hellip;, inf=&infin;
 @end html
 @end ifhtml
 @ifnothtml
-@math{\pi=3.1415926...}
+@math{\pi=3.1415926..., inf=\infty}
 @end ifnothtml
 
+Функции для работы с комплексными числами @samp{real(x)}, @samp{imag(x)}, @samp{abs(x)}, @samp{arg(x)}, @samp{conj(x)}.
+
 Тригонометрические функции: @samp{sin(x)}, @samp{cos(x)}, @samp{tan(x)} (или @samp{tg(x)}). Обратные тригонометрические функции: @samp{asin(x)}, @samp{acos(x)}, @samp{atan(x)}. Гиперболические функции: @samp{sinh(x)} (или @samp{sh(x)}), @samp{cosh(x)} (или @samp{ch(x)}), @samp{tanh(x)} (или @samp{th(x)}). Обратные гиперболические функции: @samp{asinh(x)}, @samp{acosh(x)}, @samp{atanh(x)}.
 
 @ifhtml
index b31e7da214b27f0cd4884983d88a08755e14facc..4a7a4f02e0159ee2adca0028feb01f1d8ff66abf 100644 (file)
@@ -159,6 +159,7 @@ Lamp-like transparency (@samp{2}) -- below and upper things are commutable and a
 @node Lighting, Fog, Transparency, Graphics setup
 @subsection Lighting
 @nav{}
+
 @ifclear UDAV
 @cindex SetAmbient
 @cindex AddLight
@@ -166,7 +167,7 @@ Lamp-like transparency (@samp{2}) -- below and upper things are commutable and a
 @cindex Light
 @cindex Ambient
 
-There are several functions for setup lighting. The general function is @ref{light} which switch on/off the lighting for overall plot. It influence only for graphics which created after @ref{light} call (with one exception, OpenGL). Generally MathGL support up to 10 independent light sources. But in OpenGL mode only 8 of light sources is used due to OpenGL limitations. The position, color, brightness of each light source can be set separately. By default only one light source is active. It is source number @code{0} with white color, located at top of the plot.
+There are several functions for setup lighting. The general function is @ref{light} which switch on/off the lighting for overall plot. It influence only for graphics which created after @ref{light} call (with one exception, OpenGL). Generally MathGL support up to 10 independent light sources. But in OpenGL mode only 8 of light sources is used due to OpenGL limitations. The position, color, brightness of each light source can be set separately. By default only one light source is active. It is source number @code{0} with white color, located at top of the plot. @sref{Lighting sample}
 
 @anchor{light}
 @deftypefn {MGL command} {} light @code{[val=on]}
@@ -215,6 +216,15 @@ Set brightness of diffusive light (only for local light sources).
 Sets the brightness of ambient light. The value should be in range [0,1].
 @end deftypefn
 
+@anchor{attachlight}
+@deftypefn {MGL command} {} attachlight @code{val}
+@ifclear UDAV
+@deftypefnx {Method on @code{mglGraph}} @code{void} AttachLight (@code{bool} val)
+@deftypefnx {C function} @code{void} mgl_set_attach_light (@code{HMGL} gr, @code{int} val)
+@end ifclear
+Set to attach light settings to @ref{inplot}/@ref{subplot}. Note, OpenGL and some output formats don't support this feature.
+@end deftypefn
+
 @c ==================================================================
 @external{}
 @node Fog, Default sizes, Lighting, Graphics setup
@@ -569,6 +579,8 @@ Wrong command in MGL script
 Too long line in MGL script
 @item mglScrStr
 Unbalanced ' in MGL script
+@item mglScrTemp
+Change temporary data in MGL script
 @end table
 @end deftypefn
 
@@ -864,7 +876,7 @@ The same as previous but add single tick label @var{lbl} at position @var{val} t
 @deftypefnx {C function} @code{void} mgl_set_tick_templ (@code{HMGL} gr, @code{const char *}templ)
 @deftypefnx {C function} @code{void} mgl_set_tick_templw (@code{HMGL} gr, @code{const wchar_t *}templ)
 @end ifclear
-Set template @var{templ} for x-,y-,z-axis ticks or colorbar ticks. It may contain TeX symbols also. If @var{templ}=@code{""} then default template is used (in simplest case it is @samp{%.2g}). Setting on template switch off automatic ticks tuning.
+Set template @var{templ} for x-,y-,z-axis ticks or colorbar ticks. It may contain TeX symbols also. If @var{templ}=@code{""} then default template is used (in simplest case it is @samp{%.2g}). If template start with @samp{&} symbol then @code{long} integer value will be passed instead of default type @code{double}. Setting on template switch off automatic ticks tuning.
 @end deftypefn
 
 @anchor{ticktime}
@@ -888,7 +900,7 @@ Gets number of seconds from 1970 year to specified date/time @var{str}. The form
 @deftypefnx {Method on @code{mglGraph}} @code{void} SetTuneTicks (@code{int} tune, @code{mreal} pos=@code{1.15})
 @deftypefnx {C function} @code{void} mgl_tune_ticks (@code{HMGL} gr, @code{int} tune, @code{mreal} pos)
 @end ifclear
-Switch on/off ticks enhancing by factoring common multiplier (for small, like from 0.001 to 0.002, or large, like from 1000 to 2000, coordinate values -- enabled if @var{tune}&1 is nonzero) or common component (for narrow range, like from 0.999 to 1.000 -- enabled if @var{tune}&2 is nonzero). Also set the position @var{pos} of common multiplier/component on the axis: =0 at minimal axis value, =1 at maximal axis value. Default value is 1.15. If @var{tune}&4 is nonzero then zeros will be added to fixed width of all axis labels.
+Switch on/off ticks enhancing by factoring common multiplier (for small, like from 0.001 to 0.002, or large, like from 1000 to 2000, coordinate values -- enabled if @var{tune}&1 is nonzero) or common component (for narrow range, like from 0.999 to 1.000 -- enabled if @var{tune}&2 is nonzero). Also set the position @var{pos} of common multiplier/component on the axis: =0 at minimal axis value, =1 at maximal axis value. Default value is 1.15.
 @end deftypefn
 
 @anchor{tickshift}
@@ -1156,6 +1168,13 @@ Functions in this group save or give access to produced picture. So, usually the
 Sets size of picture in pixels. This function @strong{must be} called before any other plotting because it completely remove picture contents.
 @end deftypefn
 
+@ifclear UDAV
+@deftypefn {Method on @code{mglGraph}} @code{void} SetSizeScl (@code{double} factor)
+@deftypefnx {C function} @code{void} mgl_set_size_scl (@code{HMGL} gr, @code{double} factor)
+Set factor for width and height in all further calls of @ref{setsize}.
+@end deftypefn
+@end ifclear
+
 @anchor{quality}
 @deftypefn {MGL command} {} quality [@code{val}=2]
 @ifclear UDAV
@@ -1703,7 +1722,7 @@ Draw tube (or truncated cone if @var{edge}=@code{false}) between points @var{p1}
 @item
 @samp{t} for drawing tubes/cylinder instead of cones/prisms;
 @item
-@samp{4}, @samp{6}, @samp{8}, @samp{t} for drawing square, hex- or octo-prism instead of cones.
+@samp{4}, @samp{6}, @samp{8} for drawing square, hex- or octo-prism instead of cones.
 @end itemize
 @end deftypefn
 
@@ -1818,7 +1837,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 
 These functions draw the text. There are functions for drawing text in arbitrary place, in arbitrary direction and along arbitrary curve. MathGL can use arbitrary font-faces and parse many TeX commands (for more details see @ref{Font styles}). All these functions have 2 variant: for printing 8-bit text (@code{char *}) and for printing Unicode text (@code{wchar_t *}). In first case the conversion into the current locale is used. So sometimes you need to specify it by @code{setlocale()} function. The @var{size} argument control the size of text: if positive it give the value, if negative it give the value relative to @code{SetFontSize()}. The font type (STIX, arial, courier, times and so on) can be selected by function LoadFont(). @xref{Font settings}.
 
-The font parameters are described by string. This string may set the text color @samp{wkrgbcymhRGBCYMHW} (see @ref{Color styles}). Starting from MathGL v.2.3, you can set color gradient for text (see @ref{Color scheme}). Also,  after delimiter symbol @samp{:}, it can contain characters of font type (@samp{rbiwou}) and/or align (@samp{LRCT}) specification. The font types are: @samp{r} -- roman (or regular) font, @samp{i} -- italic style, @samp{b} -- bold style, @samp{w} -- wired style, @samp{o} -- over-lined text, @samp{u} -- underlined text. By default roman font is used. The align types are: @samp{L} -- align left (default), @samp{C} -- align center, @samp{R} -- align right. Style @samp{T} will position text under the specified point (like align top). For example, string @samp{b:iC} correspond to italic font style for centered text which printed by blue color.
+The font parameters are described by string. This string may set the text color @samp{wkrgbcymhRGBCYMHW} (see @ref{Color styles}). Starting from MathGL v.2.3, you can set color gradient for text (see @ref{Color scheme}). Also,  after delimiter symbol @samp{:}, it can contain characters of font type (@samp{rbiwou}) and/or align (@samp{LRCTV}) specification. The font types are: @samp{r} -- roman (or regular) font, @samp{i} -- italic style, @samp{b} -- bold style, @samp{w} -- wired style, @samp{o} -- over-lined text, @samp{u} -- underlined text. By default roman font is used. The align types are: @samp{L} -- align left (default), @samp{C} -- align center, @samp{R} -- align right, @samp{T} -- align under, @samp{V} -- align center vertical. For example, string @samp{b:iC} correspond to italic font style for centered text which printed by blue color.
 
 If string contains symbols @samp{aA} then text is printed at absolute position @{@var{x}, @var{y}@} (supposed to be in range [0,1]) of picture (for @samp{A}) or subplot/inplot (for @samp{a}). If string contains symbol @samp{@@} then box around text is drawn.
 
@@ -1911,7 +1930,7 @@ Draws axes with ticks (see @ref{Axis settings}). Parameter @var{dir} may contain
 @item @samp{-} for printing usual @samp{-} in ticks labels;
 @item @samp{0123456789} for precision at printing ticks labels.
 @end itemize
-Styles of ticks and axis can be overrided by using @var{stl} string. @sref{Axis and ticks}
+Styles of ticks and axis can be overrided by using @var{stl} string. Option @code{value} set the manual rotation angle for the ticks. @sref{Axis and ticks}
 @end deftypefn
 
 @anchor{colorbar}
@@ -2021,7 +2040,9 @@ font style for legend text;
 @item
 @samp{#} for drawing box around legend;
 @item
-colors for background (first one) and border (second one) of legend. Note, that last color is always used as color for legend text.
+@samp{-} for arranging legend entries horizontally;
+@item
+colors for face (1st one), for border (2nd one) and for text (last one). If less than 3 colors are specified then the color for border is black (for 2 and less colors), and the color for face is white (for 1 or none colors).
 @end itemize
 @sref{Legend sample}
 
@@ -2031,7 +2052,7 @@ colors for background (first one) and border (second one) of legend. Note, that
 @deftypefnx {Method on @code{mglGraph}} @code{void} Legend (@code{int} pos=@code{0x3}, @code{const char *}fnt=@code{"#"}, @code{const char *}opt=@code{""})
 @deftypefnx {C function} @code{void} mgl_legend (@code{HMGL} gr, @code{int} pos, @code{const char *}fnt, @code{const char *}opt)
 @end ifclear
-Draws legend of accumulated legend entries by font @var{fnt} with @var{size}. Parameter @var{pos} sets the position of the legend: @samp{0} is bottom left corner, @samp{1} is bottom right corner, @samp{2} is top left corner, @samp{3} is top right corner (is default). Parameter @var{fnt} can contain colors for face (1st one), for border (2nd one) and for text (last one). If less than 3 colors are specified then the color for border is black (for 2 and less colors), and the color for face is white (for 1 or none colors). If string @var{fnt} contain @samp{#} then border around the legend is drawn. If string @var{fnt} contain @samp{-} then legend entries will arranged horizontally. Option @code{value} set the space between line samples and text (default is 0.1).
+Draws legend of accumulated legend entries by font @var{fnt} with @var{size}. Parameter @var{pos} sets the position of the legend: @samp{0} is bottom left corner, @samp{1} is bottom right corner, @samp{2} is top left corner, @samp{3} is top right corner (is default). Option @code{value} set the space between line samples and text (default is 0.1).
 @end deftypefn
 
 @deftypefn {MGL command} {} legend @code{x y} ['fnt'='#']
@@ -2863,7 +2884,7 @@ These plotting functions draw @emph{two matrix} simultaneously. There are 5 gene
 @deftypefnx {C function} @code{void} mgl_surfc (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_surfc_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} and color it by matrix @var{c}[i,j]. If string @var{sch} have symbol @samp{#} then grid lines are drawn. If string @var{sch} have symbol @samp{.} then plot by dots is produced. All dimensions of arrays @var{z} and @var{c} must be equal. Surface is plotted for each z slice of the data. See also @ref{surf}, @ref{surfa}, @ref{surf3c}. @sref{SurfC sample}
+The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} and color it by matrix @var{c}[i,j]. If string @var{sch} have symbol @samp{#} then grid lines are drawn. If string @var{sch} have symbol @samp{.} then plot by dots is produced. All dimensions of arrays @var{z} and @var{c} must be equal. Surface is plotted for each z slice of the data. See also @ref{surf}, @ref{surfa}, @ref{surfca}, @ref{surf3c}. @sref{SurfC sample}
 @end deftypefn
 
 @anchor{surf3c}
@@ -2875,7 +2896,7 @@ The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j]
 @deftypefnx {C function} @code{void} mgl_surf3c_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_surf3c_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. It is mostly the same as @ref{surf3} function but the color of isosurface depends on values of array @var{c}. If string @var{sch} contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. See also @ref{surf3}, @ref{surfc}, @ref{surf3a}. @sref{Surf3C sample}
+The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. It is mostly the same as @ref{surf3} function but the color of isosurface depends on values of array @var{c}. If string @var{sch} contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. See also @ref{surf3}, @ref{surfc}, @ref{surf3a}, @ref{surf3ca}. @sref{Surf3C sample}
 @end deftypefn
 
 @deftypefn {MGL command} {} surf3c adat cdat ['sch'='']
@@ -2899,7 +2920,7 @@ Draws @var{num}-th uniformly distributed in color range isosurfaces for 3d data.
 @deftypefnx {C function} @code{void} mgl_surfa (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_surfa_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} and transparent it by matrix @var{c}[i,j]. If string @var{sch} have symbol @samp{#} then grid lines are drawn. If string @var{sch} have symbol @samp{.} then plot by dots is produced. All dimensions of arrays @var{z} and @var{c} must be equal. Surface is plotted for each z slice of the data. See also @ref{surf}, @ref{surfc}, @ref{surf3a}. @sref{SurfA sample}
+The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} and transparent it by matrix @var{c}[i,j]. If string @var{sch} have symbol @samp{#} then grid lines are drawn. If string @var{sch} have symbol @samp{.} then plot by dots is produced. All dimensions of arrays @var{z} and @var{c} must be equal. Surface is plotted for each z slice of the data. See also @ref{surf}, @ref{surfc}, @ref{surfca}, @ref{surf3a}. @sref{SurfA sample}
 @end deftypefn
 
 @anchor{surf3a}
@@ -2911,7 +2932,7 @@ The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j]
 @deftypefnx {C function} @code{void} mgl_surf3a_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_surf3a_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. It is mostly the same as @ref{surf3} function but the transparency of isosurface depends on values of array @var{c}. If string @var{sch} contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. See also @ref{surf3}, @ref{surfc}, @ref{surf3a}. @sref{Surf3A sample}
+The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. It is mostly the same as @ref{surf3} function but the transparency of isosurface depends on values of array @var{c}. If string @var{sch} contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. See also @ref{surf3}, @ref{surfc}, @ref{surf3a}, @ref{surf3ca}. @sref{Surf3A sample}
 @end deftypefn
 
 @deftypefn {MGL command} {} surf3a adat cdat ['sch'='']
@@ -2925,6 +2946,43 @@ The function draws isosurface plot for 3d array specified parametrically @var{a}
 Draws @var{num}-th uniformly distributed in color range isosurfaces for 3d data. At this array @var{c} can be vector with values of transparency and @var{num}=@var{c}.nx. In opposite case @var{num} is equal to parameter @code{value} in options @var{opt} (default is 3).
 @end deftypefn
 
+
+
+@anchor{surfca}
+@deftypefn {MGL command} {} surfca zdat cdat adat ['sch'='']
+@deftypefnx {MGL command} {} surfca xdat ydat zdat cdat adat ['sch'='']
+@ifclear UDAV
+@deftypefnx {Method on @code{mglGraph}} @code{void} SurfCA (@code{const mglDataA &}z, @code{const mglDataA &}c, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Method on @code{mglGraph}} @code{void} SurfCA (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {C function} @code{void} mgl_surfca (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt)
+@deftypefnx {C function} @code{void} mgl_surfca_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt)
+@end ifclear
+The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}, color it by matrix @var{c}[i,j] and transparent it by matrix @var{a}[i,j]. If string @var{sch} have symbol @samp{#} then grid lines are drawn. If string @var{sch} have symbol @samp{.} then plot by dots is produced. All dimensions of arrays @var{z} and @var{c} must be equal. Surface is plotted for each z slice of the data. Note, you can use @ref{map}-like coloring if use @samp{%} in color scheme. See also @ref{surf}, @ref{surfc}, @ref{surfa}, @ref{surf3ca}. @sref{SurfCA sample}
+@end deftypefn
+
+@anchor{surf3ca}
+@deftypefn {MGL command} {} surf3ca adat cdat bdat @code{val} ['sch'='']
+@deftypefnx {MGL command} {} surf3ca xdat ydat zdat adat cdat bdat @code{val} ['sch'='']
+@ifclear UDAV
+@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3CA (@code{mreal} val, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const mglDataA &}b, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3CA (@code{mreal} val, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const mglDataA &}b, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {C function} @code{void} mgl_surf3ca_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{HCDT} c, @code{HCDT} b, @code{const char *}sch, @code{const char *}opt)
+@deftypefnx {C function} @code{void} mgl_surf3ca_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{HCDT} b,@code{const char *}sch, @code{const char *}opt)
+@end ifclear
+The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. It is mostly the same as @ref{surf3} function but the color and the transparency of isosurface depends on values of array @var{c} and @var{b} correspondingly. If string @var{sch} contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. Note, you can use @ref{map}-like coloring if use @samp{%} in color scheme. See also @ref{surf3}, @ref{surfca}, @ref{surf3c}, @ref{surf3a}. @sref{Surf3CA sample}
+@end deftypefn
+
+@deftypefn {MGL command} {} surf3ca adat cdat bdat ['sch'='']
+@deftypefnx {MGL command} {} surf3ca xdat ydat zdat adat cdat bdat ['sch'='']
+@ifclear UDAV
+@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3CA (@code{const mglDataA &}a, @code{const mglDataA &}c, @code{const mglDataA &}b, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3CA (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const mglDataA &}b, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {C function} @code{void} mgl_surf3ca (@code{HMGL} gr, @code{HCDT} a, @code{HCDT} c, @code{HCDT} b, @code{const char *}sch, @code{const char *}opt)
+@deftypefnx {C function} @code{void} mgl_surf3ca_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{HCDT} b, @code{const char *}sch, @code{const char *}opt)
+@end ifclear
+Draws @var{num}-th uniformly distributed in color range isosurfaces for 3d data. Here parameter @var{num} is equal to parameter @code{value} in options @var{opt} (default is 3).
+@end deftypefn
+
 @anchor{tiles}
 @deftypefn {MGL command} {} tiles zdat rdat ['sch'='']
 @deftypefnx {MGL command} {} tiles xdat ydat zdat rdat ['sch'='']
@@ -3430,9 +3488,14 @@ Get last fitted formula with found coefficients (as numbers).
 @end deftypefn
 
 @deftypefn {Method on @code{mglGraph}} @code{mreal} GetFitChi ()
-@deftypefnx {C function only} @code{mreal} mgl_get_fit_chi ()
+@deftypefnx {C function} @code{mreal} mgl_get_fit_chi ()
 Get \chi for last fitted formula.
 @end deftypefn
+
+@deftypefn {Method on @code{mglGraph}} @code{mreal} GetFitCovar ()
+@deftypefnx {C function} @code{mreal} mgl_get_fit_covar ()
+Get covariance matrix for last fitted formula.
+@end deftypefn
 @end ifclear
 
 
index b2c87f5be269925dff520b4cffe308418ec512ef..d6eebabf929b0bf17fac0236144a68c968576002 100644 (file)
@@ -157,7 +157,7 @@ MGL не требует создания данного типа объекто
 @cindex Light
 @cindex Ambient
 
-Эти функции настраивают освещение графика. Главная функция @ref{light} включает/выключает освещение графиков построенных после ее вызова (в OpenGL работает сразу для всего рисунка). MathGL  поддерживает до 10 независимых источников света. Но в режиме OpenGL можно использовать только первые 8 из них. Положение, цвет, яркость каждого источника света можно задавать по отдельности. По умолчанию включен только первый (с порядковым номером @code{0}) источник света белого цвета, расположенный сверху.
+Эти функции настраивают освещение графика. Главная функция @ref{light} включает/выключает освещение графиков построенных после ее вызова (в OpenGL работает сразу для всего рисунка). MathGL  поддерживает до 10 независимых источников света. Но в режиме OpenGL можно использовать только первые 8 из них. Положение, цвет, яркость каждого источника света можно задавать по отдельности. По умолчанию включен только первый (с порядковым номером @code{0}) источник света белого цвета, расположенный сверху. @sref{Lighting sample}
 
 @anchor{light}
 @deftypefn {Команда MGL} {} light @code{[val=on]}
@@ -206,6 +206,16 @@ MGL не требует создания данного типа объекто
 Задает яркость рассеянного освещения. Значение должно быть в диапазоне [0,1].
 @end deftypefn
 
+@anchor{attachlight}
+@deftypefn {Команда MGL} {} attachlight @code{val}
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} AttachLight (@code{bool} val)
+@deftypefnx {Функция С} @code{void} mgl_set_attach_light (@code{HMGL} gr, @code{int} val)
+@end ifclear
+Задает привязку настроек освещения к @ref{inplot}/@ref{subplot}. Отмечу, что OpenGL и некоторые выходные форматы не поддерживают эту возможность.
+@end deftypefn
+
+
 @c ==================================================================
 @external{}
 @node Fog, Default sizes, Lighting, Graphics setup
@@ -553,6 +563,8 @@ Setsize: размер(ы) равны нулю или отрицательны
 Слишком длинная строка в скрипте MGL
 @item mglScrStr
 Одиночная ' в скрипте MGL
+@item mglScrTemp
+Изменяется временная переменная в MGL скрипте
 @end table
 @end deftypefn
 
@@ -847,7 +859,7 @@ Ternary -- специальный тип графика для 3 зависим
 @deftypefnx {Функция С} @code{void} mgl_set_tick_templ (@code{HMGL} gr, @code{const char *}templ)
 @deftypefnx {Функция С} @code{void} mgl_set_tick_templw (@code{HMGL} gr, @code{const wchar_t *}templ)
 @end ifclear
-Задает шаблон @var{templ} для меток вдоль x-,y-,z-оси или colorbar. Шаблон может содержать и символы TeX. Если @var{templ}=@code{""}, то используется шаблон по умолчанию (в простейшем случае @samp{%.2g}). Установка шаблона выключает автоматическое улучшение вида меток.
\97адаеÑ\82 Ñ\88аблон @var{templ} Ð´Ð»Ñ\8f Ð¼ÐµÑ\82ок Ð²Ð´Ð¾Ð»Ñ\8c x-,y-,z-оÑ\81и Ð¸Ð»Ð¸ colorbar. Ð¨Ð°Ð±Ð»Ð¾Ð½ Ð¼Ð¾Ð¶ÐµÑ\82 Ñ\81одеÑ\80жаÑ\82Ñ\8c Ð¸ Ñ\81имволÑ\8b TeX. Ð\95Ñ\81ли @var{templ}=@code{""}, Ñ\82о Ð¸Ñ\81полÑ\8cзÑ\83еÑ\82Ñ\81Ñ\8f Ñ\88аблон Ð¿Ð¾ Ñ\83молÑ\87аниÑ\8e (в Ð¿Ñ\80оÑ\81Ñ\82ейÑ\88ем Ñ\81лÑ\83Ñ\87ае @samp{%.2g}). Ð\95Ñ\81ли Ñ\88аблон Ð½Ð°Ñ\87инаеÑ\82Ñ\81Ñ\8f Ñ\81 Ñ\81имвола @samp{&}, Ñ\82о Ð±Ñ\83деÑ\82 Ð¸Ñ\81полÑ\8cзовано Ñ\86елое @code{long} Ð²Ð¼ÐµÑ\81Ñ\82о Ñ\82ипа @code{double}. Ð£Ñ\81Ñ\82ановка Ñ\88аблона Ð²Ñ\8bклÑ\8eÑ\87аеÑ\82 Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81кое Ñ\83лÑ\83Ñ\87Ñ\88ение Ð²Ð¸Ð´Ð° Ð¼ÐµÑ\82ок.
 @end deftypefn
 
 @anchor{ticktime}
@@ -871,7 +883,7 @@ Ternary -- специальный тип графика для 3 зависим
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} SetTuneTicks (@code{int} tune, @code{mreal} pos=@code{1.15})
 @deftypefnx {Функция С} @code{void} mgl_tune_ticks (@code{HMGL} gr, @code{int} tune, @code{mreal} pos)
 @end ifclear
-Включает/выключает улучшение вида меток осей путем вынесения общего множителя (для маленьких, типа 0.001...0.002, или больших, типа 1000...2000, значений координат) или общей компоненты (для узкого диапазона, типа 0.999...1.000). Также задает положение @var{pos} общего множителя на оси: =0 около минимального значения, =1 около максимального значения. Если @var{tune}&4 не ноль, то нули будут добавлены для фиксированной ширины всех меток оси.
+Включает/выключает улучшение вида меток осей путем вынесения общего множителя (для маленьких, типа 0.001...0.002, или больших, типа 1000...2000, значений координат) или общей компоненты (для узкого диапазона, типа 0.999...1.000). Также задает положение @var{pos} общего множителя на оси: =0 около минимального значения, =1 около максимального значения.
 @end deftypefn
 
 @anchor{tickshift}
@@ -1109,6 +1121,15 @@ Ternary -- специальный тип графика для 3 зависим
 Изменяет размер картинки в пикселях. Функция должна вызываться @strong{перед} любыми функциями построения потому что полностью очищает содержимое рисунка.
 @end deftypefn
 
+
+@ifclear UDAV
+@deftypefn {Метод класса @code{mglGraph}} @code{void} SetSizeScl (@code{double} factor)
+@deftypefnx {Функция С} @code{void} mgl_set_size_scl (@code{HMGL} gr, @code{double} factor)
+Задает множитель для высоты и ширины во всех последующих вызовах @ref{setsize}.
+@end deftypefn
+@end ifclear
+
+
 @anchor{quality}
 @deftypefn {Команда MGL} {} quality [@code{val}=2]
 @ifclear UDAV
@@ -1656,7 +1677,7 @@ These functions change background image.
 @item
 @samp{t} для рисования цилиндра вместо конуса/призмы;
 @item
-@samp{4}, @samp{6}, @samp{8}, @samp{t} для рисования квадратной, шестиугольной или восьмиугольной призмы вместо конуса.
+@samp{4}, @samp{6}, @samp{8} для рисования квадратной, шестиугольной или восьмиугольной призмы вместо конуса.
 @end itemize
 
 @end deftypefn
@@ -1739,7 +1760,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 
 Функции для вывода текста позволяют вывести строку текста в произвольном месте рисунка, в произвольном направлении и вдоль произвольной кривой. MathGL позволяет использовать произвольное начертание шрифта и многие ТеХ-ие команды (детальнее см. @ref{Font styles}). Все функции вывода текста имеют варианты для 8-bit строк (@code{char *}) и для Unicode строк (@code{wchar_t *}). В первом случае используется конверсия из текущей локали, т.е. иногда вам требуется явно указать локаль с помощью функции @code{setlocale()}. Аргумент @var{size} определяет размер текста: размер шрифта если положителен или относительный размер (=-@var{size}*@code{SetFontSize()}) если отрицателен. Начертание шрифта (STIX, arial, courier, times и др.) можно изменить с помощью функции LoadFont(). @xref{Font settings}.
 
-Параметры шрифта задаются строкой, которая может содержать символы цвета @samp{wkrgbcymhRGBCYMHW} (см. @ref{Color styles}). Также после символа @samp{:} можно указать  символы стиля (@samp{rbiwou}) и/или выравнивания (@samp{LRCT}). Стили шрифта: @samp{r} -- прямой, @samp{i} -- курсив, @samp{b} -- жирный, @samp{w} -- контурный, @samp{o} -- надчеркнутый, @samp{u} -- подчеркнутый. По умолчанию используется прямой шрифт. Типы выравнивания: @samp{L} -- по левому краю (по умолчанию), @samp{C} -- по центру, @samp{R} -- по правому краю.  Стиль @samp{T} выведет текст под указанной точкой (как "выравнивание по верху"). Например, строка @samp{b:iC} соответствует курсиву синего цвета с выравниванием по центру. Начиная с MathGL версии 2.3, вы можете задать цветовой градиент для выводимой строки (см. @ref{Color scheme}).
+Параметры шрифта задаются строкой, которая может содержать символы цвета @samp{wkrgbcymhRGBCYMHW} (см. @ref{Color styles}). Также после символа @samp{:} можно указать  символы стиля (@samp{rbiwou}) и/или выравнивания (@samp{LRCTV}). Стили шрифта: @samp{r} -- прямой, @samp{i} -- курсив, @samp{b} -- жирный, @samp{w} -- контурный, @samp{o} -- надчеркнутый, @samp{u} -- подчеркнутый. По умолчанию используется прямой шрифт. Типы выравнивания: @samp{L} -- по левому краю (по умолчанию), @samp{C} -- по центру, @samp{R} -- по правому краю, @samp{T} -- под текстом, @samp{V} -- по центру вертикально. Например, строка @samp{b:iC} соответствует курсиву синего цвета с выравниванием по центру. Начиная с MathGL версии 2.3, вы можете задать цветовой градиент для выводимой строки (см. @ref{Color scheme}).
 
 Если строка содержит символы @samp{aA}, то текст выводится в абсолютных координатах (полагаются в диапазоне [0,1]). При этом используются координаты относительно рисунка (если указано @samp{A}) или относительно последнего subplot/inplot (если указано @samp{a}). Если строка содержит символ @samp{@@}, то вокруг текста рисуется прямоугольник.
 
@@ -1832,7 +1853,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @item @samp{-} для вывода обычного @samp{-};
 @item @samp{0123456789} для задания точности при выводе чисел.
 @end itemize
-Стиль меток и оси(ей) задается строкой @var{stl}. @sref{Axis and ticks}
+Стиль меток и оси(ей) задается строкой @var{stl}. Опция @code{value} задает угол вращения меток оси. @sref{Axis and ticks}
 @end deftypefn
 
 @anchor{colorbar}
@@ -2837,6 +2858,44 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 Аналогично предыдущему для @var{num} поверхностей уровня равномерно распределённых в диапазоне изменения цвета. При этом массив @var{c} может быть вектором со значениями прозрачности и @var{num}=@var{c}.nx. В противном случае величина @var{num} равна значению параметра @code{value} в опциях @var{opt} (по умолчанию 3).
 @end deftypefn
 
+
+
+@anchor{surfca}
+@deftypefn {Команда MGL} {} surfca zdat cdat adat ['sch'='']
+@deftypefnx {Команда MGL} {} surfca xdat ydat zdat cdat adat ['sch'='']
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} SurfCA (@code{const mglDataA &}z, @code{const mglDataA &}c, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} SurfCA (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Функция С} @code{void} mgl_surfca (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt)
+@deftypefnx {Функция С} @code{void} mgl_surfca_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt)
+@end ifclear
+Рисует параметрически заданную поверхность @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} с цветом и прозрачностью, заданными массивами @var{c}[i,j] и @var{a}[i,j] соответственно. Если @var{sch} содержит @samp{#}, то на поверхности рисуется сетка. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. Размерность массивов @var{z} и @var{c} должна быть одинакова. График строится для каждого z среза данных. См. также @ref{surf}, @ref{surfc}, @ref{surfa}, @ref{surf3ca}. @sref{SurfCA sample}
+@end deftypefn
+
+@anchor{surf3ca}
+@deftypefn {Команда MGL} {} surf3ca adat cdat bdat @code{val} ['sch'='']
+@deftypefnx {Команда MGL} {} surf3ca xdat ydat zdat adat cdat bdat @code{val} ['sch'='']
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3CA (@code{mreal} val, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const mglDataA &}b, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3CA (@code{mreal} val, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const mglDataA &}b, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Функция С} @code{void} mgl_surf3ca_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{HCDT} c, @code{HCDT} b, @code{const char *}sch, @code{const char *}opt)
+@deftypefnx {Функция С} @code{void} mgl_surf3ca_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{HCDT} b, @code{const char *}sch, @code{const char *}opt)
+@end ifclear
+Рисует поверхность уровня для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) при @var{a}(x,y,z)=@var{val}. Аналогично @ref{surf3}, но цвет и прозрачность задается массивами @var{c} и @var{b} соответственно. Если @var{sch} содержит @samp{#}, то рисуется сетчатая поверхность. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. См. также @ref{surf3}, @ref{surfc}, @ref{surf3a}. @sref{Surf3A sample}
+@end deftypefn
+
+@deftypefn {Команда MGL} {} surf3ca adat cdat ['sch'='']
+@deftypefnx {Команда MGL} {} surf3ca xdat ydat zdat adat cdat ['sch'='']
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3CA (@code{const mglDataA &}a, @code{const mglDataA &}c, @code{const mglDataA &}b, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3CA (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const mglDataA &}b, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Функция С} @code{void} mgl_surf3ca (@code{HMGL} gr, @code{HCDT} a, @code{HCDT} c, @code{HCDT} b, @code{const char *}sch, @code{const char *}opt)
+@deftypefnx {Функция С} @code{void} mgl_surf3ca_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{HCDT} b, @code{const char *}sch, @code{const char *}opt)
+@end ifclear
+Аналогично предыдущему для @var{num} поверхностей уровня равномерно распределённых в диапазоне изменения цвета. Здесь величина @var{num} равна значению параметра @code{value} в опциях @var{opt} (по умолчанию 3).
+@end deftypefn
+
+
 @anchor{tiles}
 @deftypefn {Команда MGL} {} tiles zdat rdat ['sch'='']
 @deftypefnx {Команда MGL} {} tiles xdat ydat zdat rdat ['sch'='']
@@ -3345,6 +3404,12 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{mreal} mgl_get_fit_chi ()
 Возвращает величину \chi для последней подобранной формулы.
 @end deftypefn
+
+@deftypefn {Метод класса @code{mglGraph}} @code{mreal} GetFitCovar ()
+@deftypefnx {Функция С} @code{mreal} mgl_get_fit_covar ()
+Возвращает ковариационную матрицу для последней подобранной формулы.
+@end deftypefn
+
 @end ifclear
 
 
index 884753781e432740047cbd83cd2404f43a9b62db..7c0a0d8af8b5998309533ae7af74f63938f8ae92 100644 (file)
@@ -322,7 +322,7 @@ Delete rows which values are equal to next row for given column @var{idx}.
 @end deftypefn
 
 @anchor{join}
-@deftypefn {MGL command} {} join dat vdat
+@deftypefn {MGL command} {} join dat vdat [v2dat ...]
 @ifclear UDAV
 @deftypefnx {Method on @code{mglData}} @code{void} Join (@code{const mglDataA &}vdat)
 @deftypefnx {Method on @code{mglDataC}} @code{void} Join (@code{const mglDataA &}vdat)
@@ -1028,6 +1028,16 @@ Do Fourier transform of the data in given direction or directions. If @var{dir}
 Do Hankel transform of the data in given direction or directions. The Hankel transform is @math{\sum a_j J_0(k j)} (see @uref{http://en.wikipedia.org/wiki/Hankel_transform}).
 @end deftypefn
 
+@anchor{wavelet}
+@deftypefn {MGL command} {} wavelet dat 'dir' @code{k}
+@ifclear UDAV
+@deftypefnx {Method on @code{mglData}} @code{void} Wavelet (@code{const char *}dir, @code{int} k)
+@deftypefnx {C function} @code{void} mgl_data_wavelet (@code{HMDT} dat, @code{const char *}dir, @code{int} k)
+@end ifclear
+Apply wavelet transform of the data in given direction or directions. Parameter @var{dir} set the kind of wavelet transform:
+@samp{d} for daubechies, @samp{D} for centered daubechies, @samp{h} for haar, @samp{H} for centered haar, @samp{b} for bspline, @samp{B} for centered bspline. If string @var{dir} contain symbol @samp{i} then inverse wavelet transform is applied. Parameter @var{k} set the size of wavelet transform.
+@end deftypefn
+
 @anchor{swap}
 @deftypefn {MGL command} {} swap dat 'dir'
 @ifclear UDAV
@@ -1078,7 +1088,8 @@ Remove value steps (like phase jumps after inverse trigonometric functions) with
 @deftypefnx {C function} @code{void} mgl_data_smooth (@code{HMDT} dat, @code{const char *}dir, @code{mreal} delta)
 @deftypefnx {C function} @code{void} mgl_datac_smooth (@code{HADT} dat, @code{const char *}dir, @code{mreal} delta)
 @end ifclear
-Smooths the data on specified direction or directions. String @var{dirs} specifies the dimensions which will be smoothed. It may contain characters: @samp{x} for 1st dimension, @samp{y} for 2nd dimension, @samp{z} for 3d dimension. If string @var{dir} contain: @samp{0} then does nothing, @samp{3} -- linear averaging over 3 points, @samp{5} -- linear averaging over 5 points. By default quadratic averaging over 5 points is used.
+Smooths the data on specified direction or directions. String @var{dirs} specifies the dimensions which will be smoothed. It may contain characters: @samp{x} for 1st dimension, @samp{y} for 2nd dimension, @samp{z} for 3d dimension. If string @var{dir} contain: @samp{0} then does nothing, @samp{3} -- linear averaging over 3 points, @samp{5} -- linear averaging over 5 points. If string @var{dir} contain @samp{dN} (where @samp{N} is digit 1,2,...,9) then linear averaging over (2*N+1)-th points is used.
+By default quadratic averaging over 5 points is used.
 @end deftypefn
 
 @anchor{envelop}
@@ -1462,6 +1473,7 @@ The same as previous but with specified amplitude @var{ampl} and phase @var{phas
 
 @anchor{fourier}
 @deftypefn {MGL command} {} fourier reDat imDat 'dir'
+@deftypefnx {MGL command} {} fourier complexDat 'dir'
 @ifclear UDAV
 @deftypefnx {Global function} @code{void} mglFourier @code{const mglDataA &}re, @code{const mglDataA &}im, @code{const char *}dir)
 @deftypefnx {C function} @code{void} mgl_data_fourier @code{HCDT} re, @code{HCDT} im, @code{const char *}dir)
index 01afc69d8077197a9fb4b154996b0dbbcdabb229..8299764d0834f082f3e9eb4401d8f7f9416b5825 100644 (file)
@@ -320,7 +320,7 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v
 
 
 @anchor{join}
-@deftypefn {Команда MGL} {} join dat vdat
+@deftypefn {Команда MGL} {} join dat vdat [v2dat ...]
 @ifclear UDAV
 @deftypefnx {Метод класса @code{mglData}} @code{void} Join (@code{const mglDataA &}vdat)
 @deftypefnx {Метод класса @code{mglDataC}} @code{void} Join (@code{const mglDataA &}vdat)
@@ -1018,6 +1018,16 @@ These functions change the data in some direction like differentiations, integra
 Выполняет преобразование Ханкеля в выбранном направлении(ях). Преобразование Ханкеля есть @math{\sum a_j J_0(k j)} (см. @uref{http://en.wikipedia.org/wiki/Hankel_transform}).
 @end deftypefn
 
+@anchor{wavelet}
+@deftypefn {Команда MGL} {} wavelet dat 'dir' @code{k}
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglData}} @code{void} Wavelet (@code{const char *}dir, @code{int} k)
+@deftypefnx {Функция С} @code{void} mgl_data_wavelet (@code{HMDT} dat, @code{const char *}dir, @code{int} k)
+@end ifclear
+Выполняет преобразование wavelet в выбранном направлении(ях). Параметр @var{dir} задает тип:
+@samp{d} для daubechies, @samp{D} для центрированного daubechies, @samp{h} для haar, @samp{H} для центрированного haar, @samp{b} для bspline, @samp{B} для центрированного bspline. Если указан символ @samp{i}, то выполняется обратное преобразование. Параметр @var{k} задает размер преобразования.
+@end deftypefn
+
 @anchor{swap}
 @deftypefn {Команда MGL} {} swap dat 'dir'
 @ifclear UDAV
@@ -1068,7 +1078,7 @@ These functions change the data in some direction like differentiations, integra
 @deftypefnx {Функция С} @code{void} mgl_data_smooth (@code{HMDT} dat, @code{const char *}dir, @code{mreal} delta)
 @deftypefnx {Функция С} @code{void} mgl_datac_smooth (@code{HADT} dat, @code{const char *}dir, @code{mreal} delta)
 @end ifclear
-Сглаживает данные в выбранном направлении(ях) @var{dir}. Строка @var{dirs} задает направления вдоль которых будет производиться сглаживание. Если @var{dirs} содержит: @samp{0} -- ничего не делает, @samp{3} линейное усреднение по 3 точкам, @samp{5} линейное усреднение по 5 точкам. По умолчанию используется квадратичное усреднение по 5 точкам.
+СглаживаеÑ\82 Ð´Ð°Ð½Ð½Ñ\8bе Ð² Ð²Ñ\8bбÑ\80анном Ð½Ð°Ð¿Ñ\80авлении(Ñ\8fÑ\85) @var{dir}. Ð¡Ñ\82Ñ\80ока @var{dirs} Ð·Ð°Ð´Ð°ÐµÑ\82 Ð½Ð°Ð¿Ñ\80авлениÑ\8f Ð²Ð´Ð¾Ð»Ñ\8c ÐºÐ¾Ñ\82оÑ\80Ñ\8bÑ\85 Ð±Ñ\83деÑ\82 Ð¿Ñ\80оизводиÑ\82Ñ\8cÑ\81Ñ\8f Ñ\81глаживание. Ð\95Ñ\81ли @var{dirs} Ñ\81одеÑ\80жиÑ\82: @samp{0} -- Ð½Ð¸Ñ\87его Ð½Ðµ Ð´ÐµÐ»Ð°ÐµÑ\82, @samp{3} Ð»Ð¸Ð½ÐµÐ¹Ð½Ð¾Ðµ Ñ\83Ñ\81Ñ\80еднение Ð¿Ð¾ 3 Ñ\82оÑ\87кам, @samp{5} Ð»Ð¸Ð½ÐµÐ¹Ð½Ð¾Ðµ Ñ\83Ñ\81Ñ\80еднение Ð¿Ð¾ 5 Ñ\82оÑ\87кам. Ð\95Ñ\81ли @var{dir} Ñ\81одеÑ\80жиÑ\82 Ñ\81имволÑ\8b @samp{dN} (где @samp{N} -- Ñ\86иÑ\84Ñ\80а 1,2,...,9), Ñ\82о Ð¸Ñ\81полÑ\8cзÑ\83еÑ\82Ñ\81Ñ\8f Ð»Ð¸Ð½ÐµÐ¹Ð½Ð¾Ðµ Ñ\83Ñ\81Ñ\80еднение Ð¿Ð¾ (2*N+1)-ой Ñ\82оÑ\87ке. Ð\9fо Ñ\83молÑ\87аниÑ\8e Ð¸Ñ\81полÑ\8cзÑ\83еÑ\82Ñ\81Ñ\8f ÐºÐ²Ð°Ð´Ñ\80аÑ\82иÑ\87ное Ñ\83Ñ\81Ñ\80еднение Ð¿Ð¾ 5 Ñ\82оÑ\87кам.
 @end deftypefn
 
 @anchor{envelop}
@@ -1453,6 +1463,7 @@ These functions change the data in some direction like differentiations, integra
 
 @anchor{fourier}
 @deftypefn {Команда MGL} {} fourier reDat imDat 'dir'
+@deftypefnx {Команда MGL} {} fourier complexDat 'dir'
 @ifclear UDAV
 @deftypefnx {Global function} @code{void} mglFourier @code{const mglDataA &}re, @code{const mglDataA &}im, @code{const char *}dir)
 @deftypefnx {Функция С} @code{void} mgl_data_fourier @code{HCDT} re, @code{HCDT} im, @code{const char *}dir)
index 5d09f282d8bd4a033c2df2dc88a8072376780de5..4cf17a00ba3c9d1b93b84004e05475f0fb5725ce 100644 (file)
@@ -73,16 +73,14 @@ This file documents the Mathematical Graphic Library (MathGL), a collection of c
 </table>
 
 <hr style="width: 100%; height: 1px;">
-<script type="text/javascript"><!--
-google_ad_client = "ca-pub-1128070552722622";
-/* Vertical small */
-google_ad_slot = "5501954624";
-google_ad_width = 120;
-google_ad_height = 240;
-//-->
-</script>
-<script type="text/javascript"
-src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
+<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
+<!-- 160x600, Vertical -->
+<ins class="adsbygoogle"
+     style="display:inline-block;width:160px;height:600px"
+     data-ad-client="ca-pub-1128070552722622"
+     data-ad-slot="2695178987"></ins>
+<script>
+(adsbygoogle = window.adsbygoogle || []).push({});
 </script>
 </nav>
 @end html
@@ -93,23 +91,21 @@ src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
 <br><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
 <!-- Ref 728x15 -->
 <ins class="adsbygoogle"
-style="display:inline-block;width:728px;height:15px"
-data-ad-client="ca-pub-1128070552722622"
-data-ad-slot="7008431385"></ins>
+     style="display:inline-block;width:728px;height:15px"
+     data-ad-client="ca-pub-1128070552722622"
+     data-ad-slot="7008431385"></ins>
 <script>
 (adsbygoogle = window.adsbygoogle || []).push({});
 </script><br>
 @comment
-<script type="text/javascript"><!--
-google_ad_client = "ca-pub-1128070552722622";
-/* 728x90, создано 23.12.09 */
-google_ad_slot = "9958083480";
-google_ad_width = 728;
-google_ad_height = 90;
-//-->
-</script>
-<script type="text/javascript"
-src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
+<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
+<!-- 728x90, Horizontal -->
+<ins class="adsbygoogle"
+     style="display:inline-block;width:728px;height:90px"
+     data-ad-client="ca-pub-1128070552722622"
+     data-ad-slot="9958083480"></ins>
+<script>
+(adsbygoogle = window.adsbygoogle || []).push({});
 </script><br/>
 <footer>
 <!--LiveInternet counter--><script type="text/javascript"><!--
index 24b31084f545a0e6e8271b99a2dd17e4c0e23e68..a1309b89c183490d6911dbf7d799d132bcc3ca6d 100644 (file)
@@ -76,16 +76,14 @@ This file documents the Mathematical Graphic Library (MathGL), a collection of c
 </table>
 
 <hr style="width: 100%; height: 1px;">
-<script type="text/javascript"><!--
-google_ad_client = "ca-pub-1128070552722622";
-/* Vertical small */
-google_ad_slot = "5501954624";
-google_ad_width = 120;
-google_ad_height = 240;
-//-->
-</script>
-<script type="text/javascript"
-src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
+<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
+<!-- 160x600, Vertical -->
+<ins class="adsbygoogle"
+     style="display:inline-block;width:160px;height:600px"
+     data-ad-client="ca-pub-1128070552722622"
+     data-ad-slot="2695178987"></ins>
+<script>
+(adsbygoogle = window.adsbygoogle || []).push({});
 </script>
 </nav>
 @end html
@@ -96,23 +94,21 @@ src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
 <br><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
 <!-- Ref 728x15 -->
 <ins class="adsbygoogle"
-style="display:inline-block;width:728px;height:15px"
-data-ad-client="ca-pub-1128070552722622"
-data-ad-slot="7008431385"></ins>
+     style="display:inline-block;width:728px;height:15px"
+     data-ad-client="ca-pub-1128070552722622"
+     data-ad-slot="7008431385"></ins>
 <script>
 (adsbygoogle = window.adsbygoogle || []).push({});
 </script><br>
 @comment
-<script type="text/javascript"><!--
-google_ad_client = "ca-pub-1128070552722622";
-/* 728x90, создано 23.12.09 */
-google_ad_slot = "9958083480";
-google_ad_width = 728;
-google_ad_height = 90;
-//-->
-</script>
-<script type="text/javascript"
-src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
+<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
+<!-- 728x90, Horizontal -->
+<ins class="adsbygoogle"
+     style="display:inline-block;width:728px;height:90px"
+     data-ad-client="ca-pub-1128070552722622"
+     data-ad-slot="9958083480"></ins>
+<script>
+(adsbygoogle = window.adsbygoogle || []).push({});
 </script><br/>
 <footer>
 <!--LiveInternet counter--><script type="text/javascript"><!--
index c47eabfc259664e790ad5c5e945db5c68519c4d9..035913e39501c852ef794de8c53fb49efc805b2f 100644 (file)
@@ -1007,17 +1007,21 @@ Command @ref{region} fill the area between 2 curves. It support gradient filling
 @verbatim
 call 'prepare1d'
 copy y1 y(:,1):copy y2 y(:,2)
+
 subplot 2 2 0 '':title 'Region plot (default)':box
 region y1 y2:plot y1 'k2':plot y2 'k2'
 
 subplot 2 2 1 '':title '2 colors':box
 region y1 y2 'yr':plot y1 'k2':plot y2 'k2'
 
-subplot 2 2 2 '':title '"!" style':box
-region y1 y2 '!':plot y1 'k2':plot y2 'k2'
-
-subplot 2 2 3 '':title '"i" style':box
+subplot 2 2 2 '':title '"i" style':box
 region y1 y2 'ir':plot y1 'k2':plot y2 'k2'
+
+subplot 2 2 3 '^_':title '3d variant':rotate 40 60:box
+new x1 100 'sin(pi*x)':new y1 100 'cos(pi*x)':new z 100 'x'
+new x2 100 'sin(pi*x+pi/3)':new y2 100 'cos(pi*x+pi/3)'
+plot x1 y1 z 'r2':plot x2 y2 z 'b2'
+region x1 y1 z x2 y2 z 'cmy!'
 @end verbatim
 
 @pfig{region, Example of Region()}
@@ -1422,6 +1426,7 @@ Basically, you can put this text after the script. Note, that you need to termin
 * Surf sample::
 * SurfC sample::
 * SurfA sample::
+* SurfCA sample::
 * Mesh sample::
 * Fall sample::
 * Belt sample::
@@ -1480,14 +1485,14 @@ surfc a b
 
 @c ------------------------------------------------------------------
 @external{}
-@node SurfA sample, Mesh sample, SurfC sample, 2D samples
+@node SurfA sample, SurfCA sample, SurfC sample, 2D samples
 @subsection SurfA sample
 @nav{}
 
 Command @ref{surfa} is similar to @ref{surf} but its transparency is determined by another data. The sample code is:
 @verbatim
 call 'prepare2d'
-title 'SurfC plot':rotate 50 60:light on:alpha on:box
+title 'SurfA plot':rotate 50 60:light on:alpha on:box
 surfa a b
 @end verbatim
 
@@ -1496,7 +1501,23 @@ surfa a b
 
 @c ------------------------------------------------------------------
 @external{}
-@node Mesh sample, Fall sample, SurfA sample, 2D samples
+@node SurfCA sample, Mesh sample, SurfA sample, 2D samples
+@subsection SurfCA sample
+@nav{}
+
+Command @ref{surfca} is similar to @ref{surf} but its color and transparency is determined by another data. The sample code is:
+@verbatim
+call 'prepare2d'
+title 'SurfCA plot':rotate 50 60:light on:alpha on:box
+surfa a b a
+@end verbatim
+
+@pfig{surfca, Example of SurfCA()}
+
+
+@c ------------------------------------------------------------------
+@external{}
+@node Mesh sample, Fall sample, SurfCA sample, 2D samples
 @subsection Mesh sample
 @nav{}
 
@@ -1784,6 +1805,7 @@ Basically, you can put this text after the script. Note, that you need to termin
 * Surf3 sample::
 * Surf3C sample::
 * Surf3A sample::
+* Surf3CA sample::
 * Cloud sample::
 * Dens3 sample::
 * Cont3 sample::
@@ -1826,7 +1848,7 @@ surf3 c '.'
 Command @ref{surf3c} is similar to @ref{surf3} but its coloring is determined by another data. The sample code is:
 @verbatim
 call 'prepare3d'
-title 'Surf3 plot':rotate 50 60:light on:alpha on:box
+title 'Surf3C plot':rotate 50 60:light on:alpha on:box
 surf3c c d
 @end verbatim
 
@@ -1834,22 +1856,38 @@ surf3c c d
 
 @c ------------------------------------------------------------------
 @external{}
-@node Surf3A sample, Cloud sample, Surf3C sample, 3D samples
+@node Surf3A sample, Surf3CA sample, Surf3C sample, 3D samples
 @subsection Surf3A sample
 @nav{}
 
 Command @ref{surf3a} is similar to @ref{surf3} but its transparency is determined by another data. The sample code is:
 @verbatim
 call 'prepare3d'
-title 'Surf3 plot':rotate 50 60:light on:alpha on:box
+title 'Surf3A plot':rotate 50 60:light on:alpha on:box
 surf3a c d
 @end verbatim
 
 @pfig{surf3a, Example of Surf3A()}
 
+
+@c ------------------------------------------------------------------
+@external{}
+@node Surf3CA sample, Cloud sample, Surf3A sample, 3D samples
+@subsection Surf3CA sample
+@nav{}
+
+Command @ref{surf3ca} is similar to @ref{surf3} but its color and transparency is determined by another data. The sample code is:
+@verbatim
+call 'prepare3d'
+title 'Surf3CA plot':rotate 50 60:light on:alpha on:box
+surf3a c d c
+@end verbatim
+
+@pfig{surf3ca, Example of Surf3CA()}
+
 @c ------------------------------------------------------------------
 @external{}
-@node Cloud sample, Dens3 sample, Surf3A sample, 3D samples
+@node Cloud sample, Dens3 sample, Surf3CA sample, 3D samples
 @subsection Cloud sample
 @nav{}
 
@@ -2396,25 +2434,24 @@ box:surf a 'h'
 
 @pfig{several_light, Example of several light sources.}
 
-Additionally, you can use local light sources and set to use diffise reflection instead of specular one (by default) or both kinds.
+Additionally, you can use local light sources and set to use @ref{diffuse} reflection instead of specular one (by default) or both kinds. Note, I use @ref{attachlight} command to keep light settings relative to subplot.
 @verbatim
-# use Quality=6 because need lighting in placed
-light on:quality 6
+light on: attachlight on
 call 'prepare2d'
 subplot 2 2 0:title 'Default':rotate 50 60:box:surf a
 line -1 -0.7 1.7 -1 -0.7 0.7 'BA'
 
+subplot 2 2 1:title 'Local':rotate 50 60
 light 0 1 0 1 -2 -1 -1
-subplot 2 2 1:title 'Local':rotate 50 60:box:surf a
-line 1 0 1 -1 -1 0 'BAO'
+line 1 0 1 -1 -1 0 'BAO':box:surf a
 
+subplot 2 2 2:title 'no diffuse':rotate 50 60
 diffuse 0
-subplot 2 2 2:title 'no diffuse':rotate 50 60:box:surf a
-line 1 0 1 -1 -1 0 'BAO'
+line 1 0 1 -1 -1 0 'BAO':box:surf a
 
+subplot 2 2 3:title 'diffusive only':rotate 50 60
 diffuse 0.5:light 0 1 0 1 -2 -1 -1 'w' 0
-subplot 2 2 3:title 'diffusive only':rotate 50 60:box:surf a
-line 1 0 1 -1 -1 0 'BAO'
+line 1 0 1 -1 -1 0 'BAO':box:surf a
 @end verbatim
 
 @pfig{light, Example of different types of lighting.}
index 6051ed0c4f5b49fc6077fb39d87306da43e2a855..9c71b5cb13657173765f8b0e557f374a06ba2dfb 100644 (file)
@@ -1007,17 +1007,21 @@ Command @ref{region} fill the area between 2 curves. It support gradient filling
 @verbatim
 call 'prepare1d'
 copy y1 y(:,1):copy y2 y(:,2)
+
 subplot 2 2 0 '':title 'Region plot (default)':box
 region y1 y2:plot y1 'k2':plot y2 'k2'
 
 subplot 2 2 1 '':title '2 colors':box
 region y1 y2 'yr':plot y1 'k2':plot y2 'k2'
 
-subplot 2 2 2 '':title '"!" style':box
-region y1 y2 '!':plot y1 'k2':plot y2 'k2'
-
-subplot 2 2 3 '':title '"i" style':box
+subplot 2 2 2 '':title '"i" style':box
 region y1 y2 'ir':plot y1 'k2':plot y2 'k2'
+
+subplot 2 2 3 '^_':title '3d variant':rotate 40 60:box
+new x1 100 'sin(pi*x)':new y1 100 'cos(pi*x)':new z 100 'x'
+new x2 100 'sin(pi*x+pi/3)':new y2 100 'cos(pi*x+pi/3)'
+plot x1 y1 z 'r2':plot x2 y2 z 'b2'
+region x1 y1 z x2 y2 z 'cmy!'
 @end verbatim
 
 @pfig{region, Example of Region()}
@@ -1422,6 +1426,7 @@ Basically, you can put this text after the script. Note, that you need to termin
 * Surf sample::
 * SurfC sample::
 * SurfA sample::
+* SurfCA sample::
 * Mesh sample::
 * Fall sample::
 * Belt sample::
@@ -1480,23 +1485,38 @@ surfc a b
 
 @c ------------------------------------------------------------------
 @external{}
-@node SurfA sample, Mesh sample, SurfC sample, 2D samples
+@node SurfA sample, SurfCA sample, SurfC sample, 2D samples
 @subsection SurfA sample
 @nav{}
 
 Command @ref{surfa} is similar to @ref{surf} but its transparency is determined by another data. The sample code is:
 @verbatim
 call 'prepare2d'
-title 'SurfC plot':rotate 50 60:light on:alpha on:box
+title 'SurfA plot':rotate 50 60:light on:alpha on:box
 surfa a b
 @end verbatim
 
 @pfig{surfa, Example of SurfA()}
 
+@c ------------------------------------------------------------------
+@external{}
+@node SurfCA sample, Mesh sample, SurfA sample, 2D samples
+@subsection SurfCA sample
+@nav{}
+
+Command @ref{surfca} is similar to @ref{surf} but its color and transparency is determined by another data. The sample code is:
+@verbatim
+call 'prepare2d'
+title 'SurfCA plot':rotate 50 60:light on:alpha on:box
+surfa a b a
+@end verbatim
+
+@pfig{surfca, Example of SurfCA()}
+
 
 @c ------------------------------------------------------------------
 @external{}
-@node Mesh sample, Fall sample, SurfA sample, 2D samples
+@node Mesh sample, Fall sample, SurfCA sample, 2D samples
 @subsection Mesh sample
 @nav{}
 
@@ -1784,6 +1804,7 @@ Basically, you can put this text after the script. Note, that you need to termin
 * Surf3 sample::
 * Surf3C sample::
 * Surf3A sample::
+* Surf3CA sample::
 * Cloud sample::
 * Dens3 sample::
 * Cont3 sample::
@@ -1826,7 +1847,7 @@ surf3 c '.'
 Command @ref{surf3c} is similar to @ref{surf3} but its coloring is determined by another data. The sample code is:
 @verbatim
 call 'prepare3d'
-title 'Surf3 plot':rotate 50 60:light on:alpha on:box
+title 'Surf3C plot':rotate 50 60:light on:alpha on:box
 surf3c c d
 @end verbatim
 
@@ -1834,22 +1855,38 @@ surf3c c d
 
 @c ------------------------------------------------------------------
 @external{}
-@node Surf3A sample, Cloud sample, Surf3C sample, 3D samples
+@node Surf3A sample, Surf3CA sample, Surf3C sample, 3D samples
 @subsection Surf3A sample
 @nav{}
 
 Command @ref{surf3a} is similar to @ref{surf3} but its transparency is determined by another data. The sample code is:
 @verbatim
 call 'prepare3d'
-title 'Surf3 plot':rotate 50 60:light on:alpha on:box
+title 'Surf3A plot':rotate 50 60:light on:alpha on:box
 surf3a c d
 @end verbatim
 
 @pfig{surf3a, Example of Surf3A()}
 
+
+@c ------------------------------------------------------------------
+@external{}
+@node Surf3CA sample, Cloud sample, Surf3A sample, 3D samples
+@subsection Surf3CA sample
+@nav{}
+
+Command @ref{surf3ca} is similar to @ref{surf3} but its color and transparency is determined by another data. The sample code is:
+@verbatim
+call 'prepare3d'
+title 'Surf3CA plot':rotate 50 60:light on:alpha on:box
+surf3a c d c
+@end verbatim
+
+@pfig{surf3ca, Example of Surf3CA()}
+
 @c ------------------------------------------------------------------
 @external{}
-@node Cloud sample, Dens3 sample, Surf3A sample, 3D samples
+@node Cloud sample, Dens3 sample, Surf3CA sample, 3D samples
 @subsection Cloud sample
 @nav{}
 
@@ -2396,25 +2433,24 @@ box:surf a 'h'
 
 @pfig{several_light, Example of several light sources.}
 
-Additionally, you can use local light sources and set to use diffise reflection instead of specular one (by default) or both kinds.
+Additionally, you can use local light sources and set to use @ref{diffuse} reflection instead of specular one (by default) or both kinds. Note, I use @ref{attachlight} command to keep light settings relative to subplot.
 @verbatim
-# use Quality=6 because need lighting in placed
-light on:quality 6
+light on: attachlight on
 call 'prepare2d'
 subplot 2 2 0:title 'Default':rotate 50 60:box:surf a
 line -1 -0.7 1.7 -1 -0.7 0.7 'BA'
 
+subplot 2 2 1:title 'Local':rotate 50 60
 light 0 1 0 1 -2 -1 -1
-subplot 2 2 1:title 'Local':rotate 50 60:box:surf a
-line 1 0 1 -1 -1 0 'BAO'
+line 1 0 1 -1 -1 0 'BAO':box:surf a
 
+subplot 2 2 2:title 'no diffuse':rotate 50 60
 diffuse 0
-subplot 2 2 2:title 'no diffuse':rotate 50 60:box:surf a
-line 1 0 1 -1 -1 0 'BAO'
+line 1 0 1 -1 -1 0 'BAO':box:surf a
 
+subplot 2 2 3:title 'diffusive only':rotate 50 60
 diffuse 0.5:light 0 1 0 1 -2 -1 -1 'w' 0
-subplot 2 2 3:title 'diffusive only':rotate 50 60:box:surf a
-line 1 0 1 -1 -1 0 'BAO'
+line 1 0 1 -1 -1 0 'BAO':box:surf a
 @end verbatim
 
 @pfig{light, Example of different types of lighting.}
index e277ed86f9ee43162d0cc76083e6a5f0a64da3a6..b4cd4025f7c0ab8a01a93d9d1990083fa5314a37 100644 (file)
@@ -1763,18 +1763,23 @@ Function @ref{region} fill the area between 2 curves. It support gradient fillin
 int sample(mglGraph *gr)
 {
   mglData y;  mgls_prepare1d(&y);
-  mglData y1 = y.SubData(-1,1), y2 = y.SubData(-1,2); gr->SetOrigin(0,0,0);
-  gr->SubPlot(2,2,0,"");  gr->Title("Region plot (default)");
-  gr->Box();  gr->Region(y1,y2);  gr->Plot(y1,"k2");  gr->Plot(y2,"k2");
+  mglData y1 = y.SubData(-1,1), y2 = y.SubData(-1,2);  gr->SetOrigin(0,0,0);
 
-  gr->SubPlot(2,2,1,"");  gr->Title("2 colors");
-  gr->Box();  gr->Region(y1,y2,"yr"); gr->Plot(y1,"k2");  gr->Plot(y2,"k2");
+  gr->SubPlot(2,2,0,"");  gr->Title("Region plot (default)"); gr->Box();
+  gr->Region(y1,y2);  gr->Plot(y1,"k2");  gr->Plot(y2,"k2");
 
-  gr->SubPlot(2,2,2,"");  gr->Title("'!' style");
-  gr->Box();  gr->Region(y1,y2,"!");  gr->Plot(y1,"k2");  gr->Plot(y2,"k2");
+  gr->SubPlot(2,2,1,"");  gr->Title("2 colors");  gr->Box();
+  gr->Region(y1,y2,"yr"); gr->Plot(y1,"k2");  gr->Plot(y2,"k2");
+
+  gr->SubPlot(2,2,2,"");  gr->Title("'i' style");  gr->Box();
+  gr->Region(y1,y2,"ir"); gr->Plot(y1,"k2");  gr->Plot(y2,"k2");
 
-  gr->SubPlot(2,2,3,"");  gr->Title("'i' style");
-  gr->Box();  gr->Region(y1,y2,"ir"); gr->Plot(y1,"k2");  gr->Plot(y2,"k2");
+  gr->SubPlot(2,2,3,"^_");  gr->Title("3d variant");  gr->Rotate(40,60);  gr->Box();
+  gr->Fill(y1,"cos(pi*x)"); gr->Fill(y2,"cos(pi*x+pi/3)");
+  mglData x1(y1.nx), x2(y1.nx), z(y1.nx);
+  gr->Fill(x1,"sin(pi*x)"); gr->Fill(x2,"sin(pi*x+pi/3)");  gr->Fill(z,"x");
+  gr->Plot(x1,y1,z,"r2");   gr->Plot(x2,y2,z,"b2");
+  gr->Region(x1,y1,z,x2,y2,z,"cmy!");
   return 0;
 }
 @end verbatim
@@ -2294,6 +2299,7 @@ void mgls_prepare2d(HMDT a, HMDT b=0, HMDT v=0)
 * Surf sample::
 * SurfC sample::
 * SurfA sample::
+* SurfCA sample::
 * Mesh sample::
 * Fall sample::
 * Belt sample::
@@ -2362,7 +2368,7 @@ int sample(mglGraph *gr)
 
 @c ------------------------------------------------------------------
 @external{}
-@node SurfA sample, Mesh sample, SurfC sample, 2D samples
+@node SurfA sample, SurfCA sample, SurfC sample, 2D samples
 @subsection SurfA sample
 @nav{}
 
@@ -2383,7 +2389,28 @@ int sample(mglGraph *gr)
 
 @c ------------------------------------------------------------------
 @external{}
-@node Mesh sample, Fall sample, SurfA sample, 2D samples
+@node SurfCA sample, Mesh sample, SurfA sample, 2D samples
+@subsection SurfCA sample
+@nav{}
+
+Function @ref{surfca} is similar to @ref{surf} but its color and transparency is determined by another data. The sample code is:
+@verbatim
+int sample(mglGraph *gr)
+{
+  mglData a,b;  mgls_prepare2d(&a,&b);
+  gr->Title("SurfCA plot");  gr->Rotate(50,60);
+  gr->Alpha(true);  gr->Light(true);
+  gr->Box();  gr->SurfCA(a,b,a);
+  return 0;
+}
+@end verbatim
+
+@pfig{surfca, Example of SurfCA()}
+
+
+@c ------------------------------------------------------------------
+@external{}
+@node Mesh sample, Fall sample, SurfCA sample, 2D samples
 @subsection Mesh sample
 @nav{}
 
@@ -2745,6 +2772,7 @@ void mgls_prepare3d(HMDT a, HMDT b=0)
 * Surf3 sample::
 * Surf3C sample::
 * Surf3A sample::
+* Surf3CA sample::
 * Cloud sample::
 * Dens3 sample::
 * Cont3 sample::
@@ -2804,7 +2832,7 @@ int sample(mglGraph *gr)
 
 @c ------------------------------------------------------------------
 @external{}
-@node Surf3A sample, Cloud sample, Surf3C sample, 3D samples
+@node Surf3A sample, Surf3CA sample, Surf3C sample, 3D samples
 @subsection Surf3A sample
 @nav{}
 
@@ -2824,7 +2852,27 @@ int sample(mglGraph *gr)
 
 @c ------------------------------------------------------------------
 @external{}
-@node Cloud sample, Dens3 sample, Surf3A sample, 3D samples
+@node Surf3CA sample, Cloud sample, Surf3A sample, 3D samples
+@subsection Surf3CA sample
+@nav{}
+
+Function @ref{surf3ca} is similar to @ref{surf3} but its color and transparency is determined by another data. The sample code is:
+@verbatim
+int sample(mglGraph *gr)
+{
+  mglData c,d;  mgls_prepare3d(&c,&d);
+  gr->Title("Surf3CA plot"); gr->Rotate(50,60);
+  gr->Light(true);  gr->Alpha(true);
+  gr->Box();  gr->Surf3CA(c,d,c);
+  return 0;
+}
+@end verbatim
+
+@pfig{surf3ca, Example of Surf3CA()}
+
+@c ------------------------------------------------------------------
+@external{}
+@node Cloud sample, Dens3 sample, Surf3CA sample, 3D samples
 @subsection Cloud sample
 @nav{}
 
@@ -3519,32 +3567,26 @@ int sample(mglGraph *gr)
 
 @pfig{several_light, Example of several light sources.}
 
-Additionally, you can use local light sources and set to use diffise reflection instead of specular one (by default) or both kinds.
+Additionally, you can use local light sources and set to use @ref{diffuse} reflection instead of specular one (by default) or both kinds. Note, I use @ref{attachlight} command to keep light settings relative to subplot.
 @verbatim
 int sample(mglGraph *gr)
 {
-  // use Quality=6 because need lighting in placed
-  int qual = gr->GetQuality();
-  gr->Light(true);   gr->SetQuality(6);
+  gr->Light(true);  gr->AttachLight(true);
+  gr->SubPlot(2,2,0); gr->Title("Default"); gr->Rotate(50,60);
+  gr->Line(mglPoint(-1,-0.7,1.7),mglPoint(-1,-0.7,0.7),"BA"); gr->Box();  gr->Surf(a);
 
-  mglData a;   mgls_prepare2d(&a);
-  gr->SubPlot(2,2,0);  gr->Title("Default");
-  gr->Rotate(50,60); gr->Box(); gr->Surf(a);
-  gr->Line(mglPoint(-1,-0.7,1.7),mglPoint(-1,-0.7,0.7),"BA");
+  gr->SubPlot(2,2,1); gr->Title("Local");   gr->Rotate(50,60);
   gr->AddLight(0,mglPoint(1,0,1),mglPoint(-2,-1,-1));
-  gr->SubPlot(2,2,1);  gr->Title("Local");
-  gr->Rotate(50,60); gr->Box(); gr->Surf(a);
-  gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO");
+  gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO");  gr->Box();  gr->Surf(a);
+
+  gr->SubPlot(2,2,2); gr->Title("no diffuse"); gr->Rotate(50,60);
   gr->SetDiffuse(0);
-  gr->SubPlot(2,2,2);  gr->Title("no diffuse");
-  gr->Rotate(50,60); gr->Box(); gr->Surf(a);
-  gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO");
+  gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO");  gr->Box();  gr->Surf(a);
+
+  gr->SubPlot(2,2,3); gr->Title("diffusive only");  gr->Rotate(50,60);
   gr->SetDiffuse(0.5);
   gr->AddLight(0,mglPoint(1,0,1),mglPoint(-2,-1,-1),'w',0);
-  gr->SubPlot(2,2,3);  gr->Title("diffusive only");
-  gr->Rotate(50,60); gr->Box(); gr->Surf(a);
-  gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO");
-  gr->SetQuality(qual);
+  gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO");  gr->Box();  gr->Surf(a);
 }
 @end verbatim
 
index 209fe292cc323bfedd1d21274568ae13e554c6d7..ac99b446f84b4adcaab2bba9ca6b471d5b086603 100644 (file)
@@ -1752,18 +1752,23 @@ Function @ref{region} fill the area between 2 curves. It support gradient fillin
 int sample(mglGraph *gr)
 {
   mglData y;  mgls_prepare1d(&y);
-  mglData y1 = y.SubData(-1,1), y2 = y.SubData(-1,2); gr->SetOrigin(0,0,0);
-  gr->SubPlot(2,2,0,"");  gr->Title("Region plot (default)");
-  gr->Box();  gr->Region(y1,y2);  gr->Plot(y1,"k2");  gr->Plot(y2,"k2");
+  mglData y1 = y.SubData(-1,1), y2 = y.SubData(-1,2);  gr->SetOrigin(0,0,0);
 
-  gr->SubPlot(2,2,1,"");  gr->Title("2 colors");
-  gr->Box();  gr->Region(y1,y2,"yr"); gr->Plot(y1,"k2");  gr->Plot(y2,"k2");
+  gr->SubPlot(2,2,0,"");  gr->Title("Region plot (default)"); gr->Box();
+  gr->Region(y1,y2);  gr->Plot(y1,"k2");  gr->Plot(y2,"k2");
 
-  gr->SubPlot(2,2,2,"");  gr->Title("'!' style");
-  gr->Box();  gr->Region(y1,y2,"!");  gr->Plot(y1,"k2");  gr->Plot(y2,"k2");
+  gr->SubPlot(2,2,1,"");  gr->Title("2 colors");  gr->Box();
+  gr->Region(y1,y2,"yr"); gr->Plot(y1,"k2");  gr->Plot(y2,"k2");
+
+  gr->SubPlot(2,2,2,"");  gr->Title("'i' style");  gr->Box();
+  gr->Region(y1,y2,"ir"); gr->Plot(y1,"k2");  gr->Plot(y2,"k2");
 
-  gr->SubPlot(2,2,3,"");  gr->Title("'i' style");
-  gr->Box();  gr->Region(y1,y2,"ir"); gr->Plot(y1,"k2");  gr->Plot(y2,"k2");
+  gr->SubPlot(2,2,3,"^_");  gr->Title("3d variant");  gr->Rotate(40,60);  gr->Box();
+  gr->Fill(y1,"cos(pi*x)"); gr->Fill(y2,"cos(pi*x+pi/3)");
+  mglData x1(y1.nx), x2(y1.nx), z(y1.nx);
+  gr->Fill(x1,"sin(pi*x)"); gr->Fill(x2,"sin(pi*x+pi/3)");  gr->Fill(z,"x");
+  gr->Plot(x1,y1,z,"r2");   gr->Plot(x2,y2,z,"b2");
+  gr->Region(x1,y1,z,x2,y2,z,"cmy!");
   return 0;
 }
 @end verbatim
@@ -2282,6 +2287,7 @@ void mgls_prepare2d(HMDT a, HMDT b=0, HMDT v=0)
 * Surf sample::
 * SurfC sample::
 * SurfA sample::
+* SurfCA sample::
 * Mesh sample::
 * Fall sample::
 * Belt sample::
@@ -2350,7 +2356,7 @@ int sample(mglGraph *gr)
 
 @c ------------------------------------------------------------------
 @external{}
-@node SurfA sample, Mesh sample, SurfC sample, 2D samples
+@node SurfA sample, SurfCA sample, SurfC sample, 2D samples
 @subsection SurfA sample
 @nav{}
 
@@ -2371,7 +2377,28 @@ int sample(mglGraph *gr)
 
 @c ------------------------------------------------------------------
 @external{}
-@node Mesh sample, Fall sample, SurfA sample, 2D samples
+@node SurfCA sample, Mesh sample, SurfA sample, 2D samples
+@subsection SurfCA sample
+@nav{}
+
+Function @ref{surfca} is similar to @ref{surf} but its color and transparency is determined by another data. The sample code is:
+@verbatim
+int sample(mglGraph *gr)
+{
+  mglData a,b;  mgls_prepare2d(&a,&b);
+  gr->Title("SurfCA plot");  gr->Rotate(50,60);
+  gr->Alpha(true);  gr->Light(true);
+  gr->Box();  gr->SurfCA(a,b,a);
+  return 0;
+}
+@end verbatim
+
+@pfig{surfca, Example of SurfCA()}
+
+
+@c ------------------------------------------------------------------
+@external{}
+@node Mesh sample, Fall sample, SurfCA sample, 2D samples
 @subsection Mesh sample
 @nav{}
 
@@ -2733,6 +2760,7 @@ void mgls_prepare3d(HMDT a, HMDT b=0)
 * Surf3 sample::
 * Surf3C sample::
 * Surf3A sample::
+* Surf3CA sample::
 * Cloud sample::
 * Dens3 sample::
 * Cont3 sample::
@@ -2792,7 +2820,7 @@ int sample(mglGraph *gr)
 
 @c ------------------------------------------------------------------
 @external{}
-@node Surf3A sample, Cloud sample, Surf3C sample, 3D samples
+@node Surf3A sample, Surf3CA sample, Surf3C sample, 3D samples
 @subsection Surf3A sample
 @nav{}
 
@@ -2812,7 +2840,27 @@ int sample(mglGraph *gr)
 
 @c ------------------------------------------------------------------
 @external{}
-@node Cloud sample, Dens3 sample, Surf3A sample, 3D samples
+@node Surf3CA sample, Cloud sample, Surf3A sample, 3D samples
+@subsection Surf3CA sample
+@nav{}
+
+Function @ref{surf3ca} is similar to @ref{surf3} but its color and transparency is determined by another data. The sample code is:
+@verbatim
+int sample(mglGraph *gr)
+{
+  mglData c,d;  mgls_prepare3d(&c,&d);
+  gr->Title("Surf3CA plot"); gr->Rotate(50,60);
+  gr->Light(true);  gr->Alpha(true);
+  gr->Box();  gr->Surf3CA(c,d,c);
+  return 0;
+}
+@end verbatim
+
+@pfig{surf3ca, Example of Surf3CA()}
+
+@c ------------------------------------------------------------------
+@external{}
+@node Cloud sample, Dens3 sample, Surf3CA sample, 3D samples
 @subsection Cloud sample
 @nav{}
 
@@ -3507,32 +3555,26 @@ int sample(mglGraph *gr)
 
 @pfig{several_light, Example of several light sources.}
 
-Additionally, you can use local light sources and set to use diffise reflection instead of specular one (by default) or both kinds.
+Additionally, you can use local light sources and set to use @ref{diffuse} reflection instead of specular one (by default) or both kinds. Note, I use @ref{attachlight} command to keep light settings relative to subplot.
 @verbatim
 int sample(mglGraph *gr)
 {
-  // use Quality=6 because need lighting in placed
-  int qual = gr->GetQuality();
-  gr->Light(true);   gr->SetQuality(6);
+  gr->Light(true);  gr->AttachLight(true);
+  gr->SubPlot(2,2,0); gr->Title("Default"); gr->Rotate(50,60);
+  gr->Line(mglPoint(-1,-0.7,1.7),mglPoint(-1,-0.7,0.7),"BA"); gr->Box();  gr->Surf(a);
 
-  mglData a;   mgls_prepare2d(&a);
-  gr->SubPlot(2,2,0);  gr->Title("Default");
-  gr->Rotate(50,60); gr->Box(); gr->Surf(a);
-  gr->Line(mglPoint(-1,-0.7,1.7),mglPoint(-1,-0.7,0.7),"BA");
+  gr->SubPlot(2,2,1); gr->Title("Local");   gr->Rotate(50,60);
   gr->AddLight(0,mglPoint(1,0,1),mglPoint(-2,-1,-1));
-  gr->SubPlot(2,2,1);  gr->Title("Local");
-  gr->Rotate(50,60); gr->Box(); gr->Surf(a);
-  gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO");
+  gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO");  gr->Box();  gr->Surf(a);
+
+  gr->SubPlot(2,2,2); gr->Title("no diffuse"); gr->Rotate(50,60);
   gr->SetDiffuse(0);
-  gr->SubPlot(2,2,2);  gr->Title("no diffuse");
-  gr->Rotate(50,60); gr->Box(); gr->Surf(a);
-  gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO");
+  gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO");  gr->Box();  gr->Surf(a);
+
+  gr->SubPlot(2,2,3); gr->Title("diffusive only");  gr->Rotate(50,60);
   gr->SetDiffuse(0.5);
   gr->AddLight(0,mglPoint(1,0,1),mglPoint(-2,-1,-1),'w',0);
-  gr->SubPlot(2,2,3);  gr->Title("diffusive only");
-  gr->Rotate(50,60); gr->Box(); gr->Surf(a);
-  gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO");
-  gr->SetQuality(qual);
+  gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO");  gr->Box();  gr->Surf(a);
 }
 @end verbatim
 
index a6112ff464fc402e8c7e1f29962b483e727509ec..b16a4a9591d8649475bf1c4eab8ea7687f1128ea 100644 (file)
@@ -236,7 +236,7 @@ var mgl_draw_good = function(obj, ctx, skip)
        for(var i=0;i<obj.nprim;i++)    // for each primitive
        {
                var prim = obj.prim[i];
-               mgl_draw_prim(obj,ctx,prim,obj.pnts[prim[1]][3]?s2:s1);
+               mgl_draw_prim(obj,ctx,prim,obj.pnts[prim[1]][3]<0?s2:s1);
        }
        obj.good = 0;
 }
@@ -286,7 +286,14 @@ var mgl_draw_prim = function(obj, ctx, prim, scl)
                var xx=obj.coor[n2][2]/100,yy=-obj.coor[n2][3]/100,zz=obj.coor[n2][4]/100;
                var xc = obj.b[0]*xx + obj.b[1]*yy + obj.b[2]*zz;
                var yc = obj.b[3]*xx + obj.b[4]*yy + obj.b[5]*zz;
-//                     var zc = obj.b[6]*xx + obj.b[7]*yy + obj.b[8]*zz;
+               var zc = obj.b[6]*xx + obj.b[7]*yy + obj.b[8]*zz;
+
+               var dv = (1-obj.pf/1.37)/(1-obj.pf*obj.pp[i][2]/obj.depth);
+               var cv = obj.pf/(1-obj.pf/1.37)/obj.depth;
+               xc += (obj.pp[n1][0]-obj.b[9])*zc*cv;//*dv;
+               yc += (obj.pp[n1][1]-obj.b[10])*zc*cv;//*dv;
+               if(obj.pnts[n1][3]<0)   {       xc=xx;  yc=yy;  }
+
                var ll = xc*xc+yc*yc;
                if(ll < 1e-10)  break;
                if(ll<1e10 && t/deg<1e4)
@@ -338,7 +345,7 @@ var mgl_prepare = function(obj, skip)
                var x = obj.pnts[i][0]-obj.width/2;
                var y = obj.pnts[i][1]-obj.height/2;
                var z = obj.pnts[i][2]-obj.depth/2;
-               if(obj.pnts[i][3]==0)   // TODO: check later when mglInPlot will be ready
+               if(obj.pnts[i][3]>=0)   // TODO: check later when mglInPlot will be ready
                        obj.pp[i] = [b[9]  + b[0]*x + b[1]*y + b[2]*z,
                                                b[10] + b[3]*x + b[4]*y + b[5]*z,
                                                b[11] + b[6]*x + b[7]*y + b[8]*z];
@@ -347,8 +354,8 @@ var mgl_prepare = function(obj, skip)
        }
        if(obj.pf)      for(var i=0;i<obj.npnts;i++)    // perspective
        {       // NOTE: it is not supported for coordinate determining now
-               var d = (1-obj.pf)/(1-obj.pf*obj.pp[i][2]/obj.depth);
-               if(obj.pnts[i][3]==0)   // TODO: check later when mglInPlot will be ready
+               var d = (1-obj.pf/1.37)/(1-obj.pf*obj.pp[i][2]/obj.depth);
+               if(obj.pnts[i][3]>=0)   // TODO: check later when mglInPlot will be ready
                {
                        obj.pp[i][0] = d*obj.pp[i][0] + (1-d)/2*obj.width;
                        obj.pp[i][1] = d*obj.pp[i][1] + (1-d)/2*obj.height;
index 42f08eebe960eb31d4f8f4e96e7b8120e3e5b353..e631a217ee813f61669dded402a1e3659cc498cc 100644 (file)
@@ -34,7 +34,7 @@ Argument can be a string, a variable (data arrays) or a number (scalars).
 The string is any symbols between ordinary marks @samp{'}. Long strings can be concatenated from several lines by @samp{\} symbol. I.e. the string @samp{'a +'\<br>' b'} will give string @samp{'a + b'} (here @samp{<br>} is newline). Also you can concatenate strings and numbers using @samp{,} with out spaces (for example, @samp{'max(u)=',u.max,' a.u.'}).
 
 @item
-Usually variable have a name which is arbitrary combination of symbols (except spaces and @samp{'}) started from a letter and with length less than 64. A temporary array can be used as variable:
+Usually variable have a name which is arbitrary combination of symbols (except spaces and @samp{'}) started from a letter. Note, you can start an expression with @samp{!} symbol if you want to use complex values. For example, the code @code{new x 100 'x':copy !b !exp(1i*x)} will create real valued data @var{x} and complex data @var{b}, which is equal to @math{exp(I*x)}, where @math{I^2=-1}. A temporary array can be used as variable too:
 @itemize @bullet
 @item
 sub-arrays (like in @ref{subdata} command) as command argument. For example, @code{a(1)} or @code{a(1,:)} or @code{a(1,:,:)} is second row, @code{a(:,2)} or @code{a(:,2,:)} is third column, @code{a(:,:,0)} is first slice and so on. Also you can extract a part of array from m-th to n-th element by code @code{a(m:n,:,:)} or just @code{a(m:n)}.
@@ -54,7 +54,7 @@ result of code for making new data (@pxref{Make another data}) inside @{@}. For
 Temporary variables can not be used as 1st argument for commands which create (return) the data (like @samp{new}, @samp{read}, @samp{hist} and so on).
 
 @item
-Special names @code{nan=#QNAN, pi=3.1415926..., on=1, off=0, :=-1} are treated as number if they were not redefined by user. Variables with suffixes are treated as numbers (@pxref{Data information}). Names defined by @ref{define} command are treated as number. Also results of formulas with sizes 1x1x1 are treated as number (for example, @samp{pi/dat.nx}).
+Special names @code{nan=#QNAN, inf=INFINITY, rnd=random value, pi=3.1415926..., on=1, off=0, :=-1}, variables with suffixes (@pxref{Data information}), names defined by @ref{define} command are treated as number. Also results of formulas with sizes 1x1x1 are treated as number (for example, @samp{pi/dat.nx}).
 @end itemize
 Before the first using all variables must be defined with the help of commands, like, @ref{new}, @ref{var}, @ref{list}, @ref{copy}, @ref{read}, @ref{hist}, @ref{sum} and so on (see sections @ref{Data constructor}, @ref{Data filling} and @ref{Make another data}).
 
@@ -99,11 +99,12 @@ Sets @var{N}-th script argument to character with value evaluated from @var{smth
 @deftypefn {MGL command} {} defnum $N smth
 Sets @var{N}-th script argument to number with value evaluated from @var{smth}. Here @var{N} is digit (0...9) or alpha (a...z).
 @end deftypefn
-@cindex defpal
-@anchor{defpal}
-@deftypefn {MGL command} {} defpal $N smth
-Sets @var{N}-th script argument to palette character at position evaluated from @var{smth}. Here @var{N} is digit (0...9) or alpha (a...z).
-@end deftypefn
+
+@comment  @cindex defpal
+@comment  @anchor{defpal}
+@comment  @deftypefn {MGL command} {} defpal $N smth
+@comment  Sets @var{N}-th script argument to palette character at position evaluated from @var{smth}. Here @var{N} is digit (0...9) or alpha (a...z).
+@comment  @end deftypefn
 
 @cindex call
 @anchor{call}
@@ -113,7 +114,7 @@ Executes function @var{fname} (or script if function is not found). Optional arg
 @cindex func
 @anchor{func}
 @deftypefn {MGL command} {} func 'funcname' [narg=0]
-Define the function @var{fname} and number of required arguments. The arguments will be placed in script parameters $1, $2, ... $9. Note, you should stop script execution before function definition(s) by command @ref{stop}. See also @ref{return}.
+Define the function @var{fname} and number of required arguments. The arguments will be placed in script parameters $1, $2, ... $9. Note, script execution is stopped at @code{func} keyword, similarly to @ref{stop} command. See also @ref{return}.
 @end deftypefn
 @cindex return
 @anchor{return}
@@ -181,6 +182,11 @@ Terminate execution.
 @end deftypefn
 
 
+@cindex rkstep
+@anchor{rkstep}
+@deftypefn {MGL command} {} rkstep eq1;... var1;... [@code{dt=1}]
+Make one step for ordinary differential equation(s) @{var1' = eq1, ... @} with time-step @var{dt}. Here variable(s) @samp{var1}, ... are the ones, defined in MGL script previously. The Runge-Kutta 4-th order method is used for solution.
+@end deftypefn
 
 @c ------------------------------------------------------------------
 @external{}
@@ -195,9 +201,9 @@ Terminate execution.
 
 There is LaTeX package @code{mgltex} (was made by Diego Sejas Viscarra) which allow one to make figures directly from MGL script located in LaTeX file.
 
-For using this package you need to specify @code{--shell-escape} option for @emph{latex/pdflatex} or manually run @emph{mglconv} tool with produced MGL scripts for generation of images. Don't forgot to run @emph{latex/pdflatex} second time to insert generated images into the output document.
+For using this package you need to specify @code{--shell-escape} option for @emph{latex/pdflatex} or manually run @emph{mglconv} tool with produced MGL scripts for generation of images. Don't forgot to run @emph{latex/pdflatex} second time to insert generated images into the output document. Also you need to run @emph{pdflatex} third time to update converted from EPS images if you are using vector EPS output (default).
 
-The package may have following options: @code{draft}, @code{final} -- the same as in the @emph{graphicx} package; @code{jpg}, @code{jpeg}, @code{png} -- for export to JPEG/PNG images; @code{eps}, @code{epsz} -- for export to uncompressed/compressed EPS format as primitives; @code{bps}, @code{bpsz} -- for export to uncompressed/compressed EPS format as bitmap, @code{pdf} -- for export to 3D PDF.
+The package may have following options: @code{draft}, @code{final} --- the same as in the @emph{graphicx} package; @code{on}, @code{off} --- to activate/deactivate the creation of scripts and graphics; @code{comments}, @code{nocomments} --- to make visible/invisible commentaries contained inside @code{mglcomment} environments; @code{jpg}, @code{jpeg}, @code{png} --- to export graphics as JPEG/PNG images; @code{eps}, @code{epsz} --- to export to uncompressed/compressed EPS format as primitives; @code{bps}, @code{bpsz} --- to export to uncompressed/compressed EPS format as bitmap (doesn't work with @emph{pdflatex}); @code{pdf} --- to export to 3D PDF; @code{tex} --- to export to @emph{LaTeX/tikz} document.
 
 The package defines the following environments:
 @table @samp
@@ -247,6 +253,8 @@ An example of usage of @samp{mgl} environment would be:
        Exactly the same as @samp{mglblock}, but it doesn't write to a file. This environment doesn't have arguments.
 @item mglfunc
        Is used to define MGL functions. It takes one mandatory argument, which is the name of the function, plus one additional argument, which specifies the number of arguments of the function. The environment needs to contain only the body of the function, since the first and last lines are appended automatically, and the resulting code is written at the end of the general script, after the @ref{stop} command, which is also written automatically. The warning is produced if 2 or more function with the same name is defined.
+@item mglcomment
+       Is used to contain multiline commentaries. This commentaries will be visible/invisible in the output document, depending on the use of the package options @code{comments} and @code{nocomments} (see above), or the @code{\mglcomments} and @code{\mglnocomments} commands (see bellow).
 @item mglsetup
        If many scripts with the same code are to be written, the repetitive code can be written inside this environment only once, then this code will be used automatically every time the @samp{\mglplot} command is used (see below). It takes one optional argument, which is a name to be associated to the corresponding contents of the environment; this name can be passed to the @samp{\mglplot} command to use the corresponding block of code automatically (see below).
 @end table
@@ -292,6 +300,12 @@ An example of usage of @samp{\mglplot} command would be:
        This is like @samp{\mglgraphics} but, instead of creating/including the corresponding image, it writes the contents of the MGL script to the LaTeX document, and numerates the lines.
 @item \mgldir
        This command can be used in the preamble of the document to specify a directory where LaTeX will save the MGL scripts and generate the corresponding images. This directory is also where @samp{\mglgraphics} and @samp{\mglinclude} will look for scripts.
+@item \mglquality
+       Adjust the quality of the MGL graphics produced similarly to @ref{quality}.
+@item \mgltexon, \mgltexoff
+       Activate/deactivate the creation of MGL scripts and images. Notice these commands have local behavior in the sense that their effect is from the point they are called on.
+@item \mglcomment, \mglnocomment
+       Make visible/invisible the contents of the @code{mglcomment} environments. These commands have local effect too.
 @item \mglTeX
        It just pretty prints the name of the package.
 @end table
@@ -356,6 +370,12 @@ Function parses the string @var{str} and executes it by  using @var{gr} as a gra
 Function parses the string @var{formula} and return resulting data array. In difference to @code{AddVar()} or @code{FindVar()}, it is usual data array which should be deleted after usage.
 @end deftypefn
 
+@deftypefn {Method on @code{mglParse}} @code{mglDataC} CalcComplex (@code{const char *}formula)
+@deftypefnx {Method on @code{mglParse}} @code{mglDataC} CalcComplex (@code{const wchar_t *}formula)
+@deftypefnx {C function} @code{HADT} mgl_parser_calc_complex (@code{HMPR} p, @code{const char *}formula)
+@deftypefnx {C function} @code{HADT} mgl_parser_calc_complexw (@code{HMPR} p, @code{const wchar_t *}formula)
+Function parses the string @var{formula} and return resulting data array with complex values. In difference to @code{AddVar()} or @code{FindVar()}, it is usual data array which should be deleted after usage.
+@end deftypefn
 
 @deftypefn {Method on @code{mglParse}} @code{void} AddParam (@code{int} n, @code{const char *}str)
 @deftypefnx {Method on @code{mglParse}} @code{void} AddParam (@code{int} n, @code{const wchar_t *}str)
@@ -440,6 +460,13 @@ Return the format of arguments for MGL command @var{name}.
 Return the description of MGL command @var{name}.
 @end deftypefn
 
+@deftypefn {Method on @code{mglParse}} @code{void} RK_Step (@code{const char *}eqs, @code{const char *}vars, @code{mreal} dt=@code{1})
+@deftypefnx {Method on @code{mglParse}} @code{void} RK_Step (@code{const wchar_t *}eqs, @code{const wchar_t *}vars, @code{mreal} dt=@code{1})
+@deftypefnx {C function} @code{void} mgl_rk_step (@code{HMPR} p, @code{const char *}eqs, @code{const char *}vars, @code{mreal} dt)
+@deftypefnx {C function} @code{void} mgl_rk_step_w (@code{HMPR} p, @code{const wchar_t *}eqs, @code{const wchar_t *}vars, @code{mreal} dt)
+Make one step for ordinary differential equation(s) @{var1' = eq1, ... @} with time-step @var{dt}. Here strings @var{eqs} and @var{vars} contain the equations and variable names separated by symbol @samp{;}. The variable(s) @samp{var1}, ... are the ones, defined in MGL script previously. The Runge-Kutta 4-th order method is used.
+@end deftypefn
+
 @end ifclear
 
 @external{}
index 7943f61b244653dd07533aaa7def5d33717f45b4..d51da364ec4325a3618346bb8c4871c20f3720f9 100644 (file)
@@ -34,7 +34,8 @@ MathGL имеет встроенный скриптовый язык MGL для
 Строка -- произвольный набор символов между метками @samp{'}. Длинные строки могут быть соединены из нескольких линий файла символом @samp{\}. Т.е. строки файла @samp{'a +'\<br>' b'} дадут строку @samp{'a + b'} (здесь @samp{<br>} -- перевод строки). Также можно использовать соединение строк и чисел, используя символ @samp{,} без пробелов (например, @samp{'max(u)=',u.max,' a.u.'}).
 
 @item
-Обычно переменная имеет имя, состоящее из букв и чисел (должно начинаться с буквы и не быть длиннее 64 символов). В качестве переменной можно использовать временные массивы, включающие в себя:
+Обычно переменная имеет имя, состоящее из букв и чисел (должно начинаться с буквы и не быть длиннее 64 символов). Если выражение или переменная начинается с символа @samp{!}, то будут использованы комплексные значения. Например, код @code{new x 100 'x':copy !b !exp(1i*x)} создаст массив действительных чисел @var{x} и массив комплексных чисел @var{b}, который будет равен @math{exp(I*x)}, где @math{I^2=-1}. 
+В качестве переменной можно использовать также и временные массивы, включающие в себя:
 @itemize @bullet
 @item
 срезы (``подмассивы'') массивов данных (подобно команде @ref{subdata}). Например, @code{a(1)} или @code{a(1,:)} или @code{a(1,:,:)} -- вторая строка массива @var{a}, @code{a(:,2)} или @code{a(:,2,:)} -- третий столбец, @code{a(:,:,0)} -- первый срез и т.д. Также можно выделить часть массива с m-го по n-ый элемент @code{a(m:n,:,:)} или просто @code{a(m:n)}.
@@ -54,7 +55,7 @@ MathGL имеет встроенный скриптовый язык MGL для
 Временные массивы не могут стоять в качестве первого аргумента команд, создающих массивы (например, @samp{new}, @samp{read}, @samp{hist} и т.д.).
 
 @item
-К скалярным переменным, кроме собственно чисел, относятся: специальные переменные @code{nan=#QNAN, pi=3.1415926..., on=1, off=0, :=-1}, переменные с суффиксами (@pxref{Data information}), переменные определенные командой @ref{define}. Также массивы размером 1x1x1 считаются скалярами (например, @samp{pi/dat.nx}).
+К скалярным переменным, кроме собственно чисел, относятся: специальные переменные @code{nan=#QNAN, inf=бесконечность, rnd=случайное число, pi=3.1415926..., on=1, off=0, :=-1}, переменные с суффиксами (@pxref{Data information}), переменные определенные командой @ref{define}. Также массивы размером 1x1x1 считаются скалярами (например, @samp{pi/dat.nx}).
 @end itemize
 Перед первым использованием все переменные должны быть определены с помощью команд, создающих массивы (@ref{new}, @ref{var}, @ref{list}, @ref{copy}, @ref{read}, @ref{hist}, @ref{sum} и др., см. @ref{Data constructor}, @ref{Data filling} и @ref{Make another data}).
 
@@ -102,21 +103,23 @@ MathGL имеет встроенный скриптовый язык MGL для
 @deftypefn {MGL command} {} defnum $N smth
 Задает @var{N}-ый аргумент скрипта равным числовому значению @var{smth}. Здесь @var{N} это цифра (0...9) или буква (a...z).
 @end deftypefn
-@cindex defpal
-@anchor{defpal}
-@deftypefn {MGL command} {} defpal $N smth
-Задает @var{N}-ый аргумент скрипта равным символу палитры с индексом, найденным из @var{smth}. Здесь @var{N} это цифра (0...9) или буква (a...z).
-@end deftypefn
+
+@comment  @cindex defpal
+@comment  @anchor{defpal}
+@comment  @deftypefn {MGL command} {} defpal $N smth
+@comment  Задает @var{N}-ый аргумент скрипта равным символу палитры с индексом, найденным из @var{smth}. Здесь @var{N} это цифра (0...9) или буква (a...z).
+@comment  @end deftypefn
 
 @cindex call
 @anchor{call}
 @deftypefn {MGL command} {} call 'fname' [ARG1 ARG2 ... ARG9]
 Переходит к выполнению (вызывает) подпрограммы @var{fname} (или внешнего скрипта, если функция не была найдена). Опциональные аргументы передаются в подпрограмму. См. также @ref{func}.
 @end deftypefn
+
 @cindex func
 @anchor{func}
 @deftypefn {MGL command} {} func 'fname' [narg=0]
\9eпÑ\80еделÑ\8fеÑ\82 Ð¿Ð¾Ð´Ð¿Ñ\80огÑ\80аммÑ\83 Ñ\81 Ð¸Ð¼ÐµÐ½ÐµÐ¼ @var{fname} Ð¸ Ð·Ð°Ð´Ð°ÐµÑ\82 Ñ\87иÑ\81ло Ñ\82Ñ\80ебÑ\83емÑ\8bÑ\85 Ð°Ñ\80гÑ\83менÑ\82ов. Ð\90Ñ\80гÑ\83менÑ\82Ñ\8b Ð±Ñ\83дÑ\83Ñ\82 Ð¿Ð¾Ð¼ÐµÑ\89енÑ\8b Ð² Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\8b Ñ\81кÑ\80ипÑ\82а $1, $2, ... $9. Ð\9eÑ\82меÑ\87Ñ\83, Ñ\87Ñ\82о Ð²Ñ\8bполнение Ð¾Ñ\81новной Ð¿Ñ\80огÑ\80аммÑ\8b Ð´Ð¾Ð»Ð¶Ð½Ð¾ Ð±Ñ\8bÑ\82Ñ\8c Ð¾Ñ\81Ñ\82ановлено Ð´Ð¾ Ð½Ð°Ñ\87ала Ð¾Ð¿Ñ\80еделений Ð¿Ð¾Ð´Ð¿Ñ\80огÑ\80амм. Ð¡Ð¼. Ñ\82акже @ref{stop},  @ref{return}.
\9eпÑ\80еделÑ\8fеÑ\82 Ð¿Ð¾Ð´Ð¿Ñ\80огÑ\80аммÑ\83 Ñ\81 Ð¸Ð¼ÐµÐ½ÐµÐ¼ @var{fname} Ð¸ Ð·Ð°Ð´Ð°ÐµÑ\82 Ñ\87иÑ\81ло Ñ\82Ñ\80ебÑ\83емÑ\8bÑ\85 Ð°Ñ\80гÑ\83менÑ\82ов. Ð\90Ñ\80гÑ\83менÑ\82Ñ\8b Ð±Ñ\83дÑ\83Ñ\82 Ð¿Ð¾Ð¼ÐµÑ\89енÑ\8b Ð² Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\8b Ñ\81кÑ\80ипÑ\82а $1, $2, ... $9. Ð\9eÑ\82меÑ\87Ñ\83, Ñ\87Ñ\82о Ð²Ñ\8bполнение Ð¾Ñ\81новной Ð¿Ñ\80огÑ\80аммÑ\8b Ð±Ñ\83деÑ\82 Ð¾Ñ\81Ñ\82ановлено Ð¿Ñ\80и Ð²Ñ\81Ñ\82Ñ\80еÑ\87е @code{func} -- Ð´ÐµÐ¹Ñ\81Ñ\82вÑ\83еÑ\82 Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñ\87но ÐºÐ¾Ð¼Ð¼Ð°Ð½Ð´Ðµ @ref{stop}. Ð¡Ð¼. Ñ\82акже @ref{return}.
 
 @end deftypefn
 @cindex return
@@ -184,6 +187,12 @@ MathGL имеет встроенный скриптовый язык MGL для
 Останавливает выполнение скрипта.
 @end deftypefn
 
+@cindex rkstep
+@anchor{rkstep}
+@deftypefn {MGL command} {} rkstep eq1;... var1;... [@code{dt=1}]
+Выполняет один шаг решения системы обыкновенных дифференциальных уравнений @{var1' = eq1, ... @} с временным шагом @var{dt}. Здесь переменные @samp{var1}, ... -- переменные, определенные в MGL скрипте ранее. При решении используется метод Рунге-Кутта 4-го порядка.
+@end deftypefn
+
 
 @c TODO Translate it!
 
@@ -200,9 +209,9 @@ MathGL имеет встроенный скриптовый язык MGL для
 
 There is LaTeX package @code{mgltex} (was made by Diego Sejas Viscarra) which allow one to make figures directly from MGL script located in LaTeX file.
 
-For using this package you need to specify @code{--shell-escape} option for @emph{latex/pdflatex} or manually run @emph{mglconv} tool for produced MGL scripts for generation of images. Don't forgot to run @emph{latex/pdflatex} second time to insert generated images into the output document.
+For using this package you need to specify @code{--shell-escape} option for @emph{latex/pdflatex} or manually run @emph{mglconv} tool with produced MGL scripts for generation of images. Don't forgot to run @emph{latex/pdflatex} second time to insert generated images into the output document. Also you need to run @emph{pdflatex} third time to update converted from EPS images if you are using vector EPS output (default).
 
-The package may have following options: @code{draft}, @code{final} -- the same as in the @emph{graphicx} package; @code{jpg}, @code{jpeg}, @code{png} -- for export to JPEG/PNG images; @code{eps}, @code{epsz} -- for export to uncompressed/compressed EPS format as primitives; @code{bps}, @code{bpsz} -- for export to uncompressed/compressed EPS format as bitmap, @code{pdf} -- for export to 3D PDF.
+The package may have following options: @code{draft}, @code{final} --- the same as in the @emph{graphicx} package; @code{on}, @code{off} --- to activate/deactivate the creation of scripts and graphics; @code{comments}, @code{nocomments} --- to make visible/invisible commentaries contained inside @code{mglcomment} environments; @code{jpg}, @code{jpeg}, @code{png} --- to export graphics as JPEG/PNG images; @code{eps}, @code{epsz} --- to export to uncompressed/compressed EPS format as primitives; @code{bps}, @code{bpsz} --- to export to uncompressed/compressed EPS format as bitmap (doesn't work with @emph{pdflatex}); @code{pdf} --- to export to 3D PDF; @code{tex} --- to export to @emph{LaTeX/tikz} document.
 
 The package defines the following environments:
 @table @samp
@@ -252,6 +261,8 @@ An example of usage of @samp{mgl} environment would be:
        Exactly the same as @samp{mglblock}, but it doesn't write to a file. This environment doesn't have arguments.
 @item mglfunc
        Is used to define MGL functions. It takes one mandatory argument, which is the name of the function, plus one additional argument, which specifies the number of arguments of the function. The environment needs to contain only the body of the function, since the first and last lines are appended automatically, and the resulting code is written at the end of the general script, after the @ref{stop} command, which is also written automatically. The warning is produced if 2 or more function with the same name is defined.
+@item mglcomment
+       Is used to contain multiline commentaries. This commentaries will be visible/invisible in the output document, depending on the use of the package options @code{comments} and @code{nocomments} (see above), or the @code{\mglcomments} and @code{\mglnocomments} commands (see bellow).
 @item mglsetup
        If many scripts with the same code are to be written, the repetitive code can be written inside this environment only once, then this code will be used automatically every time the @samp{\mglplot} command is used (see below). It takes one optional argument, which is a name to be associated to the corresponding contents of the environment; this name can be passed to the @samp{\mglplot} command to use the corresponding block of code automatically (see below).
 @end table
@@ -297,6 +308,12 @@ An example of usage of @samp{\mglplot} command would be:
        This is like @samp{\mglgraphics} but, instead of creating/including the corresponding image, it writes the contents of the MGL script to the LaTeX document, and numerates the lines.
 @item \mgldir
        This command can be used in the preamble of the document to specify a directory where LaTeX will save the MGL scripts and generate the corresponding images. This directory is also where @samp{\mglgraphics} and @samp{\mglinclude} will look for scripts.
+@item \mglquality
+       Adjust the quality of the MGL graphics produced similarly to @ref{quality}.
+@item \mgltexon, \mgltexoff
+       Activate/deactivate the creation of MGL scripts and images. Notice these commands have local behavior in the sense that their effect is from the point they are called on.
+@item \mglcomment, \mglnocomment
+       Make visible/invisible the contents of the @code{mglcomment} environments. These commands have local effect too.
 @item \mglTeX
        It just pretty prints the name of the package.
 @end table
@@ -361,6 +378,13 @@ As an additional feature, when an image is not found or cannot be included, inst
 Разбирает строку @var{formula} и возвращает полученный массив. В отличие от @code{AddVar()} или @code{FindVar()}, это обычный массив данных, который следует удалить после использования.
 @end deftypefn
 
+@deftypefn {Метод класса @code{mglParse}} @code{mglDataC} CalcComplex (@code{const char *}formula)
+@deftypefnx {Метод класса @code{mglParse}} @code{mglDataC} CalcComplex (@code{const wchar_t *}formula)
+@deftypefnx {Функция С} @code{HADT} mgl_parser_calc_complex (@code{HMPR} p, @code{const char *}formula)
+@deftypefnx {Функция С} @code{HADT} mgl_parser_calc_complexw (@code{HMPR} p, @code{const wchar_t *}formula)
+Разбирает строку @var{formula} и возвращает полученный массив с комплексными значениями. В отличие от @code{AddVar()} или @code{FindVar()}, это обычный массив данных, который следует удалить после использования.
+@end deftypefn
+
 
 @deftypefn {Метод класса @code{mglParse}} @code{void} AddParam (@code{int} n, @code{const char *}str)
 @deftypefnx {Метод класса @code{mglParse}} @code{void} AddParam (@code{int} n, @code{const wchar_t *}str)
@@ -445,6 +469,13 @@ As an additional feature, when an image is not found or cannot be included, inst
 Возвращает описание команды MGL с именем @var{name}.
 @end deftypefn
 
+@deftypefn {Method on @code{mglParse}} @code{void} RK_Step (@code{const char *}eqs, @code{const char *}vars, @code{mreal} dt=@code{1})
+@deftypefnx {Method on @code{mglParse}} @code{void} RK_Step (@code{const wchar_t *}eqs, @code{const wchar_t *}vars, @code{mreal} dt=@code{1})
+@deftypefnx {C function} @code{void} mgl_rk_step (@code{HMPR} p, @code{const char *}eqs, @code{const char *}vars, @code{mreal} dt)
+@deftypefnx {C function} @code{void} mgl_rk_step_w (@code{HMPR} p, @code{const wchar_t *}eqs, @code{const wchar_t *}vars, @code{mreal} dt)
+Make one step for ordinary differential equation(s) @{var1' = eq1, ... @} with time-step @var{dt}. Here strings @var{eqs} and @var{vars} contain the equations and variable names separated by symbol @samp{;}. The variable(s) @samp{var1}, ... are the ones, defined in MGL script previously. The Runge-Kutta 4-th order method is used.
+@end deftypefn
+
 @end ifclear
 
 @external{}
index a71c3481effac04568aa4705858f217d44e6b812..bd7c026171899413355458ea122fdaea70a8d795 100644 (file)
@@ -27,7 +27,9 @@ set to use new color from palette for each point (not for each curve, as default
 
 set to disable ticks tuning in @ref{axis} and @ref{colorbar};
 
-set to draw @ref{grid} lines at subticks coordinates too.
+set to draw @ref{grid} lines at subticks coordinates too;
+
+define complex variable/expression in MGL script if placed at beginning.
 
 @item #
 set to use solid marks (see @ref{Line styles}) or solid @ref{error} boxes;
@@ -51,7 +53,13 @@ start comment in @ref{MGL scripts} or in @ref{Command options}.
 @item $
 denote parameter of @ref{MGL scripts}.
 
+@item %
+set color scheme along 2 coordinates @ref{Color scheme}.
+
 @item &
+
+set to pass long integer number in tick template @ref{xtick}, @ref{ytick}, @ref{ztick}, @ref{ctick}.
+
 operation in @ref{Textual formulas}.
 
 @item @quoteright{}
@@ -446,7 +454,9 @@ name of u-axis (one of ternary axis);
 variable in @ref{Textual formulas}, which usually denote array itself.
 
 @item V
-arrow style (see @ref{Line styles}).
+arrow style (see @ref{Line styles});
+
+place text centering on vertical direction for @ref{text}.
 
 @item v
 one of marks (see @ref{Line styles});
index a71c3481effac04568aa4705858f217d44e6b812..bd7c026171899413355458ea122fdaea70a8d795 100644 (file)
@@ -27,7 +27,9 @@ set to use new color from palette for each point (not for each curve, as default
 
 set to disable ticks tuning in @ref{axis} and @ref{colorbar};
 
-set to draw @ref{grid} lines at subticks coordinates too.
+set to draw @ref{grid} lines at subticks coordinates too;
+
+define complex variable/expression in MGL script if placed at beginning.
 
 @item #
 set to use solid marks (see @ref{Line styles}) or solid @ref{error} boxes;
@@ -51,7 +53,13 @@ start comment in @ref{MGL scripts} or in @ref{Command options}.
 @item $
 denote parameter of @ref{MGL scripts}.
 
+@item %
+set color scheme along 2 coordinates @ref{Color scheme}.
+
 @item &
+
+set to pass long integer number in tick template @ref{xtick}, @ref{ytick}, @ref{ztick}, @ref{ctick}.
+
 operation in @ref{Textual formulas}.
 
 @item @quoteright{}
@@ -446,7 +454,9 @@ name of u-axis (one of ternary axis);
 variable in @ref{Textual formulas}, which usually denote array itself.
 
 @item V
-arrow style (see @ref{Line styles}).
+arrow style (see @ref{Line styles});
+
+place text centering on vertical direction for @ref{text}.
 
 @item v
 one of marks (see @ref{Line styles});
diff --git a/texinfo/version.texi b/texinfo/version.texi
deleted file mode 100644 (file)
index eeb9851..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-@set VERSION 2.3
-@set MINVER .2
diff --git a/texinfo/version.texi.in b/texinfo/version.texi.in
new file mode 100644 (file)
index 0000000..8ac338c
--- /dev/null
@@ -0,0 +1,4 @@
+@set VERSION ${MathGL_VERSION_MAJOR}.${MathGL_VERSION_MINOR}
+@set MINVER 
+@c @set MINVER .1
+@set NIGHT ${MGL_NIGHT}
index c06a7fd7580dbf5729e689f60c6b4dfcfaa956ab..9288b53e7587c957d59d18a2edf7763bb36710c5 100644 (file)
@@ -52,10 +52,10 @@ Generally, MathGL is GPL library. However, you can use LGPL license for MathGL c
 
 @strong{Latest news}
 @itemize
-@item @emph{2 February 2015.}
-New version (v.@value{VERSION}@value{MINVER}) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are parallelizing of reading data files, updating @ref{LaTeX package}, other minor improvements and bugfixes, which denoted @ref{News, here}.
+@item @emph{1 June 2015.}
+New version (v.@value{VERSION}@value{MINVER}) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are new functions, plot types and styles, improvement in MGL scripts and in mgltex, speeding up and bugfixes, which denoted @ref{News, here}.
 @item @emph{7 August 2014.}
-New version (v.@value{VERSION}) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are many major improvements for both MathGL core and for UDAV, which denoted @ref{News, here}.
+New version (v.2.3) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are many major improvements for both MathGL core and for UDAV, which denoted @ref{News, here}.
 @end itemize
 
 There is detailed @ref{News, news list}. Sourceforge project page @uref{http://sourceforge.net/projects/mathgl/, here}.
@@ -75,6 +75,44 @@ Javascript interface was developed with support of @url{http://www.datadvance.ne
 
 @itemize
 
+@item @strong{1 June 2015.}
+New version (v.2.3.3) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are new functions, plot types and styles, improvement in MGL scripts and in mgltex, speeding up and bugfixes:
+@itemize @bullet
+@item Update @ref{LaTeX package} (thanks to Diego Sejas Viscarra)
+@item Add @ref{surfca} and @ref{surf3ca} plots.
+@item Add @ref{wavelet} transforms.
+@item Add @ref{attachlight} for attaching light settings to inplots.
+@item Add manual rotation angle for @ref{axis} ticks (by "value" option).
+@item Add @code{mglDataS} class which is similar to std::vector<double> one.
+@item Add missing @code{mglDataC} functions.
+
+@item Add style '%' for color scheme along 2 coordinates (as in @ref{map}).
+@item If tick template start with '&' then long integer is passed instead of double.
+@item Add style 'V' for drawing @ref{text} centered vertically.
+@item Add style "dN" in @ref{smooth} for averaging over (2*N+1)-th points.
+@item Add TeX symbols "\quote", "--" and Cyrillic ones.
+
+@item Add complex numbers in MGL -- any expression started with '!' will have complex value(s).
+@item Add @ref{rkstep} command for Runge-Kutta step in MGL script.
+@item Add functions 'min()', 'max()' to MGL parser and formula evaluation.
+@item MGL command @ref{join} now can join arbitrary number of data arrays.
+@item Command @ref{stop} is not required to be placed before @ref{func}.
+@item Add warning about writing to temporary arrays in MGL scripts.
+@item Names 'rnd','nan','inf' are reserved in MGL scripts now.
+
+@item Add annotation for plot styles and options into header files.
+@item Greatly improve the speed of formula parsing for MGL scripts
+@item Update JS interface
+@item Add binary font files for speeding up initialization and font loading
+@item Exclude "pure" attribute for function due to compatibility reasons
+@item Add mgl_set_size_scl() for additional scaling width and height of the image
+@item Add options -S, -q for mglconv
+@item Rearrange toolbuttons in @ref{UDAV}.
+@item Bugfix for @ref{flow} and @ref{pipe} functions
+@item Other minor improvements, bugfixes and compatibility changes
+@end itemize
+
+
 @item @strong{2 February 2015.}
 New version (v.2.3.2) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are minor improvements and bugfixes:
 @itemize @bullet
index c06a7fd7580dbf5729e689f60c6b4dfcfaa956ab..58d1bc00396d9b2d4ecc725a0160d6557d201b7e 100644 (file)
@@ -52,10 +52,10 @@ Generally, MathGL is GPL library. However, you can use LGPL license for MathGL c
 
 @strong{Latest news}
 @itemize
-@item @emph{2 February 2015.}
-New version (v.@value{VERSION}@value{MINVER}) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are parallelizing of reading data files, updating @ref{LaTeX package}, other minor improvements and bugfixes, which denoted @ref{News, here}.
+@item @emph{1 June 2015.}
+New version (v.@value{VERSION}@value{MINVER}) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are new functions, plot types and styles, improvement in MGL scripts and in mgltex, speeding up and bugfixes, which denoted @ref{News, here}.
 @item @emph{7 August 2014.}
-New version (v.@value{VERSION}) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are many major improvements for both MathGL core and for UDAV, which denoted @ref{News, here}.
+New version (v.2.3) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are many major improvements for both MathGL core and for UDAV, which denoted @ref{News, here}.
 @end itemize
 
 There is detailed @ref{News, news list}. Sourceforge project page @uref{http://sourceforge.net/projects/mathgl/, here}.
@@ -75,6 +75,43 @@ Javascript interface was developed with support of @url{http://www.datadvance.ne
 
 @itemize
 
+@item @strong{1 June 2015.}
+New version (v.2.3.3) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are new functions, plot types and styles, improvement in MGL scripts and in mgltex, speeding up and bugfixes:
+@itemize @bullet
+@item Update @ref{LaTeX package} (thanks to Diego Sejas Viscarra)
+@item Add @ref{surfca} and @ref{surf3ca} plots.
+@item Add @ref{wavelet} transforms.
+@item Add @ref{attachlight} for attaching light settings to inplots.
+@item Add manual rotation angle for @ref{axis} ticks (by "value" option).
+@item Add @code{mglDataS} class which is similar to std::vector<double> one.
+@item Add missing @code{mglDataC} functions.
+
+@item Add style '%' for color scheme along 2 coordinates (as in @ref{map}).
+@item If tick template start with '&' then long integer is passed instead of double.
+@item Add style 'V' for drawing @ref{text} centered vertically.
+@item Add style "dN" in @ref{smooth} for averaging over (2*N+1)-th points.
+@item Add TeX symbols "\quote", "--" and Cyrillic ones.
+
+@item Add complex numbers in MGL -- any expression started with '!' will have complex value(s).
+@item Add @ref{rkstep} command for Runge-Kutta step in MGL script.
+@item Add functions 'min()', 'max()' to MGL parser and formula evaluation.
+@item MGL command @ref{join} now can join arbitrary number of data arrays.
+@item Command @ref{stop} is not required to be placed before @ref{func}.
+@item Add warning about writing to temporary arrays in MGL scripts.
+@item Names 'rnd','nan','inf' are reserved in MGL scripts now.
+
+@item Add annotation for plot styles and options into header files.
+@item Greatly improve the speed of formula parsing for MGL scripts
+@item Update JS interface
+@item Add binary font files for speeding up initialization and font loading
+@item Exclude "pure" attribute for function due to compatibility reasons
+@item Add mgl_set_size_scl() for additional scaling width and height of the image
+@item Add options -S, -q for mglconv
+@item Rearrange toolbuttons in @ref{UDAV}.
+@item Bugfix for @ref{flow} and @ref{pipe} functions
+@item Other minor improvements, bugfixes and compatibility changes
+@end itemize
+
 @item @strong{2 February 2015.}
 New version (v.2.3.2) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are minor improvements and bugfixes:
 @itemize @bullet
index 4b38cfe3727d1070c510990074d21ee856b8b329..4104713cc1aa599f816596d6d75649526290fe2a 100644 (file)
--- a/todo.txt
+++ b/todo.txt
@@ -2,17 +2,14 @@
 
 ============= FAR FUTURE ================
 
-1. Graph(mreal x, mreal y, names, styles, font, size); -- names = "node1[node2,node3,node4[node5,node6]]", styles -- the same + apply for subnodes if absent. Styles are colors (fill,border,line), dash (to subnodes), marks "dos^v><", arrows.
-2. introduce new primitive type=5 -- arrow for Quality&3!=3. for better drawing in projections + json/view ?!?
-3. GTK window/widgets ???
-4. 2D textures as one of standard way for coloring -- if '%' present in color scheme
+1. GTK window/widgets ???
+2. Export to COLLADA !!!
+3. Export to X3D !!!
+4. 3D text (with depth), and text along 3D curve (for Quality=3) ???
 5. Improve fplot, fsurf ???
 6. Get true coordinates in CalcXYZ for curved equations too.
-7. setLineDash in JSON
-8. add real(), imag(), conj() + accurate types in MGL + add 'complex' in MGL ???
 9. Inplot data should have ranges (add mglInPlot{x1,x2,y1,y2,Bp or something like this} which include mglMatrix instead of mglBase::Bp) + calc coor + JS
 10. Test mglDataC::Diffraction() + write sample + add rational function???
-11. Complex (hex) colors in inline text command (like #{b9} or #{x0000ff})
 12. Extra markers for '&' and '&#' signs ?!?
 13. Enable consecutive (as multiplication of matrices instead of single summary one) rotation of axis + the same in JS. Problem with widgets?!?
 14. Export background image to svg ???
 20. Extend 'ask' by adding multiple questions simultaneously (+ set/get default values from file ???)
 21. Occasional seg.fault in mgl_qt_example at exit
 
-ZZ. Update *.i for new functions {before release!!!}
-
 
 ============= NEW FEATURES =============
 
-1. Export to COLLADA !!!
-2. 3D text (with depth, for Quality=3)
-3. Text along 3D curve (for Quality=3)
-4. Check centered curved text (see text2)
-
-5. Export to X3D
-6. New tests:
+1. New tests:
        c. Tests for mglDataC arrays (as separate flag)
        e. Test for Crop, Momentum, NormSl, Sew, DiffParam, Envelope, STFA for all directions "xyz"; Clean, Last, First, Find, Spline3, FindAny, Insert, Delete, Put, SetId/Column, Squeeze, Extend, Trace, Combine, new Max/Min/Momentum, FillSample, Hist, operators, Sort, Roots, Jacobian
        u. Test FlowP + 3d
 
+2. Add manual shift of unrotated axis/tick labels.
+3. Centered curved text (see text2)
+
+5. Check lighting in OpenGL mode
+6. Add string manipulation -- {'str',val}=>str[val]; {'str',v1,v2}=>str.substr(v1,v2) [v1,v2 can be -1]; {'ch'+val'}=>char(ch+val)
 7. Improve z-order for rapidly oscillating surfaces
-8. Manual rotation angle for axis ticks (as "value" option?!)
-9. Export to XPM (like GIF)
-10. Title and perspective
-11. Adjust BarWidth for proper using prevous (i-1) point
-
-12. introduce a set of default arrays like "x", "y", "z" and "t" for MGL ???
-13. Use mgltex.dtx (see e-mail 15 November)
-14. Binary font files for particular platform (+ check ARM). Add utility to translate from current (textual) to binary.
-16. Contour lines above/under surface (e-mail 10.12.14)
+8. Contour lines for bilinear interpolation (strong saddle-like faces)
+9. More accurate face cutting if one partially out of axis ranges
+
 17. Iris plot -- https://en.wikipedia.org/wiki/Iris_flower_data_set
 
+ZZ. Update *.i for new functions {before release!!!}
+
+
 ============= DOCUMENTATION =============
 
 A. Paper about MathGL!!!
@@ -60,7 +51,6 @@ B. Add chapter with real samples
 C. Translate to Russian everything
 D. Docs about JS interface
 
-1. Docs about new Smooth() styles
 
 YY. Sample like http://pyxplot.org.uk/examples/05ap/02hlines/index.html using Stem()
 
@@ -77,6 +67,9 @@ YY. Sample like http://pyxplot.org.uk/examples/05ap/02hlines/index.html using St
        d. Reset script after saving to HDF5 or putting to main script
        e. Ask about script changes before closing data tab
 
+4. List of constants into the list of data?!
+5. Add color cycle ???
+
 
 ============= UNSURE ===========
 
index 6f9c045c16510dd762d83b756fbd7ee1bcd5aba0..274ae10148f063056f0809617402b8c0109ae090 100644 (file)
@@ -1,5 +1,7 @@
 if(enable-qt)
 
+configure_file(${MathGL_SOURCE_DIR}/udav/mgl.xml.in ${MathGL_BINARY_DIR}/udav/mgl.xml)
+
 #set(mgl_wnd_src window.cpp)
 set(udav_src anim_dlg.cpp find_dlg.cpp mem_pnl.cpp prop_dlg.cpp textedit.cpp args_dlg.cpp
        help_pnl.cpp newcmd_dlg.cpp text_pnl.cpp calc_dlg.cpp hint_dlg.cpp
@@ -53,8 +55,16 @@ install(
        TARGETS udav
        RUNTIME DESTINATION bin
 )
-install(FILES udav.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications/)
 install(FILES udav.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps/)
 install(FILES udav_ru.qm DESTINATION ${CMAKE_INSTALL_PREFIX}/share/udav/)
-
+find_program(findupddb update-desktop-database)
+if(findupddb)
+       install(FILES udav.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications/)
+       install(CODE "execute_process(COMMAND \"${findupddb}\" \"${CMAKE_INSTALL_PREFIX}/share/applications\")")
+endif(findupddb)
+find_program(findupmdb update-mime-database)
+if(findupmdb)
+       install(FILES ${CMAKE_BINARY_DIR}/udav/mgl.xml DESTINATION ${CMAKE_INSTALL_PREFIX}/share/mime/packages/)
+       install(CODE "execute_process(COMMAND \"${findupmdb}\" \"${CMAKE_INSTALL_PREFIX}/share/mime\")")
+endif(findupmdb)
 endif(enable-qt)
index a12fbd79af8298b3276c33b1d992d1b5cd52f1ee..37307cce038946dae8c135b07b34d64abf9224cd 100644 (file)
@@ -78,7 +78,7 @@ CalcDialog::CalcDialog(QWidget *parent) : QWidget(parent)
        connect(b, SIGNAL(clicked()), this, SLOT(key9()));
        b = new QPushButton("+", this); g->addWidget(b, 0, 3);  b->setMaximumWidth(minw);
        connect(b, SIGNAL(clicked()), this, SLOT(keyAdd()));
-       b = new QPushButton(QString::fromWCharArray(L"π"), this);      g->addWidget(b, 0, 4);
+       b = new QPushButton(QString::fromWCharArray(L"\u03c0"), this);  g->addWidget(b, 0, 4);
        connect(b, SIGNAL(clicked()), this, SLOT(keyPi()));             b->setMaximumWidth(minw);
 
        b = new QPushButton("4", this); g->addWidget(b, 1, 0);  b->setMaximumWidth(minw);
@@ -89,7 +89,7 @@ CalcDialog::CalcDialog(QWidget *parent) : QWidget(parent)
        connect(b, SIGNAL(clicked()), this, SLOT(key6()));
        b = new QPushButton("-", this); g->addWidget(b, 1, 3);  b->setMaximumWidth(minw);
        connect(b, SIGNAL(clicked()), this, SLOT(keySub()));
-       b = new QPushButton(QString::fromWCharArray(L"x²"), this);     g->addWidget(b, 1, 4);
+       b = new QPushButton(QString::fromWCharArray(L"x\xb2"), this);   g->addWidget(b, 1, 4);
        connect(b, SIGNAL(clicked()), this, SLOT(keyX2()));             b->setMaximumWidth(minw);
 
        b = new QPushButton("1", this); g->addWidget(b, 2, 0);  b->setMaximumWidth(minw);
@@ -230,21 +230,21 @@ void CalcDialog::fillFuncName()
        funcName[7]<<"airy_ai()"<<"airy_bi()"<<"airy_dai()"<<"airy_dbi()"<<"gamma()"<<"psi()"<<"beta(,)";
        funcInfo[7]<<"Airy function Ai(x)"<<"Airy function Bi(x)"
                        <<"Derivative of Airy function Ai'(x)"<<"Derivative of Airy function Bi'(x)"
-                       <<QString::fromWCharArray(L"Gamma function Γ(x)")
-                       <<QString::fromWCharArray(L"Digamma function Γ'(x)/Γ(x)")
-                       <<QString::fromWCharArray(L"Beta function Γ(x)*Γ(y)/Γ(x+y)");
+                       <<QString::fromWCharArray(L"Gamma function \u0393(x)")
+                       <<QString::fromWCharArray(L"Digamma function \u0393'(x)/\u0393(x)")
+                       <<QString::fromWCharArray(L"Beta function \u0393(x)*\u0393(y)/\u0393(x+y)");
        // exp integrals
        funcName[8]<<"ci()"<<"si()"<<"ei()"<<"e1()"<<"e2()"<<"ei3()";
-       funcInfo[8]<<QString::fromWCharArray(L"Cosine integral dt cos(t)/t")
-                       <<QString::fromWCharArray(L"Sine integral dt sin(t)/t")
-                       <<QString::fromWCharArray(L"Integral -dt exp(-t)/t")
-                       <<QString::fromWCharArray(L"Integral Re dt exp(-xt)/t")
-                       <<QString::fromWCharArray(L"Integral Redt exp(-xt)/t^2")
-                       <<QString::fromWCharArray(L"Integral dt exp(-t^3)");
+       funcInfo[8]<<QString::fromWCharArray(L"Cosine integral \u222bdt cos(t)/t")
+                       <<QString::fromWCharArray(L"Sine integral \u222bdt sin(t)/t")
+                       <<QString::fromWCharArray(L"Integral -\u222bdt exp(-t)/t")
+                       <<QString::fromWCharArray(L"Integral Re \u222bdt exp(-xt)/t")
+                       <<QString::fromWCharArray(L"Integral Re\u222bdt exp(-xt)/t^2")
+                       <<QString::fromWCharArray(L"Integral \u222bdt exp(-t^3)");
        // special
        funcName[9]<<"erf()"<<"z()"<<"legendre(,)"<<"dilog()"<<"eta()"<<"zeta()"<<"w0()"<<"w1()";
-       funcInfo[9]<<QString::fromWCharArray(L"Error function 2/√π dt exp(-t^2)")<<"Dawson function"
-                       <<"Legendre polynomial P_l(x)"<<QString::fromWCharArray(L"Dilogarithm -Reds ln(1-s)/s")
+       funcInfo[9]<<QString::fromWCharArray(L"Error function 2/√π \u222bdt exp(-t^2)")<<"Dawson function"
+                       <<"Legendre polynomial P_l(x)"<<QString::fromWCharArray(L"Dilogarithm -Re\u222bds ln(1-s)/s")
                        <<"Eta function (1-2/2^s)*zeta(s)"<<"Riemann zeta function"
                        <<"Lambert W function W_0(x)"<<"Lambert W function W_{-1}(x)";
 }
index 9888ffd3509380e35e2f768defb6e4e598716709..950886a53d43b17dc58a1827ec983b4db6a66fd9 100644 (file)
@@ -98,30 +98,40 @@ void DatPanel::refresh()
                }
                tab->setHorizontalHeaderLabels(head);
        }
-       register long i,j,m=var->s.length();
-       register mreal f;
+       long m=var->s.length();
        QString s,d;
        if(rc)
        {
                QStringList sh,sv;
-               for(i=0;i<nx;i++)       sh<<QString::number(i);
+               for(long i=0;i<nx;i++)  sh<<QString::number(i);
                tab->setHorizontalHeaderLabels(sh);
-               for(i=0;i<ny;i++)       sv<<QString::number(i);
+               for(long i=0;i<ny;i++)  sv<<QString::number(i);
                tab->setVerticalHeaderLabels(sv);
-               for(i=0;i<nx;i++)       for(j=0;j<ny;j++)
+               for(long i=0;i<nx;i++)  for(long j=0;j<ny;j++)
                        tab->setItem(j,i,new QTableWidgetItem);
        }
-       for(i=0;i<nx;i++)       for(j=0;j<ny;j++)
+       mglDataC *cc = dynamic_cast<mglDataC*>(var);
+       if(cc)  for(long i=0;i<nx;i++)  for(long j=0;j<ny;j++)
        {
-               f = var->v(i,j,kz);
+               dual f = cc->a[i+nx*(j+ny*kz)];
+               if(mgl_isnan(f))        s = "nan";
+               else if(mgl_isbad(f))   s="inf";
+               else if(imag(f)>0)      s.sprintf("%.15g+%.15gi",real(f),imag(f));
+               else if(imag(f)<0)      s.sprintf("%.15g-%.15gi",real(f),-imag(f));
+               else    s.sprintf("%15g",real(f));
+               tab->item(j,i)->setText(s);
+       }
+       else    for(long i=0;i<nx;i++)  for(long j=0;j<ny;j++)
+       {
+               double f = var->v(i,j,kz);
                if(mgl_isnan(f))        s = "nan";
                else if(mgl_isbad(f))   s=f>0?"inf":"-inf";
-               else    s.sprintf("%g",f);
+               else    s.sprintf("%.15g",f);
                tab->item(j,i)->setText(s);
        }
        infoDlg->allowRefresh=true;     infoDlg->refresh();
        QChar *ss = new QChar[m+1];
-       for(i=0;i<m;i++)        ss[i] = var->s[i];
+       for(long i=0;i<m;i++)   ss[i] = var->s[i];
        s = QString(ss, m);     delete []ss;
        d.sprintf("%d * %d * %d", nx, ny, nz);
        ready = true;
@@ -157,23 +167,77 @@ void DatPanel::setSlice(int k)
        }
 }
 //-----------------------------------------------------------------------------
+dual mgl_str2dual(const char *s)
+{
+       setlocale(LC_NUMERIC, "C");
+       double re=0,im=0;       size_t ll=strlen(s);
+       while(s[ll]<=' ')       ll--;
+       if(*s=='(')             sscanf(s,"(%lg,%lg)",&re,&im);
+       else if(*s=='i')        {       re=0;   im=atof(s+1);   }
+       else if(*s=='[')        sscanf(s,"[%lg,%lg]",&re,&im);
+       else if(*s=='{')        sscanf(s,"{%lg,%lg}",&re,&im);
+       else if(s[ll]=='i')
+       {
+               double a,b;
+               int s1=sscanf(s,"%lg+%lgi",&re,&im);
+               int s2=sscanf(s,"%lg-%lgi",&a,&b);
+               if(s1<2)
+               {
+               if(s2==2)       {       re=a;   im=-b;  }
+               else    {       im=atof(s);     re=0;   }
+               }
+       }
+       else
+       {
+               double a,b;
+               int s1=sscanf(s,"%lg+i%lg",&re,&im);
+               int s2=sscanf(s,"%lg-i%lg",&a,&b);
+               if(s1<2)
+               {
+               if(s2==2)       {       re=a;   im=-b;  }
+               else    {       re=atof(s);     im=0;   }
+               }
+       }
+       setlocale(LC_NUMERIC, "");
+       return dual(re,im);
+}
+//-----------------------------------------------------------------------------
 void DatPanel::putValue(int r, int c)
 {
        if(!var || r<0 || c<0 || r>=ny || c>=nx || !ready)      return;
        QString s = tab->item(r,c)->text().toLower();
        mreal f;
+       dual g;
        if(s=="nan")    f=NAN;
        else if(s=="inf")       f=INFINITY;
        else if(s=="-inf")      f=-INFINITY;
-       else    f = s.toDouble();
-       if(f!=var->v(c,r,kz))
+       else    g = mgl_str2dual(s.toStdString().c_str());      //f = s.toDouble();
+       f = real(g);
+       mglDataC *cc = dynamic_cast<mglDataC*>(var);
+       if(cc)
        {
-               if(mgl_isnan(f))        s="nan";
-               else if(mgl_isbad(f))   s=f>0?"inf":"-inf";
-               else    s.sprintf("%g", f);
-               tab->item(r,c)->setText(s);
+               if(g!=cc->a[c+nx*(r+ny*kz)])
+               {
+                       if(mgl_isnan(g))        s="nan";
+                       else if(mgl_isbad(g))   s="inf";
+                       else if(imag(g)>0)      s.sprintf("%g+%gi",real(g),imag(g));
+                       else if(imag(g)<0)      s.sprintf("%g-%gi",real(g),-imag(g));
+                       else    s.sprintf("%g",real(g));
+                       tab->item(r,c)->setText(s);
+               }
+               cc->a[c+nx*(r+ny*kz)] = g;
+       }
+       else
+       {
+               if(f!=var->v(c,r,kz))
+               {
+                       if(mgl_isnan(f))        s="nan";
+                       else if(mgl_isbad(f))   s=f>0?"inf":"-inf";
+                       else    s.sprintf("%g", f);
+                       tab->item(r,c)->setText(s);
+               }
+               var->set_v(f,c,r,kz);
        }
-       var->set_v(f,c,r,kz);
        infoDlg->refresh();
 }
 //-----------------------------------------------------------------------------
@@ -401,8 +465,8 @@ void DatPanel::hist()
        bool res = d->exec();
        if(res && !v1->text().isEmpty() && !v2->text().isEmpty() && !id->text().isEmpty())
        {
-               mglData *vv = parser.AddVar(id->text().toStdString().c_str());
-               vv->Set(mglData(true,mgl_data_hist(var, nm->value(), v1->text().toDouble(), v2->text().toDouble(),0)));
+               mglData *vv = dynamic_cast<mglData*>(parser.AddVar(id->text().toStdString().c_str()));
+               if(vv)  vv->Set(mgl_data_hist(var, nm->value(), v1->text().toDouble(), v2->text().toDouble(),0));
                updateDataItems();
        }
 }
index 2ada16022c04ad2582ad0075d46f3fc681e0be72..1864664a64f16f05abbfeb4c95c85d82c2f87dca 100644 (file)
@@ -19,6 +19,7 @@
  ***************************************************************************/
 #include <QLayout>
 #include <QLineEdit>
+#include <QToolBar>
 #include <QPushButton>
 #include <QTextBrowser>
 #include <QToolButton>
@@ -38,26 +39,20 @@ void showHelpMGL(QWidget *p,QString s)
 //-----------------------------------------------------------------------------
 HelpPanel::HelpPanel(QWidget *parent) : QWidget(parent)
 {
-       QPushButton *b;
-       QToolButton *t;
-       QVBoxLayout *o = new QVBoxLayout(this);
-       QHBoxLayout *a = new QHBoxLayout();     o->addLayout(a);
-       help = new QTextBrowser(this);          o->addWidget(help);
-       help->setOpenExternalLinks(false);
 
-       b = new QPushButton(QPixmap(":/png/go-previous.png"), tr("Backward"));
-       connect(b, SIGNAL(clicked()), help, SLOT(backward()));  a->addWidget(b);
-       entry = new QLineEdit(this);    a->addWidget(entry);
+       QToolBar *t = new QToolBar(this);       t->setMovable(false);
+       QVBoxLayout *v = new QVBoxLayout(this); v->addWidget(t);
+       help = new QTextBrowser(this);  v->addWidget(help);     help->setOpenExternalLinks(false);
+
+       t->addAction(QPixmap(":/png/go-previous.png"), tr("Backward"), help, SLOT(backward()));
+       entry = new QLineEdit(this);    t->addWidget(entry);
        connect(entry, SIGNAL(textChanged(const QString &)), this, SLOT(showHelp(const QString &)));
        connect(entry, SIGNAL(returnPressed()), this, SLOT(showHelp()));
-       b = new QPushButton(QPixmap(":/png/go-next.png"), tr("Forward"));
-       connect(b, SIGNAL(clicked()), help, SLOT(forward()));   a->addWidget(b);
-//     b = new QPushButton(QPixmap(":/png/help-faq.png"), tr("Examples"));
-//     connect(b, SIGNAL(clicked()), this, SLOT(showExamples()));      a->addWidget(b);
-       t = new QToolButton(this);      t->setIcon(QPixmap(":/png/zoom-in.png"));
-       connect(t, SIGNAL(clicked()), this, SLOT(zoomIn()));    a->addWidget(t);
-       t = new QToolButton(this);      t->setIcon(QPixmap(":/png/zoom-out.png"));
-       connect(t, SIGNAL(clicked()), this, SLOT(zoomOut()));   a->addWidget(t);
+       t->addAction(QPixmap(":/png/go-next.png"), tr("Forward"), help, SLOT(forward()));
+       t->addSeparator();
+//     t->addAction(QPixmap(":/png/help-faq.png"), tr("Examples"), this, SLOT(showExamples()));
+       t->addAction(QPixmap(":/png/zoom-in.png"), tr("Zoom in text"), this, SLOT(zoomIn()));
+       t->addAction(QPixmap(":/png/zoom-out.png"), tr("Zoom out text"), this, SLOT(zoomOut()));
        setWindowTitle(tr("Help"));
 }
 //-----------------------------------------------------------------------------
index 77dd3c16b1ec25b3968b879c9f0cc752be5a5b52..7b9da01bcd268f07020036a3ff12556b9fd1eed8 100644 (file)
@@ -19,7 +19,7 @@
  ***************************************************************************/
 #include <QLayout>
 #include <QTableWidget>
-#include <QToolButton>
+#include <QToolBar>
 #include <QInputDialog>
 #include <QMessageBox>
 #include <mgl2/mgl.h>
@@ -49,33 +49,18 @@ void refreshMemPanel(QWidget *p)
 //-----------------------------------------------------------------------------
 MemPanel::MemPanel(QWidget *parent) : QWidget(parent)
 {
-       QHBoxLayout *h;
-       QVBoxLayout *v;
-       QToolButton *b;
-
        infoDlg = new InfoDialog(this);
        infoDlg->setModal(true);        infoDlg->allowRefresh=false;
 
-       v = new QVBoxLayout(this);      h = new QHBoxLayout();  v->addLayout(h);
-       b = new QToolButton(this);      b->setIcon(QPixmap(":/png/document-new.png"));
-       b->setToolTip(tr("Create new data array"));             h->addWidget(b);
-       connect(b, SIGNAL(clicked()), this, SLOT(newTable()));
-       b = new QToolButton(this);      b->setIcon(QPixmap(table_xpm));
-       b->setToolTip(tr("Edit selected data array"));  h->addWidget(b);
-       connect(b, SIGNAL(clicked()), this, SLOT(editData()));
-       b = new QToolButton(this);      b->setIcon(QPixmap(":/png/edit-delete.png"));
-       b->setToolTip(tr("Delete selected data array"));                h->addWidget(b);
-       connect(b, SIGNAL(clicked()), this, SLOT(delData()));
-       b = new QToolButton(this);      b->setIcon(QPixmap(preview_xpm));
-       b->setToolTip(tr("Properties of selected data array")); h->addWidget(b);
-       connect(b, SIGNAL(clicked()), this, SLOT(infoData()));
-       b = new QToolButton(this);      b->setIcon(QPixmap(":/png/view-refresh.png"));
-       b->setToolTip(tr("Update list of data arrays"));                h->addWidget(b);
-       connect(b, SIGNAL(clicked()), this, SLOT(refresh()));
-       h->addStretch(1);
-       b = new QToolButton(this);      b->setIcon(QPixmap(":/png/edit-clear.png"));
-       b->setToolTip(tr("Delete ALL data arrays"));    h->addWidget(b);
-       connect(b, SIGNAL(clicked()), this, SLOT(delAllData()));
+       QToolBar *t = new QToolBar(this);       t->setMovable(false);
+       QVBoxLayout *v = new QVBoxLayout(this); v->addWidget(t);
+       t->addAction(QPixmap(":/png/document-new.png"), tr("Create new data array"), this, SLOT(newTable()));
+       t->addAction(QPixmap(table_xpm), tr("Edit selected data array"), this, SLOT(editData()));
+       t->addAction(QPixmap(":/png/edit-delete.png"), tr("Delete selected data array"), this, SLOT(delData()));
+       t->addAction(QPixmap(preview_xpm), tr("Properties of selected data array"), this, SLOT(infoData()));
+       t->addAction(QPixmap(":/png/view-refresh.png"), tr("Update list of data arrays"), this, SLOT(refresh()));
+       t->addSeparator();
+       t->addAction(QPixmap(":/png/edit-clear.png"), tr("Delete ALL data arrays"), this, SLOT(delAllData()));
 
        colSort = 0;
        tab = new QTableWidget(this);   tab->setColumnCount(3); v->addWidget(tab);
@@ -98,7 +83,7 @@ void MemPanel::newTable()
        QString name = QInputDialog::getText(this, tr("UDAV - New variable"),
                                tr("Enter name for new variable"), QLineEdit::Normal, "", &ok);
        if(!ok || name.isEmpty())       return;
-       mglData *v = parser.AddVar(name.toStdString().c_str());
+       mglDataA *v = parser.AddVar(name.toStdString().c_str());
        QWidget *t;
        if(v->o)        t = (QWidget *)v->o;
        else            t = newDataWnd(infoDlg,wnd,v);
@@ -171,7 +156,26 @@ void MemPanel::refresh()
                it = new QTableWidgetItem(s);
                tab->setItem(m,1,it);   it->setFlags(flags);
                it->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
-               s.sprintf("%12ld", v->GetNN()*sizeof(mreal));
+               long sv = 0;
+               if(dynamic_cast<mglData*>(v))   sv = v->GetNN()*sizeof(mreal)+sizeof(mglData);
+               else if(dynamic_cast<mglDataC*>(v))     sv = v->GetNN()*sizeof(dual)+sizeof(mglDataC);
+               else if(dynamic_cast<mglDataV*>(v))     sv = sizeof(mglDataV);
+               else if(dynamic_cast<mglDataW*>(v))     sv = sizeof(mglDataW);
+               else if(dynamic_cast<mglDataF*>(v))     sv = sizeof(mglDataF);
+               else if(dynamic_cast<mglDataR*>(v))     sv = sizeof(mglDataR);
+               else if(dynamic_cast<mglDataT*>(v))     sv = sizeof(mglDataT);
+               if(sv==0)       s = tr("unknown");
+#if MGL_SIZEOF_LONG>4
+//             else if((sv>>80L)>0)    s.sprintf("%ld Yb",sv>>80L);
+//             else if((sv>>70L)>0)    s.sprintf("%ld Zb",sv>>70L);
+               else if((sv>>60L)>0)    s.sprintf("%ld Eb",sv>>60L);
+               else if((sv>>50L)>0)    s.sprintf("%ld Pb",sv>>50L);
+               else if((sv>>40L)>0)    s.sprintf("%ld Tb",sv>>40L);
+#endif
+               else if((sv>>30L)>0)    s.sprintf("%ld Gb",sv>>30L);
+               else if((sv>>20L)>0)    s.sprintf("%ld Mb",sv>>20L);
+               else if((sv>>10L)>0)    s.sprintf("%ld Kb",sv>>10L);
+               else    s.sprintf("%ld b",sv);
                it = new QTableWidgetItem(s);
                tab->setItem(m,2,it);   it->setFlags(flags);
                it->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter);
index 4500fad3b9c3b9078f12717b9664539dcf6a51e9..59ffe792b6f2a426d24c81d5c7364f06c5c00df6 100644 (file)
@@ -1,5 +1,3 @@
-#ifndef MEM_PNL_H
-#define MEM_PNL_H
 /***************************************************************************
  *   Copyright (C) 2008 by Alexey Balakin                                  *
  *   mathgl.abalakin@gmail.com                                             *
@@ -19,6 +17,8 @@
  *   Free Software Foundation, Inc.,                                       *
  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  ***************************************************************************/
+#ifndef MEM_PNL_H
+#define MEM_PNL_H
 #include <QWidget>
 class InfoDialog;
 class QTableWidget;
diff --git a/udav/mgl.xml b/udav/mgl.xml
deleted file mode 100644 (file)
index 8aaa20f..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<mime-type xmlns="http://www.freedesktop.org/standards/shared-mime-info" type="text/mgl">
-  <comment>MGL script</comment>
-  <icon name="/usr/local/share/pixmaps/udav.png"/>
-  <glob pattern="*.mgl"/>
-</mime-type>
diff --git a/udav/mgl.xml.in b/udav/mgl.xml.in
new file mode 100644 (file)
index 0000000..325aaac
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
+  <mime-type type="text/mgl">
+    <alias type="text/x.mgl"/>
+    <alias type="text/x-mgl"/>
+    <comment>MGL script</comment>
+    <icon name="${CMAKE_INSTALL_PREFIX}/share/pixmaps/udav.png"/>
+    <glob pattern="*.mgl"/>
+  </mime-type>
+</mime-info>
index eff4ffc4600756e390b1c92c49cfbd335503ac43..58ae5fd7ca9aa86e8e7a7de8eb354359b7cf008e 100644 (file)
@@ -116,7 +116,8 @@ void DataOpenDialog::prepareResult()
        // prepare unique value of name for next time
        char buf[32];   snprintf(buf,32,"mgl_%d",numDataOpened);
        buf[31]=0;      name->setText(buf);
-       mglData *v = parser.AddVar(data.toStdString().c_str());
+       mglData *v = dynamic_cast<mglData*>(parser.AddVar(data.toStdString().c_str()));
+       if(!v)  return;
        int dd=0;
        if(rA->isChecked())     //      auto sizes
        {
index ad6c9dd98624c15cb6bbe28f00cc72f582ef04da..3aa0eba48439723fe133cf86e065b23018236747 100644 (file)
@@ -71,11 +71,8 @@ PlotPanel::PlotPanel(QWidget *parent) : QWidget(parent)
        connect(mgl,SIGNAL(askStyle(int)),this,SLOT(setStyle(int)));
        connect(mgl,SIGNAL(objChanged(int)),this,SLOT(setCurPos(int)));
 
-       QBoxLayout *v,*h,*m;
-       v = new QVBoxLayout(this);
-       h = new QHBoxLayout();  v->addLayout(h);        toolTop(h);
-       h = new QHBoxLayout();  v->addLayout(h);
-       m = new QVBoxLayout();  h->addLayout(m);        toolLeft(m);
+       QBoxLayout *v = new QVBoxLayout(this);  toolTop(v);
+       QBoxLayout *h = new QHBoxLayout();      v->addLayout(h);        toolLeft(h);
        mgl->setPopup(popup);
 
        sv = new QScrollArea(this);     h->addWidget(sv);       sv->setWidget(mgl);
@@ -283,11 +280,11 @@ void PlotPanel::animParseText(const QString &txt)
 #include "xpm/polygon.xpm"
 #include "xpm/box.xpm"
 //-----------------------------------------------------------------------------
-void PlotPanel::toolTop(QBoxLayout *l)
+void PlotPanel::toolTop(QBoxLayout *v)
 {
        QAction *a, *aa;
        QMenu *o=menu, *oo;
-       QToolButton *bb;
+       QToolBar *t = new QToolBar(this);       v->addWidget(t);        t->setMovable(false);
 
        // graphics menu
        a = new QAction(QPixmap(":/png/alpha.png"), tr("Alpha"), this);
@@ -295,52 +292,47 @@ void PlotPanel::toolTop(QBoxLayout *l)
        connect(a, SIGNAL(toggled(bool)), mgl, SLOT(setAlpha(bool)));
        connect(mgl, SIGNAL(alphaChanged(bool)), a, SLOT(setChecked(bool)));
        a->setToolTip(tr("Switch on/off transparency for the graphics (Ctrl+T)."));
-       o->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       o->addAction(a);        t->addAction(a);
 
        a = new QAction(QPixmap(":/png/weather-clear.png"), tr("Light"), this);
        a->setShortcut(Qt::CTRL+Qt::Key_L);     a->setCheckable(true);
        connect(a, SIGNAL(toggled(bool)), mgl, SLOT(setLight(bool)));
        connect(mgl, SIGNAL(lightChanged(bool)), a, SLOT(setChecked(bool)));
        a->setToolTip(tr("Switch on/off lightning for the graphics (Ctrl+L)."));
-       o->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       o->addAction(a);        t->addAction(a);
 
        a = new QAction(QPixmap(":/png/view-grid.png"), tr("Grid"), this);
        a->setShortcut(Qt::CTRL+Qt::Key_G);     a->setCheckable(true);
        connect(a, SIGNAL(toggled(bool)), mgl, SLOT(setGrid(bool)));
        a->setToolTip(tr("Switch on/off grid of absolute coordinates (Ctrl+G)."));
-       o->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       o->addAction(a);        t->addAction(a);
 
        a = new QAction(QPixmap(":/png/transform-move.png"), tr("Rotate by mouse"), this);
        a->setCheckable(true);
        connect(a, SIGNAL(toggled(bool)), mgl, SLOT(setRotate(bool)));
        connect(mgl, SIGNAL(rotateChanged(bool)), a, SLOT(setChecked(bool)));
        a->setToolTip(tr("Switch on/off mouse handling of the graphics\n(rotation, shifting, zooming and perspective)."));
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       t->addAction(a);
 
 /*     a = new QAction(QPixmap(":/png/zoom-fit-best.png"), tr("Zoom by mouse"), this);
        a->setCheckable(true);
        connect(a, SIGNAL(toggled(bool)), mgl, SLOT(setZoom(bool)));
        connect(mgl, SIGNAL(zoomChanged(bool)), a, SLOT(setChecked(bool)));
        a->setToolTip(tr("Switch on/off mouse zoom of selected region."));
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);*/
+       t->addAction(a);*/
 
        o->addSeparator();
        a = new QAction(QPixmap(":/png/zoom-original.png"), tr("Restore"), this);
        connect(a, SIGNAL(triggered()), mgl, SLOT(restore()));
        a->setToolTip(tr("Restore default graphics rotation, zoom and perspective (Ctrl+Space)."));
        a->setShortcut(Qt::CTRL+Qt::Key_Space);
-       o->addAction(a);        popup->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       o->addAction(a);        popup->addAction(a);    t->addAction(a);
 
        a = new QAction(QPixmap(":/png/view-refresh.png"), tr("Redraw"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(execute()));
        a->setToolTip(tr("Execute script and redraw graphics (F5)."));
        a->setShortcut(Qt::Key_F5);
-       o->addAction(a);        popup->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       o->addAction(a);        popup->addAction(a);    t->addAction(a);
 
        a = new QAction(QPixmap(":/png/view-fullscreen.png"), tr("Adjust size"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(adjust()));
@@ -355,15 +347,13 @@ void PlotPanel::toolTop(QBoxLayout *l)
        a = new QAction(QPixmap(":/png/process-stop.png"), tr("Stop"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(stop()));
        a->setToolTip(tr("Stop script execution (F7)."));
-       a->setShortcut(Qt::Key_F7);     o->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       a->setShortcut(Qt::Key_F7);     o->addAction(a);        t->addAction(a);
 
        a = new QAction(QPixmap(":/png/edit-copy.png"), tr("Copy plot"), this);
        connect(a, SIGNAL(triggered()), mgl, SLOT(copy()));
        a->setToolTip(tr("Copy graphics to clipboard (Ctrl+Shift+G)."));
        a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_G);
-       o->addAction(a);        popup->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       o->addAction(a);        popup->addAction(a);    t->addAction(a);
 
        a = new QAction(QPixmap(":/png/edit-copy.png"), tr("Copy click coor."), this);
        connect(a, SIGNAL(triggered()), mgl, SLOT(copyClickCoor()));
@@ -427,61 +417,56 @@ void PlotPanel::toolTop(QBoxLayout *l)
                a->setToolTip(tr("Add text which properties can be changed later by mouse."));
                oo->addAction(a);
 
-               bb = new QToolButton(this);     l->addWidget(bb);
+               QToolButton *bb = new QToolButton(this);
                bb->setDefaultAction(aa);       bb->setMenu(oo);
                bb->setPopupMode(QToolButton::MenuButtonPopup);
+               t->addWidget(bb);
        }
 
        a = new QAction(QPixmap(":/png/edit-delete.png"), tr("Delete selected"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(deleteSelected()));
        a->setToolTip(tr("Delete selected plot."));
-       o->addAction(a);        popup->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       o->addAction(a);        popup->addAction(a);    t->addAction(a);
 
        a = new QAction(QPixmap(":/png/layer-visible-off.png"), tr("Hide selected"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(hideSelected()));
        a->setToolTip(tr("Hide selected plot."));
-       o->addAction(a);        popup->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       o->addAction(a);        popup->addAction(a);    t->addAction(a);
 
        const MainWindow *mw=findMain(this);
-       if(mw)  {       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(mw->ahide);        }
+       if(mw)  t->addAction(mw->ahide);
 
        a = new QAction(QPixmap(":/png/format-indent-more.png"), tr("New command"), this);
        connect(a, SIGNAL(triggered()), newCmdDlg, SLOT(show()));
        a->setToolTip(tr("Show dialog for new command and put it into the script."));
-       o->addAction(a);        popup->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       o->addAction(a);        popup->addAction(a);    t->addAction(a);
 
        a = new QAction(QPixmap(box_xpm), tr("New inplot"), this);
        connect(a, SIGNAL(triggered()), subplotDlg, SLOT(show()));
        a->setToolTip(tr("Show dialog for new inplot and put it into the script."));
-       o->addAction(a);        popup->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       o->addAction(a);        popup->addAction(a);    t->addAction(a);
 
        a = new QAction(QPixmap(":/png/object-order-lower.png"), tr("Move plot up"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(movePlotUp()));
        a->setToolTip(tr("Move selected plot up to previous subplot."));
-       o->addAction(a);        popup->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       o->addAction(a);        popup->addAction(a);    t->addAction(a);
 
        a = new QAction(QPixmap(":/png/object-order-raise.png"), tr("Move plot down"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(movePlotDown()));
        a->setToolTip(tr("Move selected plot down to next subplot."));
-       o->addAction(a);        popup->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       o->addAction(a);        popup->addAction(a);    t->addAction(a);
 
 
-       o->addMenu(oo); l->addStretch(1);
+       o->addMenu(oo); //t->addSeparator();
 
        tet = new QSpinBox(this);       tet->setWrapping(true);
-       l->addWidget(tet);      tet->setRange(-180, 180);       tet->setSingleStep(10);
+       t->addWidget(tet);      tet->setRange(-180, 180);       tet->setSingleStep(10);
        connect(tet, SIGNAL(valueChanged(int)), mgl, SLOT(setTet(int)));
        connect(mgl, SIGNAL(tetChanged(int)), tet, SLOT(setValue(int)));
        tet->setToolTip(tr("Set value of \\theta angle.\nYou can use keys (Shift+Meta+Up or Shift+Meta+Down)."));
 
        phi = new QSpinBox(this);       phi->setWrapping(true);
-       l->addWidget(phi);      phi->setRange(-180, 180);       phi->setSingleStep(10);
+       t->addWidget(phi);      phi->setRange(-180, 180);       phi->setSingleStep(10);
        connect(phi, SIGNAL(valueChanged(int)), mgl, SLOT(setPhi(int)));
        connect(mgl, SIGNAL(phiChanged(int)), phi, SLOT(setValue(int)));
        phi->setToolTip(tr("Set value of \\phi angle.\nYou can use keys (Shift+Meta+Left or Shift+Meta+Right)."));
@@ -506,11 +491,12 @@ void PlotPanel::toolTop(QBoxLayout *l)
        o->addMenu(oo);         popup->addMenu(oo);
 }
 //-----------------------------------------------------------------------------
-void PlotPanel::toolLeft(QBoxLayout *l)
+void PlotPanel::toolLeft(QBoxLayout *h)
 {
        QAction *a;
        QMenu *o=menu, *oo;
-       QToolButton *bb;
+       QToolBar *t = new QToolBar(this);       h->addWidget(t);        t->setMovable(false);
+       t->setAllowedAreas(Qt::LeftToolBarArea);        t->setOrientation(Qt::Vertical);
 
        // zooming menu
        oo = o->addMenu(tr("Zoom/move"));
@@ -518,43 +504,37 @@ void PlotPanel::toolLeft(QBoxLayout *l)
        connect(a, SIGNAL(triggered()), mgl, SLOT(shiftLeft()));
        a->setShortcut(Qt::ALT+Qt::Key_Left);
        a->setToolTip(tr("Move graphics left by 1/3 of its width."));
-       oo->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       oo->addAction(a);       t->addAction(a);
 
        a = new QAction(QPixmap(":/png/arrow-up.png"), tr("Move up"), this);
        connect(a, SIGNAL(triggered()), mgl, SLOT(shiftUp()));
        a->setShortcut(Qt::ALT+Qt::Key_Up);
        a->setToolTip(tr("Move graphics up by 1/3 of its height."));
-       oo->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       oo->addAction(a);       t->addAction(a);
 
        a = new QAction(QPixmap(":/png/zoom-in.png"), tr("Zoom in"), this);
        connect(a, SIGNAL(triggered()), mgl, SLOT(zoomIn()));
        a->setShortcut(Qt::ALT+Qt::Key_Equal);
        a->setToolTip(tr("Zoom in graphics."));
-       oo->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       oo->addAction(a);       t->addAction(a);
 
        a = new QAction(QPixmap(":/png/zoom-out.png"), tr("Zoom out"), this);
        connect(a, SIGNAL(triggered()), mgl, SLOT(zoomOut()));
        a->setShortcut(Qt::ALT+Qt::Key_Minus);
        a->setToolTip(tr("Zoom out graphics."));
-       oo->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       oo->addAction(a);       t->addAction(a);
 
        a = new QAction(QPixmap(":/png/arrow-down.png"), tr("Move down"), this);
        connect(a, SIGNAL(triggered()), mgl, SLOT(shiftDown()));
        a->setShortcut(Qt::ALT+Qt::Key_Down);
        a->setToolTip(tr("Move graphics up down 1/3 of its height."));
-       oo->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       oo->addAction(a);       t->addAction(a);
 
        a = new QAction(QPixmap(":/png/arrow-right.png"), tr("Move right"), this);
        connect(a, SIGNAL(triggered()), mgl, SLOT(shiftRight()));
        a->setShortcut(Qt::ALT+Qt::Key_Right);
        a->setToolTip(tr("Move graphics right by 1/3 of its width."));
-       oo->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       oo->addAction(a);       t->addAction(a);
 
        // rotate menu
        oo = o->addMenu(tr("Rotate"));
@@ -580,25 +560,23 @@ void PlotPanel::toolLeft(QBoxLayout *l)
        a = new QAction(QPixmap(":/png/media-seek-forward.png"), tr("Next slide"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(nextSlide()));
        a->setShortcut(Qt::CTRL+Qt::Key_Period);
-       a->setToolTip(tr("Show next slide (Ctrl+.).")); oo->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       a->setToolTip(tr("Show next slide (Ctrl+.)."));
+       oo->addAction(a);       t->addAction(a);
 
        a = new QAction(QPixmap(":/png/media-playback-start.png"), tr("Slideshow"), this);
        a->setCheckable(true);
        connect(a, SIGNAL(toggled(bool)), this, SLOT(animStart(bool)));
        connect(this, SIGNAL(animSwitch(bool)),a,SLOT(setChecked(bool)));
        a->setToolTip(tr("Run slideshow (Ctrl+F5). If no parameter specified\nthen the dialog with slideshow options will appear."));
-       a->setShortcut(Qt::CTRL+Qt::Key_F5);    oo->addAction(a);
+       a->setShortcut(Qt::CTRL+Qt::Key_F5);    oo->addAction(a);       t->addAction(a);
+
        oo->addAction(tr("Setup show"), this, SLOT(animSetup()), Qt::CTRL+Qt::Key_W);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
 
        a = new QAction(QPixmap(":/png/media-seek-backward.png"), tr("Prev slide"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(prevSlide()));
        a->setShortcut(Qt::CTRL+Qt::Key_Comma);
-       a->setToolTip(tr("Show previous slide (Ctrl+,)."));     oo->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
-
-       l->addStretch(1);
+       a->setToolTip(tr("Show previous slide (Ctrl+,)."));
+       oo->addAction(a);       t->addAction(a);
 }
 //-----------------------------------------------------------------------------
 QString PlotPanel::getFit()    {       return QString(mgl_get_fit(mgl->getGraph()));   }
index 2150ab9fecc88cfb79aa76ba3fd8f5d165d4d692..f9e0c296acd5ad38b433b74100727d1330d2d196 100644 (file)
@@ -131,9 +131,9 @@ StyleDialog::StyleDialog(QWidget *parent) : QDialog(parent)
        mask = new QComboBox(p);        g->addWidget(mask, 2, 1);       fillMasks(mask);\r
        angle = new QComboBox(p);       g->addWidget(angle, 3, 1);\r
        angle->addItem(tr("none"));     \r
-       angle->addItem(QString::fromWCharArray(L"+45°"));\r
-       angle->addItem(QString::fromWCharArray(L"-45°"));      \r
-       angle->addItem(QString::fromWCharArray(L"90°"));\r
+       angle->addItem(QString::fromWCharArray(L"+45\xb0"));\r
+       angle->addItem(QString::fromWCharArray(L"-45\xb0"));    \r
+       angle->addItem(QString::fromWCharArray(L"90\xb0"));     // \xb0 <-> °\r
        msize = new QSlider(p);         g->addWidget(msize, 4, 1);\r
        msize->setRange(1, 9);          msize->setValue(1);\r
        msize->setTickPosition(QSlider::TicksBothSides);\r
index 9d80c686f86144752c690af4b6710d39857ae2d7..80b1c64d963f98cc796a4ac781326de1a25d0c30 100644 (file)
@@ -161,11 +161,11 @@ SubplotDialog::SubplotDialog(QWidget *parent) : QDialog(parent)
 
        H = new QHBoxLayout;    u->addLayout(H);
        l = new QLabel(tr("Rotate on"),this);   H->addWidget(l);
-       l = new QLabel(QString::fromWCharArray(L"θ"),this);    H->addWidget(l);
+       l = new QLabel(QString::fromWCharArray(L"\u03b8"),this);        H->addWidget(l);
        tet = new QSpinBox(this);       H->addWidget(tet,1);    tet->setValue(0);       tet->setSingleStep(5);
        tet->setToolTip(tr("Angle around x axis (in degrees)"));
        connect(tet,SIGNAL(valueChanged(QString)),this,SLOT(updatePic()));
-       l = new QLabel(QString::fromWCharArray(L"φ"),this);    H->addWidget(l);
+       l = new QLabel(QString::fromWCharArray(L"\u03c6"),this);        H->addWidget(l);
        phi = new QSpinBox(this);       H->addWidget(phi,1);    phi->setValue(0);       phi->setSingleStep(5);
        phi->setToolTip(tr("Angle around z axis (in degrees)"));
        connect(phi,SIGNAL(valueChanged(QString)),this,SLOT(updatePic()));
index c25662bbb7ae11da4b0f8d403232e28ac44aa24f..3ff5462f485b56ae58fda2db6d98fdc06984c2a6 100644 (file)
@@ -22,6 +22,7 @@
 #include <QTextStream>
 #include <QFileDialog>
 #include <QToolButton>
+#include <QToolBar>
 #include <QCompleter>
 #include <QBoxLayout>
 #include <QPrinter>
@@ -78,12 +79,9 @@ TextPanel::TextPanel(QWidget *parent) : QWidget(parent)
        edit->setLineWrapMode(QTextEdit::NoWrap);
        setCompleter(mglCompleter);
 
-       QBoxLayout *v,*h;
        menu = new QMenu(tr("Edit"),this);
-       v = new QVBoxLayout(this);
-       h = new QHBoxLayout();  v->addLayout(h);
-       toolTop(h);
-       v->addWidget(edit);
+       QBoxLayout *v = new QVBoxLayout(this);
+       toolTop(v);     v->addWidget(edit);
 }
 //-----------------------------------------------------------------------------
 TextPanel::~TextPanel()        {       delete printer; }
@@ -323,7 +321,7 @@ void TextPanel::loadHDF5(const QString &fileName)
                else if(H5Tget_class(ht)==H5T_FLOAT || H5Tget_class(ht)==H5T_INTEGER)
                {
                        for(int j=0;name[j];j++)        if(!isalnum(name[j]))   name[j]='_';
-                       mglData *v = parser.AddVar(name);
+                       mglData *v = (mglData*) parser.AddVar(name);
                        nx = ny = nz = 1;
                        if(rank>0 && rank<=3)
                        {
@@ -493,52 +491,49 @@ void TextPanel::addSetup()        {       setupDlg->exec();       }
 #include "xpm/curve.xpm"
 #include "xpm/box.xpm"
 //-----------------------------------------------------------------------------
-void TextPanel::toolTop(QBoxLayout *l)
+void TextPanel::toolTop(QBoxLayout *v)
 {
+       QToolBar *t = new QToolBar(this);       v->addWidget(t);        t->setMovable(false);
        QAction *a, *aa;
        QMenu *o=menu, *oo;
-       QToolButton *bb;
        const MainWindow *mw=findMain(this);
-//     l->setSpacing(3);
 
        // general buttons
        if(mw)
        {
-               bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(mw->aload);
-               bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(mw->asave);
+               t->addAction(mw->aload);        t->addAction(mw->asave);        t->addAction(mw->acalc);
        }
+       QToolButton *bb = new QToolButton(this);
+       bb->setPopupMode(QToolButton::MenuButtonPopup);
+       t->addWidget(bb);
+
        // edit menu
        a = new QAction(QPixmap(":/png/edit-undo.png"), tr("Undo"), this);
        connect(a, SIGNAL(triggered()), edit, SLOT(undo()));
        a->setToolTip(tr("Undo editor change (Ctrl+Z)."));
-       a->setShortcut(Qt::CTRL+Qt::Key_Z);     o->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       a->setShortcut(Qt::CTRL+Qt::Key_Z);     o->addAction(a);        t->addAction(a);
 
        a = new QAction(QPixmap(":/png/edit-redo.png"), tr("Redo"), this);
        connect(a, SIGNAL(triggered()), edit, SLOT(redo()));
        a->setToolTip(tr("Redo editor change (Ctrl+Shift+Z)."));
-       a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_Z);   o->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_Z);   o->addAction(a);        t->addAction(a);
 
        o->addSeparator();
        o->addAction(tr("Clear all"), edit, SLOT(clear()));
        a = new QAction(QPixmap(":/png/edit-cut.png"), tr("Cut text"), this);
        connect(a, SIGNAL(triggered()), edit, SLOT(cut()));
        a->setToolTip(tr("Cut selected text to clipboard (Ctrl+X)."));
-       a->setShortcut(Qt::CTRL+Qt::Key_X);     o->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       a->setShortcut(Qt::CTRL+Qt::Key_X);     o->addAction(a);        t->addAction(a);
 
        a = new QAction(QPixmap(":/png/edit-copy.png"), tr("Copy text"), this);
        connect(a, SIGNAL(triggered()), edit, SLOT(copy()));
        a->setToolTip(tr("Copy selected text or data to clipboard (Ctrl+C)."));
-       a->setShortcut(Qt::CTRL+Qt::Key_C);     o->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       a->setShortcut(Qt::CTRL+Qt::Key_C);     o->addAction(a);        t->addAction(a);
 
        a = new QAction(QPixmap(":/png/edit-paste.png"), tr("Paste text"), this);
        connect(a, SIGNAL(triggered()), edit, SLOT(paste()));
        a->setToolTip(tr("Paste text or data from clipboard (Ctrl+V)."));
-       a->setShortcut(Qt::CTRL+Qt::Key_V);     o->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       a->setShortcut(Qt::CTRL+Qt::Key_V);     o->addAction(a);        t->addAction(a);
 
        o->addAction(QPixmap(":/png/edit-select-all.png"), tr("Select all"), edit, SLOT(selectAll()), Qt::CTRL+Qt::Key_A);
        o->addSeparator();
@@ -546,8 +541,7 @@ void TextPanel::toolTop(QBoxLayout *l)
        a = new QAction(QPixmap(":/png/edit-find.png"), tr("Find/Replace"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(find()));
        a->setToolTip(tr("Show dialog for text finding (Ctrl+F)."));
-       a->setShortcut(Qt::CTRL+Qt::Key_F);     o->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
+       a->setShortcut(Qt::CTRL+Qt::Key_F);     o->addAction(a);        t->addAction(a);
 
        a = new QAction(tr("Find next"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(findText()));
@@ -592,19 +586,11 @@ void TextPanel::toolTop(QBoxLayout *l)
        a = new QAction(QPixmap(curve_xpm), tr("Manual primitives"), this);
        a->setShortcut(Qt::META+Qt::Key_P);     connect(a, SIGNAL(triggered()), this, SLOT(insPrim()));
        a->setToolTip(tr("Move mouse-handled primitives to script."));
-       oo->addAction(a);
-
-       bb = new QToolButton(this);     l->addWidget(bb);
-       bb->setDefaultAction(aa);       bb->setMenu(oo);
-       bb->setPopupMode(QToolButton::MenuButtonPopup);
+       oo->addAction(a);       bb->setMenu(oo);        bb->setDefaultAction(aa);
 
        a = new QAction(QPixmap(":/png/document-properties.png"), tr("Graphics setup"), this);
        a->setShortcut(Qt::META+Qt::Key_G);     connect(a, SIGNAL(triggered()), this, SLOT(addSetup()));
        a->setToolTip(tr("Show dialog for plot setup and put code into the script.\nThis dialog setup axis, labels, lighting and other general things."));
-       o->addAction(a);
-       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
-
-       l->addStretch(1);
-       if(mw)  {       bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(mw->acalc);        }
+       o->addAction(a);        t->addAction(a);
 }
 //-----------------------------------------------------------------------------
index 3f457702b0828d6c18af95fedd549e49ea7af7fd..85b9c12ca794a33e28dc928f2c1879741a37d924 100644 (file)
@@ -46,7 +46,8 @@ class QCompleter;
 class Numb;
 //-----------------------------------------------------------------------------
 class TextEdit : public QTextEdit
-{      Q_OBJECT
+{
+       Q_OBJECT
 public:
        TextEdit(QWidget *parent = 0);
        void setCompleter(QCompleter *c);
index 3cfa9ec949891930ab67b83b5196417eaec9cd2d..66087cdc3db8601e14c5809a3ec6a50b057aa918 100644 (file)
 #include <QMimeData>
 #include <QUrl>
 //-----------------------------------------------------------------------------
-#if !defined(WIN32) && !defined(__APPLE__)
-#include <X11/Xlib.h>
-#endif
-//-----------------------------------------------------------------------------
 #include <mgl2/qmathgl.h>
 #include "udav_wnd.h"
 #include "text_pnl.h"
@@ -95,12 +91,7 @@ void mgl_ask_qt(const wchar_t *quest, wchar_t *res);
 int main(int argc, char **argv)
 {
        mgl_suppress_warn(true);
-//     QCoreApplication::setAttribute(Qt::AA_X11InitThreads);
-#if !defined(WIN32) && !defined(__APPLE__)
-       // try to fix possible multi-threading errors
-       // must be placed before ANY window creation
-       XInitThreads();
-#endif
+       QCoreApplication::setAttribute(Qt::AA_X11InitThreads);
 #ifdef WIN32
        char buf[512];  getcwd(buf,500);        strcat(buf,"\\plugins\\");
        QCoreApplication::addLibraryPath(buf);
@@ -725,7 +716,7 @@ void MainWindow::updateHidden()
        do {
                i++;
                if(tc.block().text().startsWith("#h "))
-                       hidden->append("Line "+QString::number(i)+QString::fromWCharArray(L"  ")+tc.block().text().mid(3)+"\n");
+                       hidden->append("Line "+QString::number(i)+QString::fromWCharArray(L" \u2192 ")+tc.block().text().mid(3)+"\n");
        } while(tc.movePosition(QTextCursor::NextBlock));
        tc.setPosition(pos);
 }
index a5eeb9c95a5b7a2cecb47e06c5226d1413c1e974..b6e5beacf0b87f37f7e31d62e9b2be001d1e9d75 100644 (file)
@@ -1,6 +1,9 @@
 
 add_executable(make_pas make_pas.cpp)
 
+add_executable(make_bin make_bin.cpp)
+target_link_libraries(make_bin mgl)
+
 add_executable(mglconv mglconv.cpp)
 target_link_libraries(mglconv mgl)
 install(
diff --git a/utils/make_bin.cpp b/utils/make_bin.cpp
new file mode 100644 (file)
index 0000000..ac9a44c
--- /dev/null
@@ -0,0 +1,53 @@
+/***************************************************************************
+ * make_bin.cpp is part of Math Graphic Library
+ * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+#include <unistd.h>
+#include "mgl2/font.h"
+//-----------------------------------------------------------------------------
+int main(int argc, char *argv[])
+{
+       mglFont fnt;
+       std::string path, base, fname;
+       char ch;
+
+       while(1)
+       {
+               ch = getopt(argc, argv, "p:o:h");
+               if(ch=='p')     path = optarg;
+               else if(ch=='o')        fname = optarg;
+               else if(ch=='h' || (ch==-1 && optind>=argc))
+               {
+                       printf("make_bin convert mgl font to binary file.\nCurrent version is 2.%g\n",MGL_VER2);
+                       printf("Usage:\tmake_bin [parameter(s)] base\n");
+                       printf(
+                               "\t-p path      set specific path for base font files\n"
+                               "\t-o fname     set output filename (use ${base}.vfmb by default)\n"
+                               "\t-h           print this message\n" );
+                       ch = 'h';       break;
+               }
+               else if(ch==-1 && optind<argc)  {       base = argv[optind];    break;  }
+       }
+       if(ch=='h')     return 0;
+       if(fname.empty())       fname = base + ".vfmb";
+       fnt.Load(base.c_str(),path.c_str());
+       size_t size = fnt.SaveBin(fname.c_str());
+       printf("Output size of %s should be %zu\n", fname.c_str(), size);
+       return 0;
+}
+//-----------------------------------------------------------------------------
index a2dd53b66057175f193001b69da4ba76863a529a..fd38efdf5553fbd27f9187d2a23e552f6bd732ec 100644 (file)
@@ -285,6 +285,7 @@ const char *parse_name(char *name, bool &needOverload)
                if (            processArgument(ptr, arg[j], "HMGL ", "%s: HMGL;")
                                ||  processArgument(ptr, arg[j], "HCDT ",  "const %s: HMDT;")
                                ||      processArgument(ptr, arg[j], "HMDT ",  "%s: HMDT;")
+                               ||      processArgument(ptr, arg[j], "mglDataA *",  "%s: HMDT;")
                                ||      processArgument(ptr, arg[j], "HADT ",  "%s: HADT;")
                                ||      processArgument(ptr, arg[j], "HAEX ",  "%s: HAEX;")
                                ||      processArgument(ptr, arg[j], "HMPR ",  "%s: HMPR;")
@@ -294,9 +295,11 @@ const char *parse_name(char *name, bool &needOverload)
                                ||      processArgument(ptr, arg[j], "mreal *",  "%s: Pmreal;")
                                ||      processArgument(ptr, arg[j], "double *",  "%s: Pdouble;")
                                ||      processArgument(ptr, arg[j], "char *",  "%s: PChar;")
+                               ||      processArgument(ptr, arg[j], "unsigned char *",  "%s: PByte;")
                                ||      processArgument(ptr, arg[j], "int *", "%s: Pint;")
                                ||      processArgument(ptr, arg[j], "long *",  "%s: Pint;")
                                ||      processArgument(ptr, arg[j], "const char *",  "const %s: PChar;")
+                               ||      processArgument(ptr, arg[j], "const unsigned char *",  "const %s: PByte;")
                                ||      processArgument(ptr, arg[j], "const wchar_t *",  "const %s: PWideChar;")
                                ||      processArgument(ptr, arg[j], "char ",  "%s: char;")
                                ||      processArgument(ptr, arg[j], "long ",  "%s: integer;")
index 5e293fdb7d691bd27bea0559de38977cbd390ecf..c5477221dcff4fd054476a404e7116d7e04b2437 100644 (file)
@@ -35,7 +35,7 @@ int main(int argc, char *argv[])
 \r
        while(1)\r
        {\r
-               ch = getopt(argc, argv, "1:2:3:4:5:6:7:8:9:hno:L:C:A:s:");\r
+               ch = getopt(argc, argv, "1:2:3:4:5:6:7:8:9:hno:L:C:A:s:S:q:");\r
                if(ch>='1' && ch<='9')  p.AddParam(ch-'0', optarg);\r
                else if(ch=='s')\r
                {\r
@@ -44,12 +44,14 @@ int main(int argc, char *argv[])
                        if(fp)\r
                        {\r
                                wchar_t ch;\r
-                               while((ch=fgetwc(fp))!=WEOF)    str.push_back(ch);\r
+                               while(!feof(fp) && size_t(ch=fgetwc(fp))!=WEOF) str.push_back(ch);\r
                                fclose(fp);     str += L"\n";\r
                        }\r
                }\r
                else if(ch=='n')        none = true;\r
                else if(ch=='L')        setlocale(LC_CTYPE, optarg);\r
+               else if(ch=='S')        mgl_set_size_scl(atof(optarg));\r
+               else if(ch=='q')        gr.SetQuality(atoi(optarg));\r
                else if(ch=='A')\r
                {\r
                        std::wstring str;\r
@@ -78,6 +80,8 @@ int main(int argc, char *argv[])
                                "\t-9 str       set str as argument $9 for script\n"\r
                                "\t-L loc       set locale to loc\n"\r
                                "\t-s opt       set MGL script for setting up the plot\n"\r
+                               "\t-S val       set scaling factor for images\n"\r
+                               "\t-q val       set quality for output (val=0...9)\n"\r
                                "\t-o name      set output file name\n"\r
                                "\t-n           no manual output (script should save results by itself)\n"\r
                                "\t-A val       add animation value val\n"\r
@@ -101,8 +105,7 @@ int main(int argc, char *argv[])
        FILE *fp = *iname?fopen(iname,"r"):stdin;\r
        if(!fp) {       printf("No file for MGL script\n");     return 0;       }\r
        wchar_t cw;\r
-       while((cw=fgetwc(fp))!=WEOF)    str.push_back(cw);\r
-//     while(!feof(fp))        str.push_back(fgetwc(fp));\r
+       while(!feof(fp) && size_t(cw=fgetwc(fp))!=WEOF) str.push_back(cw);\r
        if(*iname)      fclose(fp);\r
 \r
        unsigned long n;\r
@@ -141,7 +144,7 @@ int main(int argc, char *argv[])
        else\r
        {\r
                p.Execute(&gr,str.c_str());\r
-               printf("%s\n",gr.Message());\r
+               if(gr.Message()[0])     printf("%s\n",gr.Message());\r
                if(!none)       gr.WriteFrame(oname);\r
        }\r
        if(!mglGlobalMess.empty())      printf("%s",mglGlobalMess.c_str());\r
index f08530b3de9e1134c4f0412f7d5874f9f9881243..8264492f0305f1fbc054b912f7d50a1294b35753 100644 (file)
@@ -52,7 +52,7 @@ int main(int argc, char **argv)
                        if(fp)
                        {
                                wchar_t ch;
-                               while((ch=fgetwc(fp))!=WEOF)    opt.push_back(ch);
+                               while(!feof(fp) && size_t(ch=fgetwc(fp))!=WEOF) opt.push_back(ch);
                                fclose(fp);
                        }
                }
@@ -85,7 +85,7 @@ int main(int argc, char **argv)
                if(fp)
                {
                        wchar_t ch;
-                       while((ch=fgetwc(fp))!=WEOF)    str.push_back(ch);
+                       while(!feof(fp) && size_t(ch=fgetwc(fp))!=WEOF) str.push_back(ch);
                        fclose(fp);
                }
                else    {       printf("No file for MGL script\n");     return 0;       }
index f6a18ae3f37f9adfe4659af8d9bb9e14b68f10df..3e725b9bb4f05a74c6ebc58652552b50f63fc1a2 100644 (file)
@@ -155,6 +155,7 @@ void Fl_MathGL::draw()
 //-----------------------------------------------------------------------------
 void Fl_MathGL::update()
 {
+       Fl::lock();
        if(draw_func || draw_cl)
        {
                mgl_reset_frames(gr);
@@ -175,7 +176,8 @@ void Fl_MathGL::update()
        }
        if(mgl_get_width(gr)!=w() || mgl_get_height(gr)!=h())
                size(mgl_get_width(gr), mgl_get_height(gr));
-       gr->AskStop(false);     redraw();       Fl::flush();
+       gr->AskStop(false);     redraw();
+       Fl::flush();    Fl::unlock();
 }
 //-----------------------------------------------------------------------------
 void Fl_MathGL::resize(int xx, int yy, int ww, int hh)
@@ -338,11 +340,11 @@ void MGL_NO_EXPORT mgl_grid_cb(Fl_Widget*, void* v)
 //-------------------------------------------------------------------------
 void MGL_NO_EXPORT mgl_alpha_cb(Fl_Widget*, void* v)
 {      if(v)   ((Fl_MGLView*)v)->toggle_alpha();       }
-void mglCanvasFL::ToggleAlpha()        {       Fl::lock();     mgl->toggle_alpha();    Fl::unlock();   }
+void mglCanvasFL::ToggleAlpha()        {       mgl->toggle_alpha();    }
 //-----------------------------------------------------------------------------
 void MGL_NO_EXPORT mgl_light_cb(Fl_Widget*, void* v)
 {      if(v)   ((Fl_MGLView*)v)->toggle_light();       }
-void mglCanvasFL::ToggleLight()        {       Fl::lock();     mgl->toggle_light();    Fl::unlock();   }
+void mglCanvasFL::ToggleLight()        {       mgl->toggle_light();    }
 //-----------------------------------------------------------------------------
 void MGL_NO_EXPORT mgl_norm_cb(Fl_Widget*, void* v)
 {
@@ -352,21 +354,21 @@ void MGL_NO_EXPORT mgl_norm_cb(Fl_Widget*, void* v)
        e->FMGL->set_zoom(0,0,1,1);
        e->update();
 }
-void mglCanvasFL::ToggleNo()   {       Fl::lock();     mgl_norm_cb(0,mgl);     Fl::unlock();   }
+void mglCanvasFL::ToggleNo()   {       mgl_norm_cb(0,mgl);     }
 //-----------------------------------------------------------------------------
 void MGL_NO_EXPORT mgl_zoom_cb(Fl_Widget*, void* v)
 {
        Fl_MGLView *e = (Fl_MGLView*)v; if(!e)  return;
        e->setoff_rotate();     e->toggle_zoom();
 }
-void mglCanvasFL::ToggleZoom() {       Fl::lock();     mgl_zoom_cb(0,mgl);     Fl::unlock();   }
+void mglCanvasFL::ToggleZoom() {       mgl_zoom_cb(0,mgl);     }
 //-----------------------------------------------------------------------------
 void MGL_NO_EXPORT mgl_rotate_cb(Fl_Widget*, void* v)
 {
        Fl_MGLView *e = (Fl_MGLView*)v; if(!e)  return;
        e->setoff_zoom();       e->toggle_rotate();
 }
-void mglCanvasFL::ToggleRotate()       {       Fl::lock();     mgl_rotate_cb(0,mgl);   Fl::unlock();   }
+void mglCanvasFL::ToggleRotate()       {       mgl_rotate_cb(0,mgl);   }
 //-----------------------------------------------------------------------------
 void Fl_MGLView::update()
 {
@@ -376,7 +378,7 @@ void Fl_MGLView::update()
 }
 void MGL_NO_EXPORT mgl_draw_cb(Fl_Widget*, void* v)
 {      if(v)   ((Fl_MGLView*)v)->update();     }
-void mglCanvasFL::Update()             {       Fl::lock();     mgl->update();  Fl::unlock();   }
+void mglCanvasFL::Update()             {       mgl->update();  }
 //-----------------------------------------------------------------------------
 void MGL_NO_EXPORT mgl_export_png_cb(Fl_Widget*, void* v)
 {
@@ -513,7 +515,7 @@ void MGL_NO_EXPORT mgl_so_cb(Fl_Widget*, void* v)
 //-----------------------------------------------------------------------------
 void MGL_NO_EXPORT mgl_adjust_cb(Fl_Widget*, void*v)
 {      Fl_MGLView *e = (Fl_MGLView*)v; if(e)   e->adjust();    }
-void mglCanvasFL::Adjust()     {       Fl::lock();     mgl_adjust_cb(0,mgl);   Fl::unlock();   }
+void mglCanvasFL::Adjust()     {       mgl_adjust_cb(0,mgl);   }
 //-----------------------------------------------------------------------------
 void MGL_NO_EXPORT mgl_oncemore_cb(Fl_Widget*, void*v)
 {      Fl_MGLView *e = (Fl_MGLView*)v; if(e && e->reload)      e->reload(e->par);      }
@@ -541,7 +543,7 @@ void MGL_NO_EXPORT mgl_sshow_cb(Fl_Widget *, void *v)
        e->toggle_sshow();
        if(e->is_sshow())       Fl::add_timeout(e->delay(e->par), mgl_time_cb, v);
 }
-void mglCanvasFL::Animation()  {       Fl::lock();     mgl_sshow_cb(0,mgl);    Fl::unlock();   }
+void mglCanvasFL::Animation()  {       mgl_sshow_cb(0,mgl);    }
 void MGL_LOCAL_CONST mgl_no_cb(Fl_Widget *, void *)    {}
 //-----------------------------------------------------------------------------
 void MGL_NO_EXPORT mgl_stop_cb(Fl_Widget*, void* v)
@@ -690,7 +692,9 @@ void MGL_EXPORT mgl_makemenu_fltk(Fl_Menu_ *m, Fl_MGLView *w)
 //-----------------------------------------------------------------------------
 void mglCanvasFL::Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p), const char *title, void *par, void (*reload)(void *p), bool maximize)
 {
-       Fl::lock();
+       static bool first=true;
+       if(first)       {       Fl::lock();     first=false;    }
+
        SetDrawFunc(draw, par, reload);
        if(Wnd) {       Wnd->label(title);      Wnd->show();    return; }
 
@@ -707,7 +711,7 @@ void mglCanvasFL::Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p
        mgl->FMGL->set_draw(draw, par);
 
        Wnd->end();
-       Wnd->resizable(mgl);    //w->graph);
+       Wnd->resizable(mgl);
 
        if(maximize)
        {
@@ -719,7 +723,8 @@ void mglCanvasFL::Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p
 
        static char ctmp[1];    ctmp[0]=0;
        static char *tmp[1];    tmp[0]=ctmp;
-       Wnd->show(argv ? argc:0, argv ? argv:tmp);}
+       Wnd->show(argv ? argc:0, argv ? argv:tmp);
+}
 //-----------------------------------------------------------------------------
 HMGL MGL_EXPORT mgl_create_graph_fltk(int (*draw)(HMGL gr, void *p), const char *title, void *par, void (*load)(void *p))
 {
index 8633e959389f8491f26e8244015edc30588fae24..99651d68ad0ad5f5052cb65572b2b9c41a67b33f 100644 (file)
@@ -48,7 +48,6 @@ friend void _mgl_timer(int);
 public:\r
        mglCanvasGLUT();\r
        virtual ~mglCanvasGLUT();\r
-       // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ��������� ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
        /// Create a window for plotting. Now implemeted only for GLUT.\r
        void Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p),\r
                                                const char *title,void *par=NULL,\r
index c2e2f92bdbce84f7ecace7e92e73a5e4bf0ff249..ad6bb1be0d6b13a7960e9890eea06b43f34e4439 100644 (file)
@@ -44,9 +44,6 @@
 #include "mgl2/qt.h"
 //-----------------------------------------------------------------------------
 #define MGL_MAX_LINES  (INT_MAX-1000)
-#if !defined(WIN32) && !defined(__APPLE__)
-#include <X11/Xlib.h>
-#endif
 //-----------------------------------------------------------------------------
 /// Base class for windows containing MathGL graphics
 class mglCanvasQT : public mglCanvasWnd
@@ -58,7 +55,7 @@ using mglCanvasWnd::Window;
        QMainWindow *Wnd;       ///< Pointer to window
 
        mglCanvasQT();
-    virtual ~mglCanvasQT() {   if(Wnd) delete Wnd;     }
+    virtual ~mglCanvasQT();
 
        /// Create a window for plotting. Now implemeted only for GLUT.
        void Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p),const char *title,
@@ -133,6 +130,7 @@ QMathGL::QMathGL(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f)
        enableWheel = enableMouse = true;
        connect(timer, SIGNAL(timeout()), this, SLOT(nextSlide()));
        connect(timerRefr, SIGNAL(timeout()), this, SLOT(refreshHQ()));
+       sclS = 0.25;    sclZ = 0.5;
 
 /*     thread = new QThread();
        task = new mglTask();   task->moveToThread(thread);
@@ -259,31 +257,35 @@ void QMathGL::setCustZoom(bool z) {       custZoom = z;   }
 //-----------------------------------------------------------------------------
 void QMathGL::setCustDraw(bool z)      {       custDraw = z;   }
 //-----------------------------------------------------------------------------
+void QMathGL::setZoomScl(double s)     {       if(s>0) sclZ = s;       }
+//-----------------------------------------------------------------------------
+void QMathGL::setShiftScl(double s)    {       if(s)   sclS = s;       }
+//-----------------------------------------------------------------------------
 void QMathGL::shiftDown()
-{      mreal d=(y2-y1)/4;      y1+=d;  y2+=d;  refresh();      }
+{      mreal d=(y2-y1)*sclS;   y1+=d;  y2+=d;  refresh();      }
 //-----------------------------------------------------------------------------
 void QMathGL::shiftUp()
-{      mreal d=(y2-y1)/4;      y1-=d;  y2-=d;  refresh();      }
+{      mreal d=(y2-y1)*sclS;   y1-=d;  y2-=d;  refresh();      }
 //-----------------------------------------------------------------------------
 void QMathGL::shiftRight()
-{      mreal d=(x2-x1)/4;      x1-=d;  x2-=d;  refresh();      }
+{      mreal d=(x2-x1)*sclS;   x1-=d;  x2-=d;  refresh();      }
 //-----------------------------------------------------------------------------
 void QMathGL::shiftLeft()
-{      mreal d=(x2-x1)/4;      x1+=d;  x2+=d;  refresh();      }
+{      mreal d=(x2-x1)*sclS;   x1+=d;  x2+=d;  refresh();      }
 //-----------------------------------------------------------------------------
 void QMathGL::zoomIn()
 {
        mreal d,c;
-       d = (y2-y1)/4;  c = (y2+y1)/2;  y1 = c-d;       y2 = c+d;
-       d = (x2-x1)/4;  c = (x2+x1)/2;  x1 = c-d;       x2 = c+d;
+       d = (y2-y1)*sclZ/2;     c = (y2+y1)/2;  y1 = c-d;       y2 = c+d;
+       d = (x2-x1)*sclZ/2;     c = (x2+x1)/2;  x1 = c-d;       x2 = c+d;
        refresh();
 }
 //-----------------------------------------------------------------------------
 void QMathGL::zoomOut()
 {
        mreal d,c;
-       d = (y2-y1);    c = (y2+y1)/2;  y1 = c-d;       y2 = c+d;
-       d = (x2-x1);    c = (x2+x1)/2;  x1 = c-d;       x2 = c+d;
+       d = (y2-y1)/sclZ/2;     c = (y2+y1)/2;  y1 = c-d;       y2 = c+d;
+       d = (x2-x1)/sclZ/2;     c = (x2+x1)/2;  x1 = c-d;       x2 = c+d;
        refresh();
 }
 //-----------------------------------------------------------------------------
@@ -652,9 +654,9 @@ void QMathGL::wheelEvent(QWheelEvent *ev)
 void QMathGL::imgSize(int w, int h)
 {      if(w>0 && h>0)  {       mgl_set_size(gr,w,h);   update();       }       }
 //-----------------------------------------------------------------------------
-QString setExtension(QString &fname, const char *ext)
+QString setExtension(const QString &fname, const char *ext)
 {
-       QString oname;
+       QString oname=fname;
        if(fname.right(4)!="."+QString(ext))    oname = fname+"."+QString(ext);
        return oname;
 }
@@ -930,7 +932,7 @@ void QMathGL::prevSlide()
 //-----------------------------------------------------------------------------
 void QMathGL::animation(bool st)
 {
-       if(st)  timer->stop();
+       if(!st) timer->stop();
        else    timer->start(int(mgl_wnd_get_delay(gr)*1000));
 }
 //-----------------------------------------------------------------------------
@@ -985,6 +987,8 @@ void QMathGL::addText(QString txt)
 //-----------------------------------------------------------------------------
 mglCanvasQT::mglCanvasQT() : mglCanvasWnd()
 {      Wnd = 0;        }
+mglCanvasQT::~mglCanvasQT()
+{      if(Wnd) delete Wnd;     }
 //-----------------------------------------------------------------------------
 void mglCanvasQT::GotoFrame(int d)
 {
@@ -994,7 +998,12 @@ void mglCanvasQT::GotoFrame(int d)
        if(GetNumFig()>0 && d)  {       SetCurFig(f);   QMGL->refresh();        }
 }
 //-----------------------------------------------------------------------------
-void mglCanvasQT::Animation()  {       QMGL->animation(true);  }
+void mglCanvasQT::Animation()
+{
+       static bool start=true;
+       QMGL->animation(start);
+       start = !start;
+}
 //-----------------------------------------------------------------------------
 void mglCanvasQT::ToggleAlpha()        {       QMGL->setAlpha(!QMGL->getAlpha());      }
 //-----------------------------------------------------------------------------
@@ -1012,6 +1021,8 @@ void mglCanvasQT::Adjust()                {       QMGL->adjust(); }
 //-----------------------------------------------------------------------------
 void mglCanvasQT::Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p), const char *title, void *par, void (*reload)(void *p), bool maximize)
 {
+       static char arg=0, *parg=&arg, **argv_=&parg;
+       static int argc_=0;
        SetDrawFunc(draw, par, reload);
        if(Wnd)
        {
@@ -1024,15 +1035,10 @@ void mglCanvasQT::Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p
 
        if(!qApp)
        {
-#if !defined(WIN32) && !defined(__APPLE__)
-               // try to fix possible multi-threading errors
-               // must be placed before ANY window creation
-               XInitThreads();
-#endif
-//             static char buf=0, *tmp=&buf;
-//             if(!argv)       {       argc = 1;       argv = &tmp;    }
-               if(!argv)       argc = 0;
-               QApplication *a = new QApplication(argc, argv);
+               QCoreApplication::setAttribute(Qt::AA_X11InitThreads);
+               if(!argv)       {       argc_ = 0;      argv_=&parg;    }
+               else            {       argc_ = argc;   argv_=argv;     }
+               QApplication *a = new QApplication(argc_, argv_);
                a->connect(a, SIGNAL(lastWindowClosed()), a, SLOT(quit()));
        }